#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
таблице нет маршрута, связанного с именем /
маршрута.