[英]Flutter go_router how to return result to previous page?
我正在尝试打开一个页面并使用 go_router package 获取返回结果。在 Navigation 1.0 中我使用这个:
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondRoute()),
);
// handle result
但我似乎无法使用 go_router 来做到这一点。 任何解决方案或解释?
您可以使用GoRouter.of(context).addListener
执行此操作。
首先你推送你的新页面然后添加一个监听器
GoRouter.of(context).push("/page/${page!.id}/edit");
GoRouter.of(context).addListener(watchRouteChange);
监听器 function 看起来像这样
watchRouteChange() {
if (!GoRouter.of(context).location.contains("/edit")) { // Here you check for some changes in your route that indicate you are no longer on the page you have pushed before
// do something
GoRouter.of(context).removeListener(watchRouteChange); // remove listener
}
}
此流程在此处的文档中进行了描述: https://gorouter.dev/user-input
通常,您必须更新数据并返回一些值作为带有参数的路由,并且屏幕本身应该管理更新/数据操作。
我不想在这里复制粘贴他们的代码,但您正在寻找的答案在上面的文档页面中。
//............ create a singleton
class UserState {
String? lastRoute;
String? returningRoute;
static UserState? _instance;
UserState._internal() {
lastRoute = returningRoute = null;
setLastRoute(String state) {
returningRoute = lastRoute;
lastRoute = state;
}
//............ update states in GoRouter redirect
return GoRouter(
redirect: (GoRouterState state) {
// update or stores your last Route
UserState.instance.setLastRoute(state.location);
return null;
},
//............
)
// use the States Methods Widget
IconButton(
icon: const Icon(Icons.arrow_back_ios),
onPressed: () =>
UserState.instance.returningRoute != null &&
GoRouter.of(context).location !=
locator.get<UserState>().returningRoute
? context.go(locator.get<UserState().returningRoute!)
: context.go('/home}')),
)
您可以在推送新屏幕时通过将 function 放入额外的 object 来使用回调。
示例 Screen A -push-> Screen B ->pop with result -> Screen A (get results)
typedef AddNewEventResult = void Function(Result result);
GoRoute(
path: kScreenB,
builder: (BuildContext context, GoRouterState state) => ScreenB(addNewEventResultstate.extra! as AddNewEventResult),
)
Navigator.of(context).pop();
widget.addNewEventResult(true, Result());
目前没有办法使用go_router
来实现这一点。 您可以使用go_router_flow
,它与go_router
完全一样,具有这个 pop with value 功能。
final bool? result = await context.push<bool>('/page2');
WidgetsBinding.instance.addPostFrameCallback((_) {
if(result){
print('Page returned $result');
}
});
完成下一个屏幕后,只需使用Navigator.pop(context,true);
true
是您想要发送到上一个屏幕的内容。 您可以发送我只是使用 true 的任何内容以供参考。 这将允许您的result
变量获取数据并执行任何操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.