alibaba / fish-redux

An assembled flutter application framework.
https://github.com/alibaba/fish-redux
Apache License 2.0
7.33k stars 843 forks source link

对于pageView中的子页面,如何优雅的连接全局的状态? #549

Open a616781689 opened 4 years ago

a616781689 commented 4 years ago

看了fish-redux的todoList demo,发现里面连接全局状态的方法是使用visitor

visitor: (String path, Page<Object, dynamic> page) {
      /// 只有特定的范围的 Page 才需要建立和 AppStore 的连接关系
      /// 满足 Page<T> ,T 是 GlobalBaseState 的子类
      if (page.isTypeof<GlobalBaseState>()) {
        /// 建立 AppStore 驱动 PageStore 的单向数据连接
        /// 1. 参数1 AppStore
        /// 2. 参数2 当 AppStore.state 变化时, PageStore.state 该如何变化
        page.connectExtraStore<GlobalState>(GlobalStore.store,
            (Object pagestate, GlobalState appState) {
          final GlobalBaseState p = pagestate;
          if (p.themeColor != appState.themeColor) {
            if (pagestate is Cloneable) {
              final Object copy = pagestate.clone();
              final GlobalBaseState newState = copy;
              newState.themeColor = appState.themeColor;
              return newState;
            }
          }
          return pagestate;
        });
      }

但是pageview的子页面是由 AccountPage().buildPage(null)这种方式生成的,并不会触发visitor的回调。


Widget pageViewItemBuilder(BuildContext context, int index) {
  if (index == 0) {
    return AccountPage().buildPage(null);
  } else if (index == 1) {
    return TranscationPage().buildPage(null);
  } else if (index == 2) {
    return PersonPage().buildPage(null);
  }
  return Text('页面跳转错误');

}

为了解决这个问题,我在page的构造方法中连接了全局状态。


    this.connectExtraStore<GlobalState>(GlobalStore.store,
        (Object pageState, GlobalState appState) {
      debugPrint('克隆该页面');

      if (pageState is Cloneable) {
        final Object copy = pageState.clone();
        final GlobalAccountBaseState newState = copy;
        newState.totalAssets = appState.totalAssets;
        newState.netAssets = appState.netAssets;
        newState.debt = appState.debt;
        return newState;
      }
      return pageState;
    });

请问是否有更加好的解决办法

xiongjianchang commented 4 years ago

遇到同样问题

zjuwjf commented 4 years ago

目前没有。 是否是希望这种 connector 关系 可以通过构造函数进行配置?

a616781689 commented 4 years ago

目前没有。 是否是希望这种 connector 关系 可以通过构造函数进行配置?

是的,这是一个好方法

xinpiaoyuanfang commented 4 years ago

目前没有。 是否是希望这种 connector 关系 可以通过构造函数进行配置?

遇到同样的问题

SurfeeS commented 4 years ago

遇到同样问题

didiao11300 commented 4 years ago

把main里面的router弄成全局变量 使用routers.buildPage("test",null);通过routers构建widget,就可以刷新全局状态