- bounty将在6天后过期**。回答此问题可获得+50声望奖励。Hunter Books希望引起更多人对此问题的关注:一个工作的解决方案,将修复后退,前进,和刷新按钮将赢得当之无愧的赏金!
我正在测试Flutter Web,并使用GoRouter进行导航。当我点击导航项时,一切正常,但当我点击返回时,网址正确更改,但相应的页面不显示。例如:
我的路线相当简单,例如这里有一些来自我的routes.dart文件。我使用了一个routerProvider,稍后我会在主应用程序中调用它。
final key = GlobalKey<NavigatorState>();
final routerProvider = Provider<GoRouter>((ref) {
final authState = ref.watch(authStateProvider);
return GoRouter(
navigatorKey: key,
debugLogDiagnostics: true,
initialLocation: PreLoginHome.routeLocation,
routes: [
GoRoute(
path: SplashPage.routeLocation,
name: SplashPage.routeName,
builder: (context, state) {
return const SplashPage();
},
),
GoRoute(
path: PreLoginHome.routeLocation,
name: PreLoginHome.routeName,
builder: (context, state) {
return const PreLoginHome();
},
),
class MyAppWithFirebase extends ConsumerWidget {
const MyAppWithFirebase({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final router = ref.watch(routerProvider);
return MaterialApp.router(
theme: CustomTheme.darkTheme,
routeInformationParser: router.routeInformationParser,
routerDelegate: router.routerDelegate,
routeInformationProvider: router.routeInformationProvider,
);
}
}
当点击一个导航项时,我使用提供程序从GoRouter调用go方法。我不想使用push,因为这会在应用栏中添加一个后退按钮,我不想这样做,因为这是一个Web应用。这个填充小部件位于我制作的自定义应用栏中。
Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 25, 0),
child: TextButton(
onPressed: isUserSignedIn
? () => ref.read(routerProvider).go(Dashboard.routeLocation)
: () =>
ref.read(routerProvider).go(PreLoginHome.routeLocation),
child: isUserSignedIn
? const Text('Dashboard')
: const Text('Home')),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 25, 0),
child: isUserSignedIn
? const ProblemsDropDownButton()
: TextButton(
onPressed: isUserSignedIn
? () => ref.read(routerProvider).go('/flashcard_solve')
: (() => ref.read(routerProvider).go('/about')),
child: isUserSignedIn
? const Text('Problems')
: const Text('About')),
),
``
This post有一个解释,但是他更新了它,只是说使用GoRouter。现在GoRouter是Flutter的一个官方包,他们没有以前那个很棒的文档站点。在每个页面上放置一个WillPopScope小部件会起作用吗?
如果您需要查看其他代码,请告诉我。
2条答案
按热度按时间qxgroojn1#
溶液
更改所有出现的
到
解释
go()
此按钮用于将页面替换为当前页面,因此不能使用后退按钮
推送()
这用于将页面推到导航堆栈,因此现在您可以使用后退按钮。
额外的
它在official docs中提到:
GoRouter可以使用**context. push()**将屏幕推送到Navigator的历史堆栈上,也可以通过context. pop()弹出当前屏幕。但是,命令式导航会导致浏览器历史记录出现问题。
要了解更多信息,请参阅问题#99112。
6mw9ycah2#
GoRouter导航比较:去与推
GoRouter有两种在页面之间导航的方法:
GoRouter.of(context).go()
和GoRouter.of(context).push()
,表面上看起来非常相似,但功能不同,push()方法在导航中将一个页面堆叠在另一个页面上,而go()方法直接从一个路径导航到另一个路径,而不进行任何堆叠。请看这个good tutorial