繁体   English   中英

Flutter go_router 如何返回结果到上一页?

[英]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)

  1. 定义function类型放


typedef AddNewEventResult = void Function(Result result);


  1. 推 A -> B


GoRoute(
path: kScreenB,
builder: (BuildContext context, GoRouterState state) => ScreenB(addNewEventResultstate.extra! as AddNewEventResult),
)


  1. 当屏幕 B 完成后,只需从 B 弹出到 A 并附上结果 (Result)


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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM