【问题标题】:BuildContext in a Flutter BLoC classFlutter BLoC 类中的 BuildContext
【发布时间】: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

标签: flutter dart bloc


【解决方案1】:

您应该在创建时将您的 SomeFirebaseProvider 实例传递给 SomeWidgetBloc 构造函数。

【讨论】:

    猜你喜欢
    • 2021-09-17
    • 2020-02-18
    • 2023-02-11
    • 2021-03-19
    • 2021-03-15
    • 2020-05-06
    • 2020-08-30
    • 2018-08-12
    • 2021-09-20
    相关资源
    最近更新 更多