【问题标题】:Flutter navigator 2.0 force new state to be createdFlutter navigator 2.0 强制创建新状态
【发布时间】:2021-01-20 11:51:33
【问题描述】:

我正在使用来自 Flutter 的 Navigator 2.0 的新页面和路由器 API

我的问题是我打开了页面 A 和 B,然后将 deepLink 调用到页面 A。所以我要做的是清除导航器中使用的 pages 列表并使用新页面 A 重新创建页面。

但此时发生的事情是,Navigator 重用了之前存在的相同页面 A,并且只更新了它的状态和属性(小部件)。

我尝试在 Page(如下)上覆盖方法 canUpdate 以告诉该页面现在应该重建它,但问题是 Page 类是不可变的,所以它抱怨我不能拥有非最终变量。

class CustomPage<T> extends Page<T> {
  final Widget child;
  bool _pageCanBeUpdated = true;

  CustomPage({@required this.child, Key key}) : super(key: key);

  @override
  Route<T> createRoute(BuildContext context) {
    return MaterialPageRoute(
      builder: (context) => child,
      settings: this,
    );
  }

  void shouldCleanPage() {
    _pageCanBeUpdated = false;
  }

  @override
  bool canUpdate(Page other) {
    return _pageCanBeUpdated && super.canUpdate(other);
  }
}

【问题讨论】:

    标签: flutter state router navigator


    【解决方案1】:

    我能够以另一种方式解决它。我没有覆盖canUpdate 方法,而是为页面创建了一个不同的键。

    在我的 RouterDelegate 中,我将“salt”变量保留为 int _salt,每当我需要清理整个页面堆栈时,我都会增加这个 salt 并将 append 添加到键中。这样,直到下一次我必须重新创建它时,它才会有所不同。

    1. 盐:int _salt = 0;
    2. 最初:[Page(ValueKey('home $_salt')), Page(ValueKey('invites $_salt'))]
    3. 清理页面:[]
    4. 加盐:_salt++
    5. 使用[Page(ValueKey('home $_salt') 重新创建页面

    它强制重新创建整个页面,而不是重用已经存在的页面。

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2021-06-22
      • 1970-01-01
      • 2018-09-23
      • 2020-10-01
      • 1970-01-01
      • 2022-07-30
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多