Get.to()中preventDuplicates参数的理解

2023-02-28  本文已影响0人  勇往直前888

简介

一个电商APP,商品详情页是很重要的页面。从需求情况来看,存在自己跳自己的情况。同事说只要把preventDuplicates设置为false就可以了。
这该怎么理解?

望文生义

看源码

   // var routeName = "/${page.runtimeType}";
    routeName ??= "/${page.runtimeType}";
    routeName = _cleanRouteName(routeName);
    if (preventDuplicates && routeName == currentRoute) {
      return null;
    }

toNamed方法

Future<T?>? toNamed<T>(
    String page, {
    dynamic arguments,
    int? id,
    bool preventDuplicates = true,
    Map<String, String>? parameters,
  }) {
    if (preventDuplicates && page == currentRoute) {
      return null;
    }

    if (parameters != null) {
      final uri = Uri(path: page, queryParameters: parameters);
      page = uri.toString();
    }

    return global(id).currentState?.pushNamed<T>(
          page,
          arguments: arguments,
        );
  }

路由类型

image.png

出栈(入栈)类型限定

image.png

导致的问题

有些时候,在Dialog或者BottomSheet的基础上,继续调用Get.to或者Get.toNamed进行跳转,由于PageRoute类型限制,会导致currentRoute参数会和预想的有出入。现象就是有时候会出现点击按钮,页面打不开。

解决方案

这个时候,currentRoute已经错乱,要解决页面无法打开,就应该把preventDuplicates设置为false

小结

综合考虑Get.to和Get.toNamed的情况,再出现页面无法打开的时候,将preventDuplicates设置为false是最简洁有效的解决方案。

当然,默认情况下,preventDuplicates就应该保持默认的true不动,“防抖”的功能在大多数情况下还是很有用的。

参考文章

【Flutter 问题系列第 67 篇】在 Flutter 中使用 Get 插件在 Dialog 弹窗中不能二次跳转路由问题的解决方案

Flutter 全能型选手GetX —— 路由管理

上一篇 下一篇

猜你喜欢

热点阅读