auto_route_library
auto_route_library copied to clipboard
Stack overflow
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; }, ), ),
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
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
The WillPopScope
s 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.
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
I am also facing the same issue.
Any updates on this?
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
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