处置后无法安装 MaterialPageRoute<void>

The*_*lis 4 flutter flutter-navigation

设置

\n\n

我必须简单的路线,FirstRoute并且SecondRoute。每个都包含一个用于导航的按钮。按FirstRoute\ 的按钮会导致第二个,反之亦然。

\n\n

例外情况

\n\n

当我第二尝试从 导航FirstRoute到时,出现异常(第一次尝试成功)。从消息来看“处置后无法安装MaterialPageRouteSecondRoute ”来看,我以某种方式处置了一条路线,但我无法弄清楚哪条路线以及我是如何做到的。

\n\n

这是完整的错误日志:

\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\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是完整的代码,以防有人想重现该错误:

\n\n
import \'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}\n
Run Code Online (Sandbox Code Playgroud)\n

Nik*_*las 5

恕我直言,所有这些方法都不是最佳实践,但我确信构建它是有原因的,它的构建方式是有原因的。无论如何,我在第 16 行发现了错误:

_createOnPressed(context, route: SecondRoute()));
Run Code Online (Sandbox Code Playgroud)

您将此函数传递给按钮,该按钮将始终使用相同 SecondRoute. MaterialPageRoute被释放后,就不能再使用。因此你每次都必须建立一条新路线。

为此,您可以简单地在另一个闭包中扭曲您的方法调用,然后该闭包将在按下时执行,并启动一个新实例。我只是调整了第 16 行来修复您的错误:

() => _createOnPressed(context, route: SecondRoute())());
Run Code Online (Sandbox Code Playgroud)

干杯:)