Navigator.removeRoute & Navigator.removeRouteBelow - PullRequest
0 голосов
/ 29 октября 2018

В Navigator.dart есть две функции: removeRoute и removeRouteBelow. Я не знаю, как использовать эти два метода. Это маршрут страницы: / -> A -> B -> C -> D. И я выполняю этот код на странице D:

Navigator.removeRoute (context, MaterialPageRoute (построитель: (context) => PushPageB ())); Но что-то идет не так:

══╡ 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)
══════════════════════════════════════════════════════════════════

Я не знаю, почему это произошло, и как правильно использовать эти два метода.

1 Ответ

0 голосов
/ 25 декабря 2018

MaterialPageRoute, который вы создали внутри вызова Navigator.removeRoute, не имеет связи с Navigator, потому что он еще не был передан. Поэтому у вас есть ошибка.

Для правильного использования метода removeRoute необходимо запомнить маршрут, который вы указали в Navigator.

Я использую следующий код, чтобы сохранить только один экземпляр страницы в навигаторе.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...