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

Store在Navigator.pop(ctx.context, null)方式返回上个页面时无法自动调用visitor更新页面State #603

Open rainwolfchen opened 4 years ago

rainwolfchen commented 4 years ago

Widget createApp() { final AbstractRoutes routes = PageRoutes( pages: <String, Page<Object, dynamic>>{ /// 注册Login登录页面 "login_page": LoginPage(),

  /// 注册Main后台主界面页面
  "main_page": MainPage(),
},
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.themeColorConfig.themeName != appState.themeColorConfig.themeName) {
            if (pagestate is Cloneable) {
              final Object copy = pagestate.clone();
              final GlobalBaseState newState = copy;
              newState.themeColorConfig = appState.themeColorConfig;
              return newState;
            }
          }
          return pagestate;
        });
  }
},

); ..... }

参考官方Example做的全局Store保存主题样式的项目,通过 Navigator.of(ctx.context).pushNamed('xxxxx_page', arguments: null); 方式进入页面时能够自动刷新到最新的主题颜色,但是通过pop返回上一页时,好像visitor没能得到自动运行,Store的主题颜色第二次之后的更新没能自动刷新到返回的上一页中 返回上一页的代码形式: Navigator.pop(ctx.context, null)

通过对主题信息的跟踪,可以观察到第一个调用Store的reducer修改Store的状态时,每个visitor的页面都被自动更新到最新的主题信息了,但是改变主题颜色按钮第二次之后的调用,Store的reducer被调用且修改了Store的状态,但是却没有自动同步各个页面的主题信息。改变主题按钮所在页面通过页面自己的reducer可以修改自己的主题状态为Store最新的状态。对应切换页面就有如下情况:

  1. 如果是通过 Navigator.of(ctx.context).pushNamed('xxxxx_page', arguments: null); 切换到上个页面,则上个页面会自动更新其主题颜色,感觉是visitor被调用了。
  2. 如果是通过 Navigator.pop(ctx.context, null); 切换回上个页面,则上个页面不会自动刷新到第二次以后的主题更换,而是保持在第一次的主题更换后的状态

就是上面说的第一次Store的reducer能自动同步到各个页面,但是第二次及后面的reducer没能自动同步到各个页面,切换页面时如果是 Navigator.of(ctx.context).pushNamed 则会同步到最新的Store状态,如果是Navigator.pop 则不会同步到最新而是保持首次修改时有效的那个Store状态

个人感觉这是一个visitor可能的Bug,或者没能对 Navigator.pop 进行自动同步,修改主题所在页面的第二次及后面不能再同步倒是可以自己reducer修改自己的主题状态,但是好像也是应该Store每次都同步更合理