From 069303d46fee7cc995c2ebcf253f7c5a87ab9533 Mon Sep 17 00:00:00 2001 From: Todd Volkert Date: Mon, 20 May 2019 09:27:39 -0700 Subject: [PATCH] Add assert that the root widget has been attached. (#32437) --- packages/flutter/lib/src/widgets/binding.dart | 6 ++++++ packages/flutter_driver/lib/src/extension/extension.dart | 2 ++ 2 files changed, 8 insertions(+) diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart index 3654918ae71..bf91401a705 100644 --- a/packages/flutter/lib/src/widgets/binding.dart +++ b/packages/flutter/lib/src/widgets/binding.dart @@ -736,6 +736,12 @@ mixin WidgetsBinding on BindingBase, SchedulerBinding, GestureBinding, RendererB ).attachToRenderTree(buildOwner, renderViewElement); } + /// Whether the [renderViewElement] has been initialized. + /// + /// This will be false until [runApp] is called (or [WidgetTester.pumpWidget] + /// is called in the context of a [TestWidgetsFlutterBinding]). + bool get isRootWidgetAttached => _renderViewElement != null; + @override Future performReassemble() { assert(() { diff --git a/packages/flutter_driver/lib/src/extension/extension.dart b/packages/flutter_driver/lib/src/extension/extension.dart index 894d6f9da8b..1e1f1b63aeb 100644 --- a/packages/flutter_driver/lib/src/extension/extension.dart +++ b/packages/flutter_driver/lib/src/extension/extension.dart @@ -175,6 +175,8 @@ class FlutterDriverExtension { /// the result into a subclass of [Result], but that's not strictly required. @visibleForTesting Future> call(Map params) async { + assert(WidgetsBinding.instance.isRootWidgetAttached, + 'No root widget is attached; have you remembered to call runApp()?'); final String commandKind = params['command']; try { final CommandHandlerCallback commandHandler = _commandHandlers[commandKind];