为 Bloc 使用单例
Using a singleton for Bloc
我知道我的一些 BLOC 在整个应用程序生命周期中只会被实例化一次。
将这些 BLOC classes 创建为单例是不好的做法还是反模式。
Singleton 可以帮助在任何地方访问 BLOC,还可以确保 class 仅实例化一次。
我也可以确保在另一个 BLOC 中使用一个 BLOC 并在单例中传递时是安全的,就好像它是“只是另一个”实现一样。
这样做会产生什么影响?
编辑
我有两个集团
- AuthenTicationBloc - 这是一个全球集团
- UserBloc - 应该只存在一次(单例)
AuthenTicationBloc 必须使用其中的 UserBloc。如果我将 UserBloc 设为 singleton ,那么将它用作 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(),
);
行为保持不变。单例 vs InheritedWidget 变化不大
但它对架构有一些影响,因为您应该为不是 "instantiated only once throughout the app lifecycle."
的 BLoC 使用 InheritedWidget
这意味着:
- 您将在您的应用中混合使用 InheritedWidgets 和 Singletons。降低一致性,因为你有两种不同的方式来 create/use 一个 BLoC
- 当规格发生变化时,适应变得更加困难。很有可能以后你可能要多次实例化它。这意味着您必须编辑整个应用程序
另一方面,单例不能防止 InheritedWidgets 会犯的一些错误。
例如,使用 InheritedWidgets 不可能有循环依赖,而使用单例绝对有可能。
就代码而言,使用 Singleton 与 InheritedWidget 也不会赢得太多。
Pub 上有很多库可以让您的工作更轻松。包括provider:
runApp(
Provider(
value: MyBloc(),
child: MyApp(),
),
);
我知道我的一些 BLOC 在整个应用程序生命周期中只会被实例化一次。 将这些 BLOC classes 创建为单例是不好的做法还是反模式。 Singleton 可以帮助在任何地方访问 BLOC,还可以确保 class 仅实例化一次。
我也可以确保在另一个 BLOC 中使用一个 BLOC 并在单例中传递时是安全的,就好像它是“只是另一个”实现一样。
这样做会产生什么影响?
编辑
我有两个集团
- AuthenTicationBloc - 这是一个全球集团
- UserBloc - 应该只存在一次(单例)
AuthenTicationBloc 必须使用其中的 UserBloc。如果我将 UserBloc 设为 singleton ,那么将它用作 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(),
);
行为保持不变。单例 vs InheritedWidget 变化不大
但它对架构有一些影响,因为您应该为不是 "instantiated only once throughout the app lifecycle."
的 BLoC 使用 InheritedWidget这意味着:
- 您将在您的应用中混合使用 InheritedWidgets 和 Singletons。降低一致性,因为你有两种不同的方式来 create/use 一个 BLoC
- 当规格发生变化时,适应变得更加困难。很有可能以后你可能要多次实例化它。这意味着您必须编辑整个应用程序
另一方面,单例不能防止 InheritedWidgets 会犯的一些错误。
例如,使用 InheritedWidgets 不可能有循环依赖,而使用单例绝对有可能。
就代码而言,使用 Singleton 与 InheritedWidget 也不会赢得太多。
Pub 上有很多库可以让您的工作更轻松。包括provider:
runApp(
Provider(
value: MyBloc(),
child: MyApp(),
),
);