Skip to content

Commit ced4990

Browse files
authored
fix: TextFormField widgets were not being masked (#227)
1 parent d8e3b60 commit ced4990

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## Next
22

3+
- fix: TextFormField widgets were not being masked ([#227](https://github.com/PostHog/posthog-flutter/pull/227))
4+
35
## 5.9.0
46

57
- feat: add autocapture exceptions ([#214](https://github.com/PostHog/posthog-flutter/pull/214))

example/lib/main.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class InitialScreenState extends State<InitialScreen> {
168168
onPressed: () async {
169169
final isOptedOut =
170170
await _posthogFlutterPlugin.isOptOut();
171-
if (mounted) {
171+
if (mounted && context.mounted) {
172172
ScaffoldMessenger.of(context).showSnackBar(
173173
SnackBar(
174174
content: Text('Opted out: $isOptedOut'),
@@ -284,7 +284,7 @@ class InitialScreenState extends State<InitialScreen> {
284284
},
285285
);
286286

287-
if (mounted) {
287+
if (mounted && context.mounted) {
288288
ScaffoldMessenger.of(context).showSnackBar(
289289
const SnackBar(
290290
content: Text(

lib/src/replay/element_parsers/element_object_parser.dart

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter/rendering.dart';
3+
import 'package:posthog_flutter/posthog_flutter.dart';
34
import 'package:posthog_flutter/src/replay/element_parsers/element_data.dart';
45
import 'package:posthog_flutter/src/replay/element_parsers/element_parser.dart';
56
import 'package:posthog_flutter/src/replay/mask/posthog_mask_controller.dart';
6-
import 'package:posthog_flutter/src/replay/mask/posthog_mask_widget.dart';
77

88
class ElementObjectParser {
99
final ElementParser _elementParser = ElementParser();
@@ -30,9 +30,23 @@ class ElementObjectParser {
3030
}
3131
}
3232

33-
if (element.widget is TextField) {
34-
final textField = element.widget as TextField;
35-
if (textField.obscureText) {
33+
// Handle TextField and TextFormField masking
34+
if (element.widget is TextField || element.widget is TextFormField) {
35+
final config = Posthog().config?.sessionReplayConfig;
36+
final maskAllTexts = config?.maskAllTexts ?? true;
37+
38+
var isObscured = false;
39+
if (element.widget is TextField) {
40+
isObscured = (element.widget as TextField).obscureText;
41+
}
42+
// Note: TextFormField obscureText is handled differently in Flutter.
43+
// TextFormField creates an internal TextField, but the obscureText property
44+
// is not directly accessible on the TextFormField widget itself.
45+
// For TextFormField, we rely on the maskAllTexts configuration.
46+
47+
final shouldMask = maskAllTexts || isObscured;
48+
49+
if (shouldMask) {
3650
final elementData = _elementParser.relate(element, activeElementData);
3751

3852
if (elementData != null) {

lib/src/replay/element_parsers/element_parsers_const.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ElementParsersConst {
1414
if (config?.maskAllTexts ?? true) {
1515
registerElementParser<RenderParagraph>();
1616
registerElementParser<RenderTransform>();
17+
registerElementParser<RenderEditable>();
1718
}
1819
}
1920

0 commit comments

Comments
 (0)