Flutter Navigator.popUntil 参数传递

Flutter 使用页面传参

以下是 在flutter 中页面传参的常用形式,都可以有有直接的传值参数提供。

  • Navigator.push #跳转到指定页面 压栈路由表
  • Navigator.pushReplacement #关闭当前页面 跳转到指定页面压栈路由表
  • Navigator.pushAndRemoveUntil #关闭所有页面,清空路由表 跳转到指定页面压栈路由表,那么当前页面就是 路由表的第一个(只有当前这个页面)
  • Navigator.pop #关闭当前页面 出栈路由表(移除当前路由表)

Navigator.popUntil 函数可以是我们 跳回到指定页面,并且出栈掉中间的页面,但是这个函数 并没有直接可以使用的传递参数的位置。这个经过查阅资料 找到一种方案可以 跨多个页面传递参数:参考地址
Navigator.popUntil 传递参数https://medium.com/@naikraveena40/how-to-return-data-when-using-popuntil-31b62d93f4aa

第一步:

在跳转到需要接收 参数的页面的时候,跳转参数先配置下,这样可以记录在路由表中相应的字段中,否则再给这个字段(route.settings.arguments)赋值的时候 会为 null,不能进行赋值;

比如我这里是实际是是一个订单的列表:

因为订单详情中(可以有多个页面跳转), 多个页面 均可以对订单进行状态的修改,为了解决频繁刷新的不友好, 再返回在订单列表中如果对订单状态进行了更改 则更新对应的状态,

这里对跳转到订单页面的函数做参数的改造:

AppNavigator 为了方便自己封装的路由方法;功能类似于 Navigator.push

复制代码
# AppNavigator 为了方便自己封装的路由方法;功能类似于 Navigator.push

# PageOrderList 订单列表本身不需要传递参数

///之前的  不用传递参数
AppNavigator().navigateTo(const PageOrderList());


///现在为了拿到 Navigator.popUntil 返回来的参数,这里要传递个 数据
AppNavigator().navigateTo(const PageOrderList(), arguments: {
  'result': {},
});
第二步:

然后我们再 需要接收参数的页面(我这里就是这个订单列表)

复制代码
///跳转到退货退款页面  应为这个页面还会跳转到填写订单物流页面,提交更改,
Map? map = await AppNavigator().navigateTo(
  PageDrawbackDetail(
    orderInfo: _datum,
  ),
);

///普通 Navigator.pop 返回当前页面 的接收返回参数的方式
if (map != null && map.isNotEmpty) {
  setState(() {
    _datum = map;
  });
}


///使用 Navigator.popUntil 返回当前页面 的接收返回参数的方式
if (ModalRoute.of(context)?.settings.arguments != null) {
  final arguments =
      ModalRoute.of(context)?.settings.arguments as Map;
  final result = arguments['result'];
  print('填写快递信息 result $result');
  if (result != null) {
    setState(() {
      _datum = result;
    });
  }
}
第三步:
复制代码
Navigator.popUntil 函数的处理,就是对路由表中的字段进行赋值,因为这个 route.settings.arguments 字段默认是一个null(不提前赋值是没办法 复制的应为是一个null),并且是个 final类型,所有只能通过 引用类型的方式给他赋值,
复制代码
navigateBackTo(BuildContext context, String pageName, {Object? arguments}) {
  Navigator.popUntil(context, (route) {
    if (route.settings.name == pageName) {
      if (arguments != null && route.settings.arguments != null) {
        (route.settings.arguments as Map)['result'] = arguments;
      }
      return true;
    }
    return false;
  });
}

经过上面的操作你就可以顺利拿到 通过 Navigator.popUntil 返回页面的参数

复制代码
相关推荐
帅气马战的账号1 小时前
开源鸿蒙Flutter组件化开发:轻量架构与多场景适配
flutter
小飞侠在吗1 小时前
vue props
前端·javascript·vue.js
DsirNg3 小时前
页面栈溢出问题修复总结
前端·微信小程序
小徐_23333 小时前
uni-app 也能远程调试?使用 PageSpy 打开调试的新大门!
前端·微信小程序·uni-app
大怪v3 小时前
【Virtual World 03】上帝之手
前端·javascript
子春一3 小时前
Flutter 与原生平台深度集成:打通 iOS 与 Android 的最后一公里
android·flutter·ios
别叫我->学废了->lol在线等5 小时前
演示 hasattr 和 ** 解包操作符
开发语言·前端·python
霍夫曼5 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
DARLING Zero two♡5 小时前
浏览器里跑 AI 语音转写?Whisper Web + cpolar让本地服务跑遍全网
前端·人工智能·whisper
Lovely Ruby5 小时前
前端er Go-Frame 的学习笔记:实现 to-do 功能(三),用 docker 封装成镜像,并且同时启动前后端数据库服务
前端·学习·golang