Flutter BLoC 类中的 BuildContext
Posted
技术标签:
【中文标题】Flutter BLoC 类中的 BuildContext【英文标题】:BuildContext in a Flutter BLoC class 【发布时间】:2021-03-13 08:20:42 【问题描述】:简而言之,context
是否属于 BLoC 类,如果不属于,正确的方法是什么?
我使用Provider
作为 Firebase DB 和 UI 之间的抽象层。最近,我们一直在进一步抽象以使用 BLoC 模式,这样小部件就不会直接操作 Provider
中的数据。一切进展顺利,但由于我们同时使用提供程序和 BLoC,我不确定如何正确使用 BuildContext
,因为上下文与小部件/用户界面有关,而不是业务逻辑。
这是一个例子:
class SomeWidget extends StatelessWidget
final SomeWidgetBloc bloc;
SomeWidget(Key key, this.bloc);
@override
Widget build(BuildContext context) => StreamBuilder(stream: bloc.getSomeData,
builder: (context, snapshot)
return Text(snapshot.data ?? "Empty");
class SomeWidgetBloc
BuildContext context; // should it be here? Currently, it's needed for the Provider
SomeWidgetBloc(BuildContext context);
Stream<String> get getSomeData
return Provider.of<SomeFirebaseProvider>(context).fetchSomeData();
【问题讨论】:
在 bloc 类中保留上下文确实是个坏主意 这是提供者的坏处,您需要所有内容的上下文,您的“演示者”或 bloc 不应包含您的视图的上下文。这就是为什么 git_It 是服务定位器的更好选择。 使用pub.dev/packages/injectable 是DI的最佳选择之一。不要使用普通的 get_it injectable 过于复杂和多余,只需使用普通 getit 【参考方案1】:您应该在创建时将您的 SomeFirebaseProvider
实例传递给 SomeWidgetBloc
构造函数。
【讨论】:
以上是关于Flutter BLoC 类中的 BuildContext的主要内容,如果未能解决你的问题,请参考以下文章
使用 bloc 时如何替换 Flutter 中的 transformEvents?