Reland leak fix for EditableTextState (#133806)
Relands: https://github.com/flutter/flutter/pull/131377 Reverted in: https://github.com/flutter/flutter/pull/133804
This commit is contained in:
parent
96621ebf0f
commit
ef9befc9da
@ -2125,6 +2125,7 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
|
|||||||
late final Simulation _iosBlinkCursorSimulation = _DiscreteKeyFrameSimulation.iOSBlinkingCaret();
|
late final Simulation _iosBlinkCursorSimulation = _DiscreteKeyFrameSimulation.iOSBlinkingCaret();
|
||||||
|
|
||||||
final ValueNotifier<bool> _cursorVisibilityNotifier = ValueNotifier<bool>(true);
|
final ValueNotifier<bool> _cursorVisibilityNotifier = ValueNotifier<bool>(true);
|
||||||
|
final ValueNotifier<bool> _debugCursorNotifier = ValueNotifier<bool>(true);
|
||||||
final GlobalKey _editableKey = GlobalKey();
|
final GlobalKey _editableKey = GlobalKey();
|
||||||
|
|
||||||
/// Detects whether the clipboard can paste.
|
/// Detects whether the clipboard can paste.
|
||||||
@ -2802,6 +2803,8 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
|
|||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
|
|
||||||
|
_debugCursorNotifier.value = widget.showCursor;
|
||||||
|
|
||||||
_style = MediaQuery.boldTextOf(context)
|
_style = MediaQuery.boldTextOf(context)
|
||||||
? widget.style.merge(const TextStyle(fontWeight: FontWeight.bold))
|
? widget.style.merge(const TextStyle(fontWeight: FontWeight.bold))
|
||||||
: widget.style;
|
: widget.style;
|
||||||
@ -2956,6 +2959,7 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
|
|||||||
clipboardStatus.removeListener(_onChangedClipboardStatus);
|
clipboardStatus.removeListener(_onChangedClipboardStatus);
|
||||||
clipboardStatus.dispose();
|
clipboardStatus.dispose();
|
||||||
_cursorVisibilityNotifier.dispose();
|
_cursorVisibilityNotifier.dispose();
|
||||||
|
_debugCursorNotifier.dispose();
|
||||||
FocusManager.instance.removeListener(_unflagInternalFocus);
|
FocusManager.instance.removeListener(_unflagInternalFocus);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
assert(_batchEditDepth <= 0, 'unfinished batch edits: $_batchEditDepth');
|
assert(_batchEditDepth <= 0, 'unfinished batch edits: $_batchEditDepth');
|
||||||
@ -4857,7 +4861,7 @@ class EditableTextState extends State<EditableText> with AutomaticKeepAliveClien
|
|||||||
cursorColor: _cursorColor,
|
cursorColor: _cursorColor,
|
||||||
backgroundCursorColor: widget.backgroundCursorColor,
|
backgroundCursorColor: widget.backgroundCursorColor,
|
||||||
showCursor: EditableText.debugDeterministicCursor
|
showCursor: EditableText.debugDeterministicCursor
|
||||||
? ValueNotifier<bool>(widget.showCursor)
|
? _debugCursorNotifier
|
||||||
: _cursorVisibilityNotifier,
|
: _cursorVisibilityNotifier,
|
||||||
forceLine: widget.forceLine,
|
forceLine: widget.forceLine,
|
||||||
readOnly: widget.readOnly,
|
readOnly: widget.readOnly,
|
||||||
|
@ -105,20 +105,7 @@ void main() {
|
|||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
final RenderBox handle = tester.firstRenderObject<RenderBox>(find.byType(CustomPaint));
|
final RenderBox handle = tester.firstRenderObject<RenderBox>(find.byType(CustomPaint));
|
||||||
expect(handle, paints..path(color: defaultSelectionHandleColor));
|
expect(handle, paints..path(color: defaultSelectionHandleColor));
|
||||||
},
|
});
|
||||||
// TODO(polina-c): remove after fixing
|
|
||||||
// https://github.com/flutter/flutter/issues/130469
|
|
||||||
leakTrackingTestConfig: const LeakTrackingTestConfig(
|
|
||||||
notDisposedAllowList: <String, int?>{
|
|
||||||
'ValueNotifier<MagnifierInfo>': 1,
|
|
||||||
'ValueNotifier<_OverlayEntryWidgetState?>': 2,
|
|
||||||
'ValueNotifier<bool>': 2,
|
|
||||||
'_InputBorderGap': 1,
|
|
||||||
},
|
|
||||||
// TODO(polina-c): investigate notGCed, if it does not disappear after fixing notDisposed.
|
|
||||||
allowAllNotGCed: true,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgetsWithLeakTracking('Material3 - Empty textSelectionTheme will use defaults', (WidgetTester tester) async {
|
testWidgetsWithLeakTracking('Material3 - Empty textSelectionTheme will use defaults', (WidgetTester tester) async {
|
||||||
final ThemeData theme = ThemeData(useMaterial3: true);
|
final ThemeData theme = ThemeData(useMaterial3: true);
|
||||||
@ -167,18 +154,7 @@ void main() {
|
|||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
final RenderBox handle = tester.firstRenderObject<RenderBox>(find.byType(CustomPaint));
|
final RenderBox handle = tester.firstRenderObject<RenderBox>(find.byType(CustomPaint));
|
||||||
expect(handle, paints..path(color: defaultSelectionHandleColor));
|
expect(handle, paints..path(color: defaultSelectionHandleColor));
|
||||||
},
|
});
|
||||||
// TODO(polina-c): remove after fixing
|
|
||||||
// https://github.com/flutter/flutter/issues/130469
|
|
||||||
leakTrackingTestConfig: const LeakTrackingTestConfig(
|
|
||||||
notDisposedAllowList: <String, int?>{
|
|
||||||
'ValueNotifier<MagnifierInfo>': 1,
|
|
||||||
'ValueNotifier<_OverlayEntryWidgetState?>': 2,
|
|
||||||
'ValueNotifier<bool>': 2,
|
|
||||||
'_InputBorderGap': 1,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
testWidgets('ThemeData.textSelectionTheme will be used if provided', (WidgetTester tester) async {
|
testWidgets('ThemeData.textSelectionTheme will be used if provided', (WidgetTester tester) async {
|
||||||
const TextSelectionThemeData textSelectionTheme = TextSelectionThemeData(
|
const TextSelectionThemeData textSelectionTheme = TextSelectionThemeData(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user