Flutter底部弹窗中单选组与输入框用单个还是多个Bloc Provider更优
两种方案选型参考
两种方案没有绝对的优劣,完全取决于你Bottom Sheet内部两个组件的状态联动需求和复用需求:
方案1:Radio Group和文本输入框各配独立Bloc Provider
适用场景
- 两个组件的状态完全独立,不存在任何联动逻辑:比如
Radio Group的选中结果不影响输入框的显隐、校验规则、可编辑状态,反过来输入框的内容也不会修改Radio Group的选中项 - 这两个组件后续有单独复用的需求,比如该
Radio Group还要在其他页面单独使用
优势
- 组件解耦彻底,各自的状态逻辑完全内聚,修改其中一个的逻辑不会对另一个产生影响
- 单个
Bloc的逻辑更轻量,维护成本更低
劣势
- 如果后续新增联动需求,需要处理跨
Bloc通信,会引入额外的复杂度 - 提交
Bottom Sheet的整体数据时,需要从两个Bloc分别取数再聚合,步骤更繁琐
方案2:两个组件共用同一个Bloc Provider
适用场景
- 两个组件存在联动逻辑:比如
Radio Group选中「其他」选项时才显示输入框,或者输入框的输入内容需要关联校验Radio Group的选中项 - 这两个组件是当前
Bottom Sheet的专属业务组件,没有单独复用的需求 - 两个组件的状态需要统一收集后提交给后端
优势
- 联动逻辑可以直接在同一个
Bloc内处理,不需要额外的跨Bloc通信方案,代码更简洁 - 整体状态统一管理,提交数据时可以直接从单个
Bloc取到所有需要的参数,不需要多源聚合
劣势
- 组件和
Bloc耦合度高,两个组件无法单独拆出复用 - 如果后续
Bottom Sheet新增更多交互组件,容易把这个共用Bloc维护成逻辑臃肿的上帝类
最终建议
如果当前和可预见的迭代周期内都没有联动需求,优先选独立Bloc的方案;如果存在联动或者需要统一提交两个组件的状态,直接选共用Bloc的方案,开发和维护效率都更高。
内容的提问来源于stack exchange,提问作者Mariam Albarghouti
相关产品推荐
相关产品推荐

