gpt4 book ai didi

dart - 对 Bloc 使用单例

转载 作者:IT老高 更新时间:2023-10-28 12:46:43 26 4
gpt4 key购买 nike

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

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

这样做可能会产生什么影响?

编辑

我有两个 Bloc

  1. AuthenTicationBloc - 这是一个全局性 Bloc
  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(),
);

最佳答案

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

但它会产生一些架构后果,因为您应该将 InheritedWidget 用于不“在整个应用生命周期中仅实例化一次”的 BLoC。

这意味着:

  • 您将在应用中混合使用 InheriedWidget 和 Singleton。降低一致性,因为您有两种不同的方式来创建/使用 BLoC
  • 当规范发生变化时,它会变得更难适应。将来,您很可能需要多次实例化它。这意味着您必须编辑整个应用程序

另一方面,单例不能防止 InheritedWidgets 会犯的一些错误。

例如,使用 InheritedWidgets 是不可能实现循环依赖的,而使用单例绝对是可能的。


就代码而言,使用 Singleton 与 InheritedWidget 也不会带来太多好处。

Pub 上有大量库可以让您的工作更轻松。其中provider :

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

关于dart - 对 Bloc 使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55087135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com