我知道我的某些BLOC在整个应用程序生命周期中只会被实例化一次。 将这些BLOC类创建为单例是不好的做法还是反模式。 Singleton可以帮助您在任何地方访问BLOC,还可以确保仅实例化该类一次。
我还可以确保在另一个BLOC中使用一个BLOC并传递单例时就好像它只是“另一个”实现那样是安全的。
这样做有什么影响?
我有两个集团
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(),
);
答案 0 :(得分:1)
行为保持不变。单例与InheritedWidget的变化不大
但这会带来一些体系结构上的后果,因为您应该为BLoC使用InheritedWidget,而这些BLoC不会“在整个应用程序生命周期中仅实例化一次”。
这意味着:
另一方面,单例不可以防止InheritedWidgets犯的一些错误。
例如,当绝对可以使用单例时,就不可能使用InheritedWidgets产生循环依赖。
在代码方面,使用Singleton vs InheritedWidget也不会赢得太多收益。
Pub上有很多库可简化您的工作。包括provider:
runApp(
Provider(
value: MyBloc(),
child: MyApp(),
),
);