在普通颤动中,我用来将多个参数传递到其他屏幕,如下所示:
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> ,但不允许我传递模型的
我目前正在努力使用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) 在 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有用吗?
ShellRouteI\xe2\x80\x99m 尝试在 go_router 5.0 中使用嵌套导航。
如下例所示,单击产品时我可以正确导航到(嵌套)产品页面。
\n但是,如果我切换到购物车选项卡并返回到产品,我将返回到(根)产品页面而不是(嵌套)产品页面:
\n\n这就是我设置路由器的方式:
\nenum 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) 使用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() 动态嵌套路由?
这意味着如果我从作业屏幕转到客户端屏幕(该作业针对的客户),再到另一个作业屏幕(为客户完成的另一项作业)等,我如何显示作业>客户>作业?
并且包括参数,这样我就可以显示 Job 12 > SomeCompany > Job 17。
子路由是不够的,因为堆栈可以无限地重复多个相同的页面。
我用 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) 我在我的 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)
有用;
我目前正在使用showGeneralDialog来呈现一个如下所示的对话框弹出窗口:
这一切都很好,但它发生在根Navigator级别,我宁愿将所有视图作为Go Router路由,以便我可以在整个应用程序中以相同的方式控制它们的呈现。
我如何showGeneralDialog在调用路线时使用类似的功能?
GoRoute(
path: '/settings',
pageBuilder: (context, state) {
return ???;
},
),
Run Code Online (Sandbox Code Playgroud) 在 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()。