Flutter Redux问题

Redux是一种应用程序开发范例,可通过应用程序建立单向信息流。 这个约束带有某些优点和缺点–我将由Redux的创建者之一来解释这些约束。

Redux.dart是Dart中Redux范例的实现,由于Flutter正在吞噬整个世界,它可能会引起很多关注。 我已经开始在Flutter上下文中使用Redux.dart了,我发现很难以模块化的方式使用它。 我很想听听你们中是否有类似的问题。

强类型问题

我遇到的问题也与Redux.dart的卖点之一相同: 强类型应用状态 。 例如,每个Reducer本质上都需要以下签名:

  (AppState prevState,操作)=> AppState 

这意味着每个Reducer都需要有这样的一行:

 返回新的AppState(subsection1,subsection2,subsection3,...) 

每个Reducer都需要了解应用程序的每个其他(无关)部分所使用的状态的字面类型,以及如何创建它们。

该库有一个示例,显示了解决此问题的一种方法。 提出的解决方案是为状态中的每个子树创建一个Reducer。 例如:

 返回新的AppState( 
  subsection1:doSubsection1Reducer(prevState,action), 
  subsection2:doSubsection2Reducer(prevState,action), 
  subsection3:doSubsection3Reducer(prevState,action), 
  ); 

在这种情况下,存在一个顶级Reducer,该顶级Reducer将每个子部分委派给较低级别​​的Reducer,从理论上讲,进一步将其委派给更低级别的Reducer。

但是,这种委派解决方案只是一个半途而废的灾难。 当您需要跨应用程序状态的多个分支运行Reducer时,该怎么办? 您可能会说“好吧,不要那样做。”但这是现实世界,最终会出现这种情况。 在这种情况下,您必须完全违反您的Reducer组合才能跨多个分支入侵一个Reducer。 如果您认为这不正确,请确保在评论中纠正我。

同样,也没有办法使用这种自上而下的Reducer委托来构建可插入应用程序。 该Reducer组件要求您的应用程序中的单个位置了解系统中的每个Reducer,并手动将这些Reducer组合在一起。 您可能会满意,但我更喜欢一种允许我的应用程序模块彼此分离的体系结构,并且我想要一个核心Redux Store,它不了解我的应用程序中的每个模块。 但是我们似乎无法使用Redux.dart做到这一点。

有什么解决方案?

我不知道答案是什么。 我希望你们中的一些人会根据自己的经验和思想提出意见 。 但是越来越多的我倾向于创建Redux实现,该实现有意避免使用强类型的数据结构 。 我看不到Redux真正给我们带来了什么强类型的应用程序状态,但这肯定使我们付出了很多。 例如,以下是使用JavaScript中的Reducer更新应用程序状态的方法:

  return Object.assign({},state,{ 
  visibleFilter:action.filter 
  }) 

资料来源: https : //redux.js.org/basics/reducers

对于未启动的用户,此Javascript代码将采用先前的状态(称为“状态”)并更改单个属性(称为“ visibilityFilter”)。请注意,此Reducer不需要任何其他模块的状态结构的任何显式知识。 “状态”对象不过是等同于Map的标准Javascript对象,因此在复制该状态时可以统一对待所有状态。

我们为什么不在Dart中做同样的事情? 如果所有应用程序状态都由Map 表示,那么我们可以做同样的事情,对吗? 那真的要花我们什么呢? 我唯一想到的是,您需要记录状态数据结构中的内容,但这就像在每个模块中包含一些注释一样容易……

所以你怎么看? Redux.dart中的强类型数据结构是否限制了它的价值? 您是否希望基于地图的实现? 您对此有什么想法吗? 请在评论中取消。