diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index 712192241f8..533bbdcc3e3 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -15,6 +15,7 @@ import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:stack_trace/stack_trace.dart' as stack_trace; import 'package:test_api/expect.dart' show fail; +import 'package:test_api/scaffolding.dart'; // ignore: deprecated_member_use import 'package:test_api/test_api.dart' as test_package show Timeout; // ignore: deprecated_member_use import 'package:vector_math/vector_math_64.dart'; @@ -919,6 +920,13 @@ abstract class TestWidgetsFlutterBinding extends BindingBase // So that we can assert that it remains the same after the test finishes. _beforeTestCheckIntrinsicSizes = debugCheckIntrinsicSizes; + bool shouldTearDownVerifyInvariants = false; + addTearDown(() { + if (shouldTearDownVerifyInvariants) { + _verifyTearDownInvariants(); + } + }); + runApp(Container(key: UniqueKey(), child: _preTestMessage)); // Reset the tree to a known state. await pump(); // Pretend that the first frame produced in the test body is the first frame @@ -949,6 +957,7 @@ abstract class TestWidgetsFlutterBinding extends BindingBase _verifyErrorWidgetBuilderUnset(errorWidgetBuilderBeforeTest); _verifyShouldPropagateDevicePointerEventsUnset(shouldPropagateDevicePointerEventsBeforeTest); _verifyInvariants(); + shouldTearDownVerifyInvariants = true; } assert(inTest); @@ -958,6 +967,11 @@ abstract class TestWidgetsFlutterBinding extends BindingBase late bool _beforeTestCheckIntrinsicSizes; void _verifyInvariants() { + // subclasses such as AutomatedTestWidgetsFlutterBinding overrides this + // to perform more verifications. + } + + void _verifyTearDownInvariants() { assert(debugAssertNoTransientCallbacks( 'An animation is still running even after the widget tree was disposed.' )); diff --git a/packages/flutter_test/test/bindings_test.dart b/packages/flutter_test/test/bindings_test.dart index d83abe4ae7d..d6e8e0d909b 100644 --- a/packages/flutter_test/test/bindings_test.dart +++ b/packages/flutter_test/test/bindings_test.dart @@ -12,6 +12,7 @@ library; import 'dart:async'; import 'dart:io'; +import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -102,4 +103,16 @@ void main() { }); expect(responded, true); }); + + group('should be able to reset values in either tearDown or end of function', () { + testWidgets('addTearDown should work', (WidgetTester tester) async { + timeDilation = 2; + addTearDown(() => timeDilation = 1); + }); + + testWidgets('directly reset should work', (WidgetTester tester) async { + timeDilation = 2; + timeDilation = 1; + }); + }); }