标签: flutter-go-router

Flutter:go_router如何将多个参数传递到其他屏幕?

在普通颤动中,我用来将多个参数传递到其他屏幕,如下所示:

    Navigator.of(context).push(MaterialPageRoute(
                                    builder: (_) => CatalogFilterPage(
                                          list: list,
                                          bloc: bloc,
                                        )))
Run Code Online (Sandbox Code Playgroud)

非常简单和容易。我可以传递 2 个所需的参数,列表和块。在 CatalogFilterPage 中使用后。

现在,在切换到 go_router 并查看文档后,我似乎找不到如何传递多个数据。即使传递单个对象似乎也不是那么好:

    onTap: () =>
              context.pushNamed('SelectedCatalogItem', extra: list[index]),
Run Code Online (Sandbox Code Playgroud)

在路由器中,我必须使用强制转换来设置正确的类型:

    builder: (context, state) => SelectedCatalogItem(
                    item: state.extra as ListItemsModel,
                  ),
Run Code Online (Sandbox Code Playgroud)

对于单个参数来说很好。但现在我不知道如何传递多个参数。我该怎么做?甚至传递参数(例如模型)作为额外的方法是正确的方法吗?

PS 我知道您可以将参数传递为context.pushNamed('CatalogFilterPage', params: ___),但params类型为 Map<String, String> ,但不允许我传递模型的

navigation routes dart flutter flutter-go-router

49
推荐指数
3
解决办法
6万
查看次数

如何在 go_router 中使用 NavigationBar?| 扑

我目前正在努力使用go_router重构我的路由代码。

我已经得到了一些简单的路由,例如/signin& /signup,但是当我尝试使路由与具有多个屏幕的 BottomNavigationBar 一起工作时,问题就出现了。我想为他们每个人都有一条单独的路线,例如/home, /events& /profile

我发现我必须以某种方式返回具有不同参数的相同小部件,以防止每当按下 BottomNavigationBarItem 时整个屏幕发生变化,而只更新 BottomNavigationBar 上方的部分(即屏幕本身)。

我想出了一个非常棘手的解决方案:

GoRoute(
  path: '/:path',
  builder: (BuildContext context, GoRouterState state) {
    final String path = state.params['path']!;

    if (path == 'signin') {
      return const SignInScreen();
    }

    if (path == 'signup') {
      return const SignUpScreen();
    }

    if (path == 'forgot-password') {
      return const ForgotPasswordScreen();
    }

    // Otherwise it has to be the ScreenWithBottomBar

    final int index = getIndexFromPath(path);

    if (index != -1) …
Run Code Online (Sandbox Code Playgroud)

routes ios dart flutter flutter-go-router

20
推荐指数
3
解决办法
2万
查看次数

Go Router 包中的 builder 和 pageBuilder 有什么区别?

在 Fluttergo_router包中,显然有两种创建新页面的方法,使用 abuilder或 a pageBuilder

GoRoute(
  name: 'Route',
  path: '/route',
  builder: (BuildContext context, GoRouterState state) =>
    const RouteView(...),
  pageBuilder: (BuildContext context, GoRouterState state) => 
    MaterialPage(
      child: const RouteView(...),
    ),
),
Run Code Online (Sandbox Code Playgroud)

但它们之间有什么区别呢?他们似乎做同样的事情,只是上面pageBuilder有一个包装纸,就这样吗?MaterialPage顺便问一下,aMaterialPage有用吗?

routes dart flutter flutter-go-router

20
推荐指数
1
解决办法
4809
查看次数

使用 ShellRoute 和 GoRouter 5.0 在选项卡之间切换时如何返回嵌套路由?

ShellRouteI\xe2\x80\x99m 尝试在 go_router 5.0 中使用嵌套导航。

\n

如下例所示,单击产品时我可以正确导航到(嵌套)产品页面。

\n

但是,如果我切换到购物车选项卡并返回到产品,我将返回到(根)产品页面而不是(嵌套)产品页面:

\n

使用 GoRouter 5.0 的 ShellRoute 示例

\n

这就是我设置路由器的方式:

\n
enum AppRoute {\n  products,\n  product,\n  cart,\n  account,\n}\n\nfinal goRouter = GoRouter(\n    initialLocation: \'/products\',\n    navigatorKey: _rootNavigatorKey,\n    debugLogDiagnostics: true,\n    routes: [\n      ShellRoute(\n        navigatorKey: _shellNavigatorKey,\n        builder: (context, state, child) {\n          return ScaffoldWithBottomNavBar(child: child);\n        },\n        routes: [\n          // Products\n          GoRoute(\n            path: \'/products\',\n            name: AppRoute.products.name,\n            redirect: (context, state) {\n              print(state.toString());\n              return null;\n            },\n            pageBuilder: (context, state) => NoTransitionPage(\n              key: state.pageKey,\n              restorationId: state.pageKey.value,\n              child: const ProductsListScreen(),\n            ),\n            routes: [\n              GoRoute(\n                path: \':id\',\n                name: …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-go-router

17
推荐指数
1
解决办法
6322
查看次数

Go Router (Flutter) - 推送完全相同的路由并刷新该路由

使用GoRouter,有没有办法用不同的参数推送完全相同的路由并使页面重新加载?我正在考虑类似 Navigator.pushReplacement 的东西

我正在使用 context.go('/my_page/?param={someID}') 推送到 MyPage (一个有状态的小部件)

对该路由的初始推送工作正常,我加载了特定 ID 的页面

我尝试使用 context.go('/my_page/?param={ differentID}') 再次推送相同的路线(替换路线并使用不同的 ID 重新加载)。我的断点击中了 GoRoute pageBuilder 中的 return 语句,并且我还在 MyPage.build 中击中了断点。在构建中设置断点时,我看到传递到此小部件的新 ID。

但是页面不会在视觉上重建(或者在 initState 中中断 - 旁注,初始化状态用于使用传入的 ID 加载几肘 - 页面作为有状态小部件可能是问题吗?)

材料页面上的维护状态为 false。此外,推动不同的路线效果也很好。

这是一个有状态小部件问题(意味着重新定位我所有的 cubit init 调用)吗?还是有不同的方式来推动同一条路线?

编辑 _____________

这个问题特定于重建相同的路线,但我正在解决的更大问题是一遍又一遍地无限钻取同一页面,同时维护导航堆栈。

我使用状态管理器来保存路线列表,并通过使用 context.go() 来完全替换当前路线来触发导航。

有没有办法在维护整个导航堆栈的同时使用 context.push() 动态嵌套路由?

dart flutter flutter-go-router

16
推荐指数
1
解决办法
1万
查看次数

Flutter go_router,如何获取当前整个页面堆栈?

这意味着如果我从作业屏幕转到客户端屏幕(该作业针对的客户),再到另一个作业屏幕(为客户完成的另一项作业)等,我如何显示作业>客户>作业?

并且包括参数,这样我就可以显示 Job 12 > SomeCompany > Job 17。

子路由是不够的,因为堆栈可以无限地重复多个相同的页面。

navigation flutter flutter-go-router

11
推荐指数
2
解决办法
6386
查看次数

go_router 和 flutter_bloc:未处理的异常:在上下文中找不到 GoRouter

我用 BlocProvider / BlocListener 包装了 MaterialApp

我收到一个错误

"Unhandled Exception: 'package:go_router/src/router.dart': Failed assertion: line 280 pos 12: 'inherited != null': No GoRouter found in context" from the Listener callback
Run Code Online (Sandbox Code Playgroud)
Widget build(BuildContext context) {
    return BlocProvider<AuthenticationBloc>(
      create: (context) => AuthenticationBloc()..add(AppStarted()),
      child: BlocListener<AuthenticationBloc, AuthenticationState>(
        listener: (context, state) {
          if (state is AuthenticationUnauthenticated) {
            context.goNamed(LoginPage.routeName);
          }
          if (state is AuthenticationAuthenticated) {
            context.goNamed(NavigationBarContainer.routeName);
          }
        },
        child: MaterialApp.router(
            title: 'Flutter Demo',
            routeInformationProvider: _router.routeInformationProvider,
            routeInformationParser: _router.routeInformationParser,
            routerDelegate: _router.routerDelegate,
            theme: ThemeData(
              primarySwatch: Colors.blue,
            )),
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

routes dart flutter flutter-bloc flutter-go-router

10
推荐指数
1
解决办法
8985
查看次数

Flutter Go Router 没有后退按钮,也没有任何可弹出的内容

我在我的 flutter 项目上使用 Go Router,我注意到后退按钮不再显示。即使我专门添加它,我也会收到以下错误:

======== 手势捕获异常======================================== ========================= 处理手势时抛出以下 GoError: There is Nothing to pop 抛出异常时,这是堆栈: #0 GoRouterDelegate.pop (package:go_router/src/delegate.dart:120:5) #1 GoRouter.pop (package:go_router/src/router.dart:284:21) #2 RecordDetailState.build。(包:random_me/screens/record/detail.dart:70:36)#3 _InkResponseState.handleTap(包:flutter/src/material/ink_well.dart:1072:21)#4 GestureRecognizer.invokeCallback(包:flutter/src) /gestures/recognizer.dart:253:24) #5 TapGestureRecognizer.handleTapUp (包:flutter/src/gestures/tap.dart:627:11) #6 BaseTapGestureRecognizer._checkUp (包:flutter/src/gestures/tap.dart :306:5) #7 BaseTapGestureRecognizer.handlePrimaryPointer (包:flutter/src/gestures/tap.dart:239:7)

  Widget build(BuildContext context) {
    AppTranslations.init(context);
    return Scaffold(
      appBar: AppBar(
          title: Text(TRANSLATION.record_detail),
          leading: IconButton(
            onPressed: () {
              GoRouter.of(context).pop();
            },
            icon: Icon(Icons.arrow_back_ios),
            //replace with our own icon data.
          )),
Run Code Online (Sandbox Code Playgroud)

编辑:如果我打电话

GoRouter.of(context).push(CategoryDetail.routeName); 
Run Code Online (Sandbox Code Playgroud)

代替

GoRouter.of(context).go(CategoryDetail.routeName);
Run Code Online (Sandbox Code Playgroud)

有用;

flutter flutter-web flutter-go-router

10
推荐指数
1
解决办法
1万
查看次数

如何使用 go_router 路由在 Flutter 中显示对话框?

我目前正在使用showGeneralDialog来呈现一个如下所示的对话框弹出窗口:

在此输入图像描述

这一切都很好,但它发生在根Navigator级别,我宁愿将所有视图作为Go Router路由,以便我可以在整个应用程序中以相同的方式控制它们的呈现。

我如何showGeneralDialog在调用路线时使用类似的功能?

GoRoute(
  path: '/settings',
  pageBuilder: (context, state) {
    return ???;
  },
),
Run Code Online (Sandbox Code Playgroud)

flutter flutter-dialog flutter-go-router

10
推荐指数
1
解决办法
5139
查看次数

如何在 flutter 上使用 go_router 将块传递到另一个屏幕

在 Flutter 上,我想将本地传递bloc到另一个屏幕。这就是我在使用默认导航器时将块传递到新路线的方式。

Navigator.of(context).push(
      MaterialPageRoute<void>(
        builder: (BuildContext context) =>  BlocProvider.value(
          value: localBloc,
          child: MyPage(),
      ),
    ));
Run Code Online (Sandbox Code Playgroud)

但现在,我正在使用该go_router包进行导航。我怎样才能将本地提供bloc给我想要使用的屏幕BlocProvider.value()

dart flutter bloc flutter-bloc flutter-go-router

9
推荐指数
2
解决办法
3816
查看次数