The*_*lis 4 flutter flutter-navigation
我必须简单的路线,FirstRoute并且SecondRoute。每个都包含一个用于导航的按钮。按FirstRoute\ 的按钮会导致第二个,反之亦然。
当我第二次尝试从 导航FirstRoute到时,出现异常(第一次尝试成功)。从消息来看“处置后无法安装MaterialPageRouteSecondRoute ”来看,我以某种方式处置了一条路线,但我无法弄清楚哪条路线以及我是如何做到的。
这是完整的错误日志:
\n\n\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1 EXCEPTION CAUGHT BY GESTURE \xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nI/flutter (26569): The following assertion was thrown while handling a gesture:\nI/flutter (26569): Cannot install a MaterialPageRoute<void> after disposing it.\nI/flutter (26569): \'package:flutter/src/widgets/routes.dart\': Failed assertion: line 175 pos 12:\nI/flutter (26569): \'!_transitionCompleter.isCompleted\'\nI/flutter (26569): Either the assertion indicates an error in the framework itself, or we should provide substantially\nI/flutter (26569): more information in this error message to help you determine and fix the underlying cause.\nI/flutter (26569): In either case, please report this assertion by filing a bug on GitHub:\nI/flutter (26569): https://github.com/flutter/flutter/issues/new?template=BUG.md\nI/flutter (26569): When the exception was thrown, this was the stack:\nI/flutter (26569): #2 TransitionRoute.install (package:flutter/src/widgets/routes.dart:175:12)\nI/flutter (26569): #3 ModalRoute.install (package:flutter/src/widgets/routes.dart:895:11)\nI/flutter (26569): #4 NavigatorState.push (package:flutter/src/widgets/navigator.dart:1742:11)\nI/flutter (26569): #5 Navigator.push (package:flutter/src/widgets/navigator.dart:1081:34)\nI/flutter (26569): #6 _createOnPressed.<anonymous closure> (package:layout_tutorial/main.dart:46:32)\nI/flutter (26569): #7 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:513:14)\nI/flutter (26569): #8 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:568:30)\nI/flutter (26569): #9 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24)\nI/flutter (26569): #10 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:246:9)\nI/flutter (26569): #11 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)\nI/flutter (26569): #12 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:436:9)\nI/flutter (26569): #13 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)\nI/flutter (26569): #14 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)\nI/flutter (26569): #15 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:214:19)\nI/flutter (26569): #16 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:192:22)\nI/flutter (26569): #17 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:149:7)\nI/flutter (26569): #18 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)\nI/flutter (26569): #19 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)\nI/flutter (26569): #23 _invoke1 (dart:ui/hooks.dart:223:10)\nI/flutter (26569): #24 _dispatchPointerDataPacket (dart:ui/hooks.dart:144:5)\nI/flutter (26569): (elided 5 frames from class _AssertionError and package dart:async)\nI/flutter (26569): Handler: onTap\nI/flutter (26569): Recognizer:\nI/flutter (26569): TapGestureRecognizer#1bc15(debugOwner: GestureDetector, state: possible, won arena, finalPosition:\nI/flutter (26569): Offset(164.3, 365.3), sent tap down)\nI/flutter (26569): \xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nRun Code Online (Sandbox Code Playgroud)\n\n这是完整的代码,以防有人想重现该错误:
\n\nimport \'package:flutter/material.dart\';\n\ntypedef void OnPressed();\n\nmain() {\n runApp(MaterialApp(\n title: \'Navigation Basics\',\n home: FirstRoute(),\n ));\n}\n\nclass FirstRoute extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return _getRouteScaffold(\'First route\', \'Go to second route\',\n _createOnPressed(context, route: SecondRoute()));\n }\n}\n\nclass SecondRoute extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return _getRouteScaffold(\n \'Second route\', \'Back to first route\', _createOnPressed(context));\n }\n}\n\nWidget _getRouteScaffold(String title, String buttonText, OnPressed function) {\n return Scaffold(\n appBar: AppBar(\n title: Text(title),\n ),\n body: Center(\n child: RaisedButton(\n child: Text(buttonText),\n onPressed: function,\n )),\n );\n}\n\nOnPressed _createOnPressed(BuildContext context, {StatelessWidget route}) {\n OnPressed function;\n if (route != null) {\n MaterialPageRoute<void> materialRoute =\n MaterialPageRoute<void>(builder: (context) => route);\n function = () => Navigator.push(context, materialRoute);\n } else {\n function = () => Navigator.pop(context);\n }\n return function;\n}\nRun Code Online (Sandbox Code Playgroud)\n
恕我直言,所有这些方法都不是最佳实践,但我确信构建它是有原因的,它的构建方式是有原因的。无论如何,我在第 16 行发现了错误:
_createOnPressed(context, route: SecondRoute()));
Run Code Online (Sandbox Code Playgroud)
您将此函数传递给按钮,该按钮将始终使用相同的 SecondRoute. MaterialPageRoute被释放后,就不能再使用。因此你每次都必须建立一条新路线。
为此,您可以简单地在另一个闭包中扭曲您的方法调用,然后该闭包将在按下时执行,并启动一个新实例。我只是调整了第 16 行来修复您的错误:
() => _createOnPressed(context, route: SecondRoute())());
Run Code Online (Sandbox Code Playgroud)
干杯:)