From 073126fdb342c17e26a92bcff0db18830914eae2 Mon Sep 17 00:00:00 2001 From: Jia Hao Date: Thu, 14 May 2020 00:12:03 +0800 Subject: [PATCH] Allow waitUntilFirstFrameRasterized without a root widget (#56430) --- .../flutter_driver/lib/src/common/wait.dart | 20 +++++++++++++++++++ .../test/src/real_tests/wait_test.dart | 15 ++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/packages/flutter_driver/lib/src/common/wait.dart b/packages/flutter_driver/lib/src/common/wait.dart index 2701de96f52..4d42eca1154 100644 --- a/packages/flutter_driver/lib/src/common/wait.dart +++ b/packages/flutter_driver/lib/src/common/wait.dart @@ -31,6 +31,9 @@ class WaitForCondition extends Command { @override String get kind => 'waitForCondition'; + + @override + bool get requiresRootWidgetAttached => condition.requiresRootWidgetAttached; } /// A Flutter Driver command that waits until there are no more transient callbacks in the queue. @@ -148,6 +151,20 @@ abstract class SerializableWaitCondition { 'conditionName': conditionName }; } + + /// Whether this command requires the widget tree to be initialized before + /// the command may be run. + /// + /// This defaults to true to force the application under test to call [runApp] + /// before attempting to remotely drive the application. Subclasses may + /// override this to return false if they allow invocation before the + /// application has started. + /// + /// See also: + /// + /// * [WidgetsBinding.isRootWidgetAttached], which indicates whether the + /// widget tree has been initialized. + bool get requiresRootWidgetAttached => true; } /// A condition that waits until no transient callbacks are scheduled. @@ -208,6 +225,9 @@ class FirstFrameRasterized extends SerializableWaitCondition { @override String get conditionName => 'FirstFrameRasterizedCondition'; + + @override + bool get requiresRootWidgetAttached => false; } /// A condition that waits until there are no pending platform messages. diff --git a/packages/flutter_driver/test/src/real_tests/wait_test.dart b/packages/flutter_driver/test/src/real_tests/wait_test.dart index bc98af53d91..adf99a45e8a 100644 --- a/packages/flutter_driver/test/src/real_tests/wait_test.dart +++ b/packages/flutter_driver/test/src/real_tests/wait_test.dart @@ -41,6 +41,17 @@ void main() { expect(waitForCondition.condition, equals(const NoTransientCallbacks())); expect(waitForCondition.timeout, equals(const Duration(milliseconds: 10))); }); + + test('WaitForCondition requiresRootWidget', () { + expect( + const WaitForCondition(NoTransientCallbacks()) + .requiresRootWidgetAttached, + isTrue); + expect( + const WaitForCondition(FirstFrameRasterized()) + .requiresRootWidgetAttached, + isFalse); + }); }); group('NoTransientCallbacksCondition', () { @@ -113,6 +124,10 @@ void main() { throwsA(predicate((SerializationException e) => e.message == 'Error occurred during deserializing the FirstFrameRasterizedCondition JSON string: {conditionName: Unknown}'))); }); + + test('FirstFrameRasterizedCondition requiresRootWidget', () { + expect(const FirstFrameRasterized().requiresRootWidgetAttached, isFalse); + }); }); group('CombinedCondition', () {