auto_route_library icon indicating copy to clipboard operation
auto_route_library copied to clipboard

Stack overflow

Open michalgauza opened this issue 3 years ago • 6 comments

Cannot return value for second page with back button. When I'm trying to override back button with WillPopScope then I'm getting stack overflow error.

E/flutter ( 786): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Stack Overflow E/flutter ( 786): #0 _Zone.inSameErrorZone (dart:async/zone.dart:1039:3) E/flutter ( 786): #1 _rootScheduleMicrotask (dart:async/zone.dart:1414:39) E/flutter ( 786): #2 _CustomZone.scheduleMicrotask (dart:async/zone.dart:1311:19) E/flutter ( 786): #3 Future._asyncCompleteError (dart:async/future_impl.dart:605:11) E/flutter ( 786): #4 _completeOnAsyncError (dart:async-patch/async_patch.dart:272:13) E/flutter ( 786): #5 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart) E/flutter ( 786): #6 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:24:18) E/flutter ( 786): #7 ModalRoute.willPop (package:flutter/src/widgets/routes.dart:1360:25) E/flutter ( 786): #8 NavigatorState.maybePop (package:flutter/src/widgets/navigator.dart:5020:67) E/flutter ( 786): #9 StackRouter.pop (package:auto_route/src/router/controller/routing_controller.dart:606:25) E/flutter ( 786): #10 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:26:26) E/flutter ( 786): #11 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:24:18) E/flutter ( 786): #12 ModalRoute.willPop (package:flutter/src/widgets/routes.dart:1360:25) E/flutter ( 786): #13 NavigatorState.maybePop (package:flutter/src/widgets/navigator.dart:5020:67) E/flutter ( 786): #14 StackRouter.pop (package:auto_route/src/router/controller/routing_controller.dart:606:25) E/flutter ( 786): #15 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:26:26) E/flutter ( 786): #16 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:24:18) E/flutter ( 786): #17 ModalRoute.willPop (package:flutter/src/widgets/routes.dart:1360:25) E/flutter ( 786): #18 NavigatorState.maybePop (package:flutter/src/widgets/navigator.dart:5020:67) E/flutter ( 786): #19 StackRouter.pop (package:auto_route/src/router/controller/routing_controller.dart:606:25) E/flutter ( 786): ... E/flutter ( 786): ... E/flutter ( 786): #6279 NavigatorState.maybePop (package:flutter/src/widgets/navigator.dart:5020:67) E/flutter ( 786): #6280 StackRouter.pop (package:auto_route/src/router/controller/routing_controller.dart:606:25) E/flutter ( 786): #6281 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:26:26) E/flutter ( 786): #6282 ChooseDexterityPage.build.<anonymous closure> (package:cadi_flutter/app/pages/choose_dexterity/page/choose_dexterity_page.dart:24:18) E/flutter ( 786): #6283 ModalRoute.willPop (package:flutter/src/widgets/routes.dart:1360:25) E/flutter ( 786): #6284 NavigatorState.maybePop (package:flutter/src/widgets/navigator.dart:5020:67) E/flutter ( 786): #6285 StackRouter.pop (package:auto_route/src/router/controller/routing_controller.dart:606:25) E/flutter ( 786): #6286 AutoRouterDelegate.popRoute (package:auto_route/src/router/widgets/auto_router_delegate.dart:51:49) E/flutter ( 786): #6287 _RouterState._handleBackButtonDispatcherNotification (package:flutter/src/widgets/router.dart:613:8) E/flutter ( 786): #6288 _CallbackHookProvider.invokeCallback (package:flutter/src/widgets/router.dart:767:31) E/flutter ( 786): #6289 BackButtonDispatcher.invokeCallback (package:flutter/src/widgets/router.dart:851:18) E/flutter ( 786): #6290 RootBackButtonDispatcher.didPopRoute (package:flutter/src/widgets/router.dart:944:33) E/flutter ( 786): #6291 WidgetsBinding.handlePopRoute (package:flutter/src/widgets/binding.dart:637:26) E/flutter ( 786): #6292 _rootRunUnary (dart:async/zone.dart:1362:47) E/flutter ( 786): #6293 _CustomZone.runUnary (dart:async/zone.dart:1265:19) E/flutter ( 786): #6294 _FutureListener.handleValue (dart:async/future_impl.dart:155:18) E/flutter ( 786): #6295 Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:707:45) E/flutter ( 786): #6296 Future._propagateToListeners (dart:async/future_impl.dart:736:32) E/flutter ( 786): #6297 Future._completeWithValue (dart:async/future_impl.dart:542:5) E/flutter ( 786): #6298 Future._asyncCompleteWithValue.<anonymous closure> (dart:async/future_impl.dart:580:7) E/flutter ( 786): #6299 _rootRun (dart:async/zone.dart:1354:13) E/flutter ( 786): #6300 _CustomZone.run (dart:async/zone.dart:1258:19) E/flutter ( 786): #6301 _CustomZone.runGuarded (dart:async/zone.dart:1162:7) E/flutter ( 786): #6302 _Cu

Page with back button return WillPopScope( onWillPop: () async { context.router.pop(); return false; },

First page onTap: () => context.router.push( ChooseDexterityRoute( oldDexterity: dexterityValue.value, onSelectValue: (dexterity) { dexterityValue.value = dexterity; }, ), ),

michalgauza avatar Jun 21 '21 11:06 michalgauza

Same problem here. Reproducable sdk: '>=2.12.0 <3.0.0'

import 'package:auto_route/annotations.dart';
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:test_navigator_popping/main.gr.dart';

void main() {
  runApp(MyApp());
}

@MaterialAutoRouter(
  replaceInRouteName: 'Page,Route',
  routes: <AutoRoute>[
    AutoRoute(
      page: MyHomePage,
      initial: true,
    ),
    AutoRoute<String>(page: MySecondPage),
  ],
)
class $AppRouter {}

class MyApp extends StatelessWidget {
  final _appRouter = AppRouter();
  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerDelegate: _appRouter.delegate(),
      routeInformationParser: _appRouter.defaultRouteParser(),
      title: 'Flutter AutoRoute Popping Arguments',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage();

  final String title = 'Flutter AutoRoute Popping Arguments';

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

class _MyHomePageState extends State<MyHomePage> {
  String _poppedText = '';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                final poppedText =
                    await context.pushRoute<String>(MySecondRoute());
                setState(() {
                  assert(poppedText != null);
                  _poppedText = poppedText!;
                });
              },
              child: Text('Second Screen'),
            ),
            Text(_poppedText)
          ],
        ),
      ),
    );
  }
}

class MySecondPage extends StatelessWidget {
  const MySecondPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: WillPopScope(
        onWillPop: () {
          context.popRoute(DateTime.now().toIso8601String());
          return Future.value(true);
        },
        child: Center(
          child: Text('Second Screen'),
        ),
      ),
    );
  }
}

Error

E/flutter ( 8509): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: Stack Overflow
E/flutter ( 8509): #0      _CustomZone.registerCallback (dart:async/zone.dart:1275:3)
E/flutter ( 8509): #1      _CustomZone.bindCallbackGuarded (dart:async/zone.dart:1201:22)
E/flutter ( 8509): #2      _rootScheduleMicrotask (dart:async/zone.dart:1416:16)
E/flutter ( 8509): #3      _CustomZone.scheduleMicrotask (dart:async/zone.dart:1311:19)
E/flutter ( 8509): #4      Future._asyncCompleteError (dart:async/future_impl.dart:602:11)
E/flutter ( 8509): #5      _completeOnAsyncError (dart:async-patch/async_patch.dart:262:13)
E/flutter ( 8509): #6      _MySecondPageState.build.<anonymous closure> (package:test_navigator_popping/main.dart)
E/flutter ( 8509): #7      _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #8      ModalRoute.willPop
E/flutter ( 8509): #9      NavigatorState.maybePop
E/flutter ( 8509): #10     StackRouter.pop
E/flutter ( 8509): #11     AutoRouterX.popRoute
E/flutter ( 8509): #12     _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #13     _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #14     ModalRoute.willPop
E/flutter ( 8509): #15     NavigatorState.maybePop
E/flutter ( 8509): #16     StackRouter.pop
E/flutter ( 8509): #17     AutoRouterX.popRoute
E/flutter ( 8509): #18     _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #19     _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #20     ModalRoute.willPop
E/flutter ( 8509): #21     NavigatorState.maybePop
E/flutter ( 8509): ...
E/flutter ( 8509): ...
E/flutter ( 8509): #17966  NavigatorState.maybePop
E/flutter ( 8509): #17967  StackRouter.pop
E/flutter ( 8509): #17968  AutoRouterX.popRoute
E/flutter ( 8509): #17969  _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #17970  _MySecondPageState.build.<anonymous closure>
E/flutter ( 8509): #17971  ModalRoute.willPop
E/flutter ( 8509): #17972  NavigatorState.maybePop
E/flutter ( 8509): #17973  Navigator.maybePop
E/flutter ( 8509): #17974  BackButton.build.<anonymous closure>
E/flutter ( 8509): #17975  _InkResponseState._handleTap
E/flutter ( 8509): #17976  GestureRecognizer.invokeCallback
E/flutter ( 8509): #17977  TapGestureRecognizer.handleTapUp
E/flutter ( 8509): #17978  BaseTapGestureRecognizer._checkUp
E/flutter ( 8509): #17979  BaseTapGestureRecognizer.acceptGesture
E/flutter ( 8509): #17980  GestureArenaManager.sweep
E/flutter ( 8509): #17981  GestureBinding.handleEvent
E/flutter ( 8509): #17982  GestureBinding.dispatchEvent
E/flutter ( 8509): #17983  RendererBinding.dispatchEvent
E/flutter ( 8509): #17984  GestureBinding._handlePointerEventImmediately
E/flutter ( 8509): #17985  GestureBinding.handlePointerEvent
E/flutter ( 8509): #17986  GestureBinding._flushPointerEventQueue
E/flutter ( 8509): #17987  GestureBinding._handlePointerDataPacket
E/flutter ( 8509): #17988  _rootRunUnary (dart:async/zone.dart:1370:13)
E/flutter ( 8509): #17989  _CustomZone.runUnary (dart:a

goevexx avatar Jul 01 '21 08:07 goevexx

Callstack - read from bottom to top

...
StackRouter.pop (c:\flutter\.pub-cache\hosted\pub.dartlang.org\auto_route-2.2.0\lib\src\router\controller\routing_controller.dart:606)
AutoRouterX.popRoute (c:\flutter\.pub-cache\hosted\pub.dartlang.org\auto_route-2.2.0\lib\src\router\auto_router_x.dart:23)
MySecondPage.build.<anonymous closure> (c:\Users\someuser\flutter\test_navigator_popping\lib\auto_route_app.dart:82)
MySecondPage.build.<anonymous closure> (c:\Users\someuser\flutter\test_navigator_popping\lib\auto_route_app.dart:81)
ModalRoute.willPop (c:\flutter\packages\flutter\lib\src\widgets\routes.dart:1357)
NavigatorState.maybePop (c:\flutter\packages\flutter\lib\src\widgets\navigator.dart:4966)
StackRouter.pop (c:\flutter\.pub-cache\hosted\pub.dartlang.org\auto_route-2.2.0\lib\src\router\controller\routing_controller.dart:606)
AutoRouterX.popRoute (c:\flutter\.pub-cache\hosted\pub.dartlang.org\auto_route-2.2.0\lib\src\router\auto_router_x.dart:23)
MySecondPage.build.<anonymous closure> (c:\Users\someuser\flutter\test_navigator_popping\lib\auto_route_app.dart:82)
MySecondPage.build.<anonymous closure> (c:\Users\someuser\flutter\test_navigator_popping\lib\auto_route_app.dart:81)
ModalRoute.willPop (c:\flutter\packages\flutter\lib\src\widgets\routes.dart:1357)
NavigatorState.maybePop (c:\flutter\packages\flutter\lib\src\widgets\navigator.dart:4966)
Navigator.maybePop (c:\flutter\packages\flutter\lib\src\widgets\navigator.dart:2542)
BackButton.build.<anonymous closure> (c:\flutter\packages\flutter\lib\src\material\back_button.dart:106)
_InkResponseState._handleTap (c:\flutter\packages\flutter\lib\src\material\ink_well.dart:991)
GestureRecognizer.invokeCallback (c:\flutter\packages\flutter\lib\src\gestures\recognizer.dart:182)
TapGestureRecognizer.handleTapUp (c:\flutter\packages\flutter\lib\src\gestures\tap.dart:607)
BaseTapGestureRecognizer._checkUp (c:\flutter\packages\flutter\lib\src\gestures\tap.dart:296)
BaseTapGestureRecognizer.acceptGesture (c:\flutter\packages\flutter\lib\src\gestures\tap.dart:267)
GestureArenaManager.sweep (c:\flutter\packages\flutter\lib\src\gestures\arena.dart:157)

StackRouter calls maybePop, which leads into a stackoverflow

goevexx avatar Jul 01 '21 13:07 goevexx

The WillPopScopes onWillPop also runs when context.popRoute() is called and also leads into a stackoverflow when there is a context.popRoute() inside of that onWillPopScope function, which both shouldn't be the case. This is because NavigatorState.maybePop() is called in AutoRouteX, which reruns willPop, which will rerun onWillPop callbacks.

Maybe consider not using NavigatorState.maybePop() unconditionally or replace it. I'm not enough into it yet to create a solution for a pull request.

goevexx avatar Jul 01 '21 21:07 goevexx

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions

github-actions[bot] avatar Jun 27 '22 08:06 github-actions[bot]

I am also facing the same issue.

Any updates on this?

akshay-sha avatar Jun 27 '22 10:06 akshay-sha

only solution i have found is callback. Pass as argument function that will be called on action wich will set value on previous page

https://autoroute.vercel.app/basics/passing_arguments

michalgauza avatar Jun 27 '22 12:06 michalgauza

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions

github-actions[bot] avatar Aug 28 '22 08:08 github-actions[bot]