Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

与Navigator2.0好像不兼容 #69

Closed
a27919478 opened this issue Jul 31, 2022 · 4 comments
Closed

与Navigator2.0好像不兼容 #69

a27919478 opened this issue Jul 31, 2022 · 4 comments
Assignees
Labels
bug Something isn't working

Comments

@a27919478
Copy link

版本信息

  • Flutter版本:2.10.5
  • flutter_smart_dialog版本:4.0.9+6

描述bug/需求

使用Navigator 2.0会报错,老版本3.x好像不会
错误信息:

I/flutter ( 6299): Main error:setState() or markNeedsBuild() called during build.
I/flutter ( 6299): This _OverlayEntryWidget widget cannot be marked as needing to build because the framework is already in the process of building widgets. A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
I/flutter ( 6299): The widget on which setState() or markNeedsBuild() was called was:
I/flutter ( 6299):   _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#38a42]
I/flutter ( 6299): The widget which was currently being built when the offending call was made was:
I/flutter ( 6299):   Builder
I/flutter ( 6299): Main stackTrace:#0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4424:11)
I/flutter ( 6299): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4439:6)
I/flutter ( 6299): #2      State.setState (package:flutter/src/widgets/framework.dart:1141:15)
I/flutter ( 6299): #3      _OverlayEntryWidgetState._markNeedsBuild (package:flutter/src/widgets/overlay.dart:213:5)
I/flutter ( 6299): #4      OverlayEntry.markNeedsBuild (package:flutter/src/widgets/overlay.dart:167:24)
I/flutter ( 6299): #5      RouteRecord._offstageDialog (package:flutter_smart_dialog/src/helper/route_record.dart:75:34)
I/flutter ( 6299): #6      RouteRecord.push (package:flutter_smart_dialog/src/helper/route_record.dart:23:5)
I/flutter ( 6299): #7      SmartNavigatorObserver.didPush (package:flutter_smart_dialog/src/helper/navigator_observer.dart:13:26)
I/flutter ( 6299): #8      _NavigatorPushObservation.notify (package:flutter/src/widgets/navigator.dart:3140:14)
I/flutter ( 6299): #9      List.forEach (dart:core-patch/growable_array.dart:433:8)
I/flutter ( 6299): #10     NavigatorState._flushObserverNotifications (package:flutter/src/widgets/navigator.dart:3966:27)
I/flutter ( 6299): #11     NavigatorState._flushHistoryUpdates (package:flutter/src/widgets/navigator.dart:3924:5)
I/flutter ( 6299): #12     NavigatorState._updatePages (package:flutter/src/widgets/navigator.dart:3788:5)
I/flutter ( 6299): #13     NavigatorState.didUpdateWidget (package:flutter/src/widgets/navigator.dart:3457:7)
I/flutter ( 6299): #14     StatefulElement.update (package:flutter/src/widgets/framework.dart:4943:57)
I/flutter ( 6299): #15     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
I/flutter ( 6299): #16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
I/flutter ( 6299): #17     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
I/flutter ( 6299): #18     StatelessElement.update (package:flutter/src/widgets/framework.dart:4834:5)
I/flutter ( 6299): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
I/flutter ( 6299): #20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
I/flutter ( 6299): #21     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
I/flutter ( 6299): #22     ProxyElement.update (package:flutter/src/widgets/framework.dart:5108:5)
I/flutter ( 6299): #23     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
I/flutter ( 6299): #24     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
I/flutter ( 6299): #25     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
I/flutter ( 6299): #26     ProxyElement.update (package:flutter/src/widgets/framework.dart:5108:5)
I/flutter ( 6299): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
I/flutter ( 6299): #28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
I/flutter ( 6299): #29     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928:11)
I/flutter ( 6299): #30     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
I/flutter ( 6299): #31     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2659:19)
I/flutter ( 6299): #32     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
I/flutter ( 6299): #33     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
I/flutter ( 6299): #34     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
I/flutter ( 6299): #35     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1081:9)
I/flutter ( 6299): #36     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:995:5)
I/flutter ( 6299): #37     _rootRun (dart:async/zone.dart:1426:13)
I/flutter ( 6299): #38     _CustomZone.run (dart:async/zone.dart:1328:19)
I/flutter ( 6299): #39     _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
I/flutter ( 6299): #40     _invoke (dart:ui/hooks.dart:151:10)
I/flutter ( 6299): #41     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
I/flutter ( 6299): #42     _drawFrame (dart:ui/hooks.dart:115:31)
I/flutter ( 6299): 

======== Exception caught by widgets library =======================================================
The following assertion was thrown building Builder:
setState() or markNeedsBuild() called during build.

This _OverlayEntryWidget widget cannot be marked as needing to build because the framework is already in the process of building widgets. A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was: _OverlayEntryWidget-[LabeledGlobalKey<_OverlayEntryWidgetState>#38a42]
  state: _OverlayEntryWidgetState#752b4
The widget which was currently being built when the offending call was made was: Builder
The relevant error-causing widget was: 
  App App:file:///Users/leo/android/cutoutphoto/lib/main.dart:72:14
When the exception was thrown, this was the stack: 
#0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4424:11)
#1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4439:6)
#2      State.setState (package:flutter/src/widgets/framework.dart:1141:15)
#3      _OverlayEntryWidgetState._markNeedsBuild (package:flutter/src/widgets/overlay.dart:213:5)
#4      OverlayEntry.markNeedsBuild (package:flutter/src/widgets/overlay.dart:167:24)
#5      RouteRecord._offstageDialog (package:flutter_smart_dialog/src/helper/route_record.dart:75:34)
#6      RouteRecord.push (package:flutter_smart_dialog/src/helper/route_record.dart:23:5)
#7      SmartNavigatorObserver.didPush (package:flutter_smart_dialog/src/helper/navigator_observer.dart:13:26)
#8      _NavigatorPushObservation.notify (package:flutter/src/widgets/navigator.dart:3140:14)
#9      List.forEach (dart:core-patch/growable_array.dart:433:8)
#10     NavigatorState._flushObserverNotifications (package:flutter/src/widgets/navigator.dart:3966:27)
#11     NavigatorState._flushHistoryUpdates (package:flutter/src/widgets/navigator.dart:3924:5)
#12     NavigatorState._updatePages (package:flutter/src/widgets/navigator.dart:3788:5)
#13     NavigatorState.didUpdateWidget (package:flutter/src/widgets/navigator.dart:3457:7)
#14     StatefulElement.update (package:flutter/src/widgets/framework.dart:4943:57)
#15     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
#16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
#17     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#18     StatelessElement.update (package:flutter/src/widgets/framework.dart:4834:5)
#19     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
#20     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
#21     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#22     ProxyElement.update (package:flutter/src/widgets/framework.dart:5108:5)
#23     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
#24     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
#25     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#26     ProxyElement.update (package:flutter/src/widgets/framework.dart:5108:5)
#27     Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)
#28     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
#29     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928:11)
#30     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#31     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2659:19)
#32     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
#33     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#34     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
#35     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1081:9)
#36     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:995:5)
#40     _invoke (dart:ui/hooks.dart:151:10)
#41     PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#42     _drawFrame (dart:ui/hooks.dart:115:31)
(elided 3 frames from dart:async)
====================================================================================================
I/flutter ( 6299): Main error:'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2845 pos 18: '!navigator._debugLocked': is not true.
I/flutter ( 6299): Main stackTrace:#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)
I/flutter ( 6299): #1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
I/flutter ( 6299): #2      _RouteEntry.handlePush.<anonymous closure> (package:flutter/src/widgets/navigator.dart:2845:18)
I/flutter ( 6299): #3      TickerFuture.whenCompleteOrCancel.thunk (package:flutter/src/scheduler/ticker.dart:407:15)
I/flutter ( 6299): #4      _rootRunUnary (dart:async/zone.dart:1434:47)
I/flutter ( 6299): #5      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
I/flutter ( 6299): <asynchronous suspension>
I/flutter ( 6299): #6      TickerFuture.whenCompleteOrCancel.thunk (package:flutter/src/scheduler/ticker.dart:406:5)
I/flutter ( 6299): <asynchronous suspension>
@xdd666t
Copy link
Member

xdd666t commented Jul 31, 2022

给下可复现问题场景的最简demo:可执行的main文件

@a27919478
Copy link
Author

a27919478 commented Aug 1, 2022

@xdd666t

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';

// 该文件可独立运行
// 右击点击 create 'router_example.dart' -> OK
void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final delegate = MyRouteDelegate(
    onGenerateRoute: (RouteSettings settings) {
      return MaterialPageRoute(
        settings: settings,
        builder: (BuildContext context) {
          return MyHomePage(title: 'Route: ${settings.name}');
        },
      );
    },
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      routeInformationParser: MyRouteParser(),
      routerDelegate: delegate,
      builder: FlutterSmartDialog.init(),
    );
  }
}

class MyRouteParser extends RouteInformationParser<String> {
  @override
  Future<String> parseRouteInformation(RouteInformation routeInformation) {
    return SynchronousFuture(routeInformation.location);
  }

  @override
  RouteInformation restoreRouteInformation(String configuration) {
    return RouteInformation(location: configuration);
  }
}

class MyRouteDelegate extends RouterDelegate<String>
    with PopNavigatorRouterDelegateMixin<String>, ChangeNotifier {
  final _stack = <String>[];

  static MyRouteDelegate of(BuildContext context) {
    final delegate = Router.of(context).routerDelegate;
    assert(delegate is MyRouteDelegate, 'Delegate type must match');
    return delegate as MyRouteDelegate;
  }

  MyRouteDelegate({
    @required this.onGenerateRoute,
  });

  final RouteFactory onGenerateRoute;

  @override
  GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

  @override
  String get currentConfiguration => _stack.isNotEmpty ? _stack.last : null;

  List<String> get stack => List.unmodifiable(_stack);

  void push(String newRoute) {
    _stack.add(newRoute);
    notifyListeners();
  }

  void remove(String routeName) {
    _stack.remove(routeName);
    notifyListeners();
  }

  @override
  Future<void> setInitialRoutePath(String configuration) {
    return setNewRoutePath(configuration);
  }

  @override
  Future<void> setNewRoutePath(String configuration) {
    _stack
      ..clear()
      ..add(configuration);
    return SynchronousFuture<void>(null);
  }

  bool _onPopPage(Route<dynamic> route, dynamic result) {
    if (_stack.isNotEmpty) {
      if (_stack.last == route.settings.name) {
        _stack.remove(route.settings.name);
        notifyListeners();
      }
    }
    return route.didPop(result);
  }

  @override
  Widget build(BuildContext context) {
    print('${describeIdentity(this)}.stack: $_stack');
    return Navigator(
      key: navigatorKey,
      onPopPage: _onPopPage,
      observers: [FlutterSmartDialog.observer],
      pages: [
        for (final name in _stack)
          MyPage(
            key: ValueKey(name),
            name: name,
          ),
      ],
    );
  }
}

class MyPage extends Page {
  const MyPage({
    LocalKey key,
    String name,
  }) : super(
          key: key,
          name: name,
        );

  Route createRoute(BuildContext context) {
    return MaterialPageRoute(
      settings: this,
      builder: (BuildContext context) {
        return MyHomePage(title: 'Route: ${name}');
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static int _counter = 0;

  void _showDialog() {
    SmartDialog.show(
      alignment: Alignment.center,
      maskColor: Colors.black38,
      builder: (_) {
        return Container(
          height: 150,
          width: 150,
          color: Colors.white,
          alignment: Alignment.center,
          child: ElevatedButton(
            child: const Text('进入下级页面'),
            onPressed: _jumpNextPage,
          ),
        );
      },
    );
  }

  void _jumpNextPage() {
    MyRouteDelegate.of(context).push('Route$_counter');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: Row(
        mainAxisSize: MainAxisSize.min,
        children: [
          FloatingActionButton(
            heroTag: 'add',
            onPressed: _showDialog,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        ],
      ),
    );
  }
}

xdd666t added a commit that referenced this issue Aug 1, 2022
@xdd666t
Copy link
Member

xdd666t commented Aug 1, 2022

  • 这个问题已经解决了,升级下版本吧
dependencies:
  flutter_smart_dialog: ^4.0.9+7

@xdd666t xdd666t added the bug Something isn't working label Aug 1, 2022
@a27919478
Copy link
Author

  • 这个问题已经解决了,升级下版本吧
dependencies:
  flutter_smart_dialog: ^4.0.9+7

感谢回答

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants