首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Navigator.removeRoute和Navigator.removeRouteBelow

Navigator.removeRoute和Navigator.removeRouteBelow
EN

Stack Overflow用户
提问于 2018-10-29 18:51:34
回答 2查看 2.5K关注 0票数 0

Navigator.dart中有两个函数: removeRoute和removeRouteBelow。我不知道如何使用这两种方法。这是页面路由:/ -> A -> B -> C -> D。我在页面D中执行以下代码:

Navigator.removeRoute(context,builder(MaterialPageRoute:(context) => PushPageB();但是出了点问题:

代码语言:javascript
运行
复制
══╡ EXCEPTION CAUGHT BY GESTURE ╞═════════════════════════════════
The following assertion was thrown while handling a gesture:
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 1832 pos 12: 'route._navigator
== this': is not true.
Either the assertion indicates an error in the framework itself, or we should provide substantially
more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new
When the exception was thrown, this was the stack:
2      NavigatorState.removeRoute (package:flutter/src/widgets/navigator.dart:1832:12)
3      Navigator.removeRoute (package:flutter/src/widgets/navigator.dart:1221:34)
4      PushPageE.build.<anonymous closure> (package:flutter_navigation/push_page_1.dart:223:29)
5      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
6      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
7      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
8      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
9      TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)
10     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)
11     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)
12     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)
13     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:143:19)
14     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
15     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
16     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
17     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
18     _invoke1 (dart:ui/hooks.dart:153:13)
19     _dispatchPointerDataPacket (dart:ui/hooks.dart:107:5)
(elided 2 frames from class _AssertionError)
Handler: onTap
Recognizer:
  TapGestureRecognizer#2a91c(debugOwner: GestureDetector, state: possible, won arena, finalPosition:
  Offset(211.1, 411.1), sent tap down)
══════════════════════════════════════════════════════════════════

我不知道为什么会发生这种情况,以及如何正确使用这两种方法。

EN

回答 2

Stack Overflow用户

发布于 2018-12-25 20:54:18

您在Navigator.removeRoute调用中创建的MaterialPageRoute没有连接到导航器,因为它还没有被推送。因此,你得到了一个错误。

为了正确使用removeRoute方法,您需要记住推送到导航器的路由。

我使用下面的代码在导航器中只保留页面的一个实例。

代码语言:javascript
运行
复制
var filterRoutes = <String, MaterialPageRoute<dynamic>>{'page1': null, 'page2': null, 'page3': null, 'page4': null};

MaterialPageRoute getNextRoute(BuildContext context, String nextPage) {
  var route;
  switch (nextPage) {
    case 'page1':
      route =  MaterialPageRoute(builder: (context) => Page1());
      break;
    case 'page2':
      route =  MaterialPageRoute(builder: (context) => Page2());
      break;
    case 'page3':
      route =  MaterialPageRoute(builder: (context) => Page3());
      break;
    case 'page4':
      route =  MaterialPageRoute(builder: (context) => Page4());
      break;
    default:
      route = MaterialPageRoute(builder: (context) => SomeOtherPage());
  }

  if (nextPage != null) {
    if (filterRoutes[nextPage] != null) {
      Navigator.removeRoute(context, filterRoutes[nextPage]);
    }
    filterRoutes[nextPage] = route;
  }
  return route;
}
票数 3
EN

Stack Overflow用户

发布于 2021-04-30 15:04:41

如果您想从设置中删除blow路由器,转到新的路由,如注销,并转到登录页面,您可以这样做:

代码语言:javascript
运行
复制
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
    LoginScreen()), (Route<dynamic> route) => false);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53043925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档