对Bloc使用单例

时间:2019-03-10 11:19:59

标签: dart flutter singleton bloc

我知道我的某些BLOC在整个应用程序生命周期中只会被实例化一次。 将这些BLOC类创建为单例是不好的做法还是反模式。 Singleton可以帮助您在任何地方访问BLOC,还可以确保仅实例化该类一次。

我还可以确保在另一个BLOC中使用一个BLOC并传递单例时就好像它只是“另一个”实现那样是安全的。

这样做有什么影响?

编辑

我有两个集团

  1. AuthenTicationBloc-这是一个全局集团
  2. UserBloc-仅应存在一次(单例)

AuthenTicationBloc必须在其中使用UserBloc。如果我将UserBloc设置为单例,则可以很容易地将其用作UserBloc()

否则,我必须按照以下方式在AuthenTicationBloc中创建UserBloc作为实例变量:

class AuthenTicationBloc {
  UserBloc _userBloc;

  AuthenTicationBloc({@required UserBloc userBloc}) : _userBloc = userBloc;


  myMethod(){
    //use the userBloc
    _userBloc.setDetails();
  }
}


runApp(
  UserBloc userBloc = UserBloc();

  Provider(
    value: AuthenTicationBloc(userBloc: userBloc),
    child: MyApp(),
  ),
);

如果我不得不在其他地方的小部件链上使用UserBloc,我必须使UserBloc也按以下方式在全球范围内提供?

UserBloc userBloc = UserBloc();

MultiProvider(
  providers: [
    Provider<AuthenTicationBloc>(
      value: AuthenTicationBloc(userBloc:userBloc),
    ),
    Provider<UserBloc>(
      value: userBloc,
    ),
  ],
  child: MyApp(),
);

1 个答案:

答案 0 :(得分:1)

行为保持不变。单例与InheritedWidget的变化不大

但这会带来一些体系结构上的后果,因为您应该为BLoC使用InheritedWidget,而这些BLoC不会“在整个应用程序生命周期中仅实例化一次”。

这意味着:

  • 您将在应用程序中混合使用InheriedWidgets和Singletons。由于您有两种创建/使用BLoC的不同方式,因此降低了一致性
  • 当规格更改时,适应变得更加困难。将来很有可能必须多次实例化它。这意味着您必须编辑整个应用程序

另一方面,单例可以防止InheritedWidgets犯的一些错误。

例如,当绝对可以使用单例时,就不可能使用InheritedWidgets产生循环依赖。


在代码方面,使用Singleton vs InheritedWidget也不会赢得太多收益。

Pub上有很多库可简化您的工作。包括provider

runApp(
  Provider(
    value: MyBloc(),
    child: MyApp(),
  ),
);