如何通过Flutter web上的浏览器按钮和GoRouter导航返回?

hm2xizp9  于 2023-01-27  发布在  Flutter
关注(0)|答案(2)|浏览(314)
    • 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小部件会起作用吗?
如果您需要查看其他代码,请告诉我。

qxgroojn

qxgroojn1#

溶液

更改所有出现的

ref.read(routerProvider).go()

ref.read(routerProvider).push()
解释
go()

此按钮用于将页面替换为当前页面,因此不能使用后退按钮

推送()

这用于将页面推到导航堆栈,因此现在您可以使用后退按钮。
额外的
它在official docs中提到:
GoRouter可以使用**context. push()**将屏幕推送到Navigator的历史堆栈上,也可以通过context. pop()弹出当前屏幕。但是,命令式导航会导致浏览器历史记录出现问题。
要了解更多信息,请参阅问题#99112

6mw9ycah

6mw9ycah2#

GoRouter导航比较:去与推
GoRouter有两种在页面之间导航的方法:GoRouter.of(context).go()GoRouter.of(context).push(),表面上看起来非常相似,但功能不同,push()方法在导航中将一个页面堆叠在另一个页面上,而go()方法直接从一个路径导航到另一个路径,而不进行任何堆叠。
请看这个good tutorial

相关问题