Flutter BLoC:使用嵌套的 StreamBuilders 是一种不好的做法吗?

Posted

技术标签:

【中文标题】Flutter BLoC:使用嵌套的 StreamBuilders 是一种不好的做法吗?【英文标题】:Flutter BLoC: Is using nested StreamBuilders a bad practice? 【发布时间】:2019-07-17 08:40:45 【问题描述】:

是否有更好的方法将小部件公开给来自不同 BLoC 的两个或多个流?到目前为止,我一直在使用嵌套的StreamBuilder 来处理我需要收听的尽可能多的流,就像下面粘贴的代码一样。这是一个好习惯吗?

StreamBuilder(
    stream: firstBloc.stream1,
    builder: (_, AsyncSnapshot snapshot1) 
        return StreamBuilder(
            stream: secondBloc.stream2,
            builder: (_, AsyncSnapshot snapshot2) 
                return CustomWidget(snapshot1.data, snapshot2.data);
            
        )
    
)

使用像combineLatest2 这样的rxdart 运算符感觉很笨拙,因为在大多数情况下,我不希望某个集团被用来了解另一个集团中的流。

【问题讨论】:

使用ScopedModel,您可以拥有多个模型而不会出现任何问题 我很抱歉,但我不明白这将如何适应 BLoC 模式。你的意思是在这种情况下我应该使用ScopedModel 而不是 BLoC 还是你的意思是我可以以某种方式将它们两者整合在一起? 见medium.com/flutter-community/… 【参考方案1】:

您无法使用小部件进行其他操作。这是小部件系统的限制之一:事情往往会变得非常嵌套

不过有一个解决方案:Hooks,一个来自 React 的新功能,通过 flutter_hooks 移植到 Flutter(我是维护者)。

最终结果变成了这样:

final snapshot1 = useStream(firstBloc.stream1);
final snapshot2 = useStream(secondBloc.stream2);

return CustomWidget(snapshot1.data, snapshot2.data);

这与两个嵌套的StreamBuilder 完全一样,但无论是否嵌套,一切都是在同一个内部完成的。

【讨论】:

【参考方案2】:

您可以将它们放在应用顶部的 MultiBlocProvider 中。

【讨论】:

以上是关于Flutter BLoC:使用嵌套的 StreamBuilders 是一种不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

flutter bloc pattren Stream Transformer 对象导致语法错误

Flutter - 如何构建多个嵌套的 BLoC?

Flutter BLoC:使用嵌套的 StreamBuilders 是一种不好的做法吗?

如何在 Flutter 中使用 Bloc 正确设置 DropdownButton 的值?

flutter_bloc - 每个 Bloc 有多个存储库,还是只有一个?

Flutter BLoC:组合超过 9 个流