Kaynağa Gözat

Add tests for focusNode

xuty 3 yıl önce
ebeveyn
işleme
5b4446cb89

+ 7 - 0
lib/src/ui/custom_text_edit.dart

@@ -79,6 +79,13 @@ class CustomTextEditState extends State<CustomTextEdit>
     }
   }
 
+  @override
+  void dispose() {
+    widget.focusNode.removeListener(_onFocusChange);
+    _closeInputConnectionIfNeeded();
+    super.dispose();
+  }
+
   @override
   Widget build(BuildContext context) {
     return Focus(

+ 74 - 0
test/src/terminal_view_test.dart

@@ -71,4 +71,78 @@ void main() {
       expect(terminalOutput.join(), 'ls -al');
     });
   });
+
+  group('TerminalView.focusNode', () {
+    testWidgets(
+      'is not listened when terminal is disposed',
+      (WidgetTester tester) async {
+        final terminal = Terminal();
+
+        final focusNode = FocusNode();
+
+        final isActive = ValueNotifier(true);
+
+        await tester.pumpWidget(MaterialApp(
+          home: Scaffold(
+            body: ValueListenableBuilder<bool>(
+              valueListenable: isActive,
+              builder: (context, isActive, child) {
+                if (!isActive) {
+                  return Container();
+                }
+                return TerminalView(
+                  terminal,
+                  focusNode: focusNode,
+                  autofocus: true,
+                );
+              },
+            ),
+          ),
+        ));
+
+        // ignore: invalid_use_of_protected_member
+        expect(focusNode.hasListeners, isTrue);
+
+        isActive.value = false;
+        await tester.pumpAndSettle();
+
+        // ignore: invalid_use_of_protected_member
+        expect(focusNode.hasListeners, isFalse);
+      },
+    );
+
+    testWidgets(
+      'does not dispose external focus node',
+      (WidgetTester tester) async {
+        final terminal = Terminal();
+
+        final focusNode = FocusNode();
+
+        final isActive = ValueNotifier(true);
+
+        await tester.pumpWidget(MaterialApp(
+          home: Scaffold(
+            body: ValueListenableBuilder<bool>(
+              valueListenable: isActive,
+              builder: (context, isActive, child) {
+                if (!isActive) {
+                  return Container();
+                }
+                return TerminalView(
+                  terminal,
+                  focusNode: focusNode,
+                  autofocus: true,
+                );
+              },
+            ),
+          ),
+        ));
+
+        isActive.value = false;
+        await tester.pumpAndSettle();
+
+        expect(() => focusNode.addListener(() {}), returnsNormally);
+      },
+    );
+  });
 }