Метод Flutter Navigator popUntil не останавливается на названном маршруте, который я хочу, и открывает весь экран

#flutter #dart #flutter-navigation #flutter-routes

Вопрос:

У меня есть этот фрагмент кода, который я хочу отобразить на всех экранах, пока он не попадет на базовый экран с именем «/».

 Navigator.of(context).popUntil(ModalRoute.withName("/"));
 

Прежде чем я вызову метод popUntil, я перешел с помощью:

 Navigator.of(context).pushNamed("/Loading");
Navigator.of(context).pushReplacementNamed("/Menu");
 

Но результат, который я получаю, заключается в том, что все экраны выскакивают, пока не появится черный экран. Что я должен изменить, чтобы остановить его на «/»?

Вот как это устроено:

главная.дротик

 class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'My App',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        debugShowCheckedModeBanner: false,
        onGenerateRoute: AppRouter().onGenerateRoute,
        initialRoute: '/',
      ),
    );
  }
}

class AppRouter {
  Route? onGenerateRoute(RouteSettings routeSettings) {
    switch (routeSettings.name) {
      case '/':
        return MaterialPageRoute(builder: (_) => const LoadingScreen());
      case '/Menu':
        return MaterialPageRoute(builder: (_) => const MenuScreen());
      case '/Loading':
        return MaterialPageRoute(builder: (_) => const LoadingScreen());
    }
  }
}


 

Ответ №1:

ModalRoute.withName Предикат используется, когда маршрут привязан к определенному имени маршрута. Поскольку вы используете onGenerateRoute (что, как правило, является последним средством) вместо routes таблицы, в вашей MaterialApp таблице нет маршрута, связанного с именем / маршрута.