felangel / flow_builder

Flutter Flows made easy! A Flutter package which simplifies navigation flows with a flexible, declarative API.
https://pub.dev/packages/flow_builder
MIT License
389 stars 63 forks source link

Error when passing a NavigatorObserver to flowbuilder if one is already registered with the enclosing `MaterialApp` #97

Closed br-follow closed 2 years ago

br-follow commented 2 years ago

Describe the bug If my MaterialApp has a NavigationObserver set:

return MaterialApp(
      navigatorKey: _navigatorKey,
      theme: AppThemeV4.theme,
      navigatorObservers: [AnalyticsService().navigatorObserver],
      builder: (context, child) {

And I try to set the same observer in my FlowBuilder widget:

return FlowBuilder<SignUpFlowState>(
                state: const SignUpFlowState(),
                onGeneratePages: onGenerateSignupFlowPages,
                onComplete: (SignUpFlowState state) {
                  context.read<SignUpCubit>().submit(state);
                },
                observers: [AnalyticsService().navigatorObserver],
              );

Then when the flowbuilder widget attempts to navigate, is throws an assertion error: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3232 pos 14: 'observer.navigator == null': is not true.

Screenshots

Screen Shot 2022-06-22 at 12 02 45 PM

Logs

======== Exception caught by widgets library =======================================================
The following assertion was thrown building _ConditionalWillPopScope:
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3232 pos 14: 'observer.navigator == null': is not true.

Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=2_bug.md

The relevant error-causing widget was: 
  FlowBuilder<SignUpFlowState> FlowBuilder:file:///Users/brapaport/development/udon/frontend/lib/pages/sign_up_flow/sign_up_flow.dart:97:22
When the exception was thrown, this was the stack: 
#2      NavigatorState.initState (package:flutter/src/widgets/navigator.dart:3232:14)
#3      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4942:57)
#4      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4781:5)
...     Normal element mounting (29 frames)
#33     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11)
...     Normal element mounting (29 frames)
#62     _InheritedProviderScopeElement.mount (package:provider/src/inherited_provider.dart:411:11)
...     Normal element mounting (7 frames)
#69     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11)
...     Normal element mounting (7 frames)
#76     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:222:11)
...     Normal element mounting (275 frames)
#351    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#352    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6350:36)
#353    Element.updateChild (package:flutter/src/widgets/framework.dart:3551:18)
#354    RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5883:32)
#355    MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6375:17)
#356    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#357    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#358    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#359    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#360    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#361    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#362    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#363    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#364    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#365    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#366    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#367    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#368    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#369    _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11)
#370    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#371    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#372    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#373    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#374    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#375    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#376    StatefulElement.update (package:flutter/src/widgets/framework.dart:5009:5)
#377    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#378    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#379    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#380    SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6222:14)
#381    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#382    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#383    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#384    ProxyElement.update (package:flutter/src/widgets/framework.dart:5154:5)
#385    Element.updateChild (package:flutter/src/widgets/framework.dart:3530:15)
#386    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4832:16)
#387    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4977:11)
#388    Element.rebuild (package:flutter/src/widgets/framework.dart:4529:5)
#389    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2659:19)
#390    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:891:21)
#391    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5)
#392    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15)
#393    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9)
#394    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5)
#398    _invoke (dart:ui/hooks.dart:151:10)
#399    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#400    _drawFrame (dart:ui/hooks.dart:115:31)
(elided 5 frames from class _AssertionError and dart:async)
====================================================================================================

Paste the output of running flutter doctor -v here.

flutter doctor -v
[✓] Flutter (Channel stable, 3.0.2, on macOS 11.6 20G165 darwin-arm, locale en-US)
    • Flutter version 3.0.2 at /Users/brapaport/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision cd41fdd495 (2 weeks ago), 2022-06-08 09:52:13 -0700
    • Engine revision f15f824b57
    • Dart version 2.17.3
    • DevTools version 2.12.2

[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    • Android SDK at /Users/brapaport/Library/Android/sdk
    • Platform android-32, build-tools 31.0.0
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • CocoaPods version 1.11.2

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2021.2)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.12+0-b1504.28-7817840)

[✓] VS Code (version 1.63.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension can be installed from:
      🔨 https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected device (3 available)
    • sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64  • Android 12 (API 31) (emulator)
    • macOS (desktop)             • macos         • darwin-arm64   • macOS 11.6 20G165 darwin-arm
    • Chrome (web)                • chrome        • web-javascript • Google Chrome 103.0.5060.53

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!
br-follow commented 2 years ago

I was able to fix this by passing a new object as the observer to flow builder. Re-using the same observer that is used elsewhere causes the issue.