- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在询问 Flutter 中的状态管理 ( Difference between ChangeNotifierProvider and ScopedModel in Flutter ) 而没有任何答案后,我决定使用 BLoC Package在我看来,这似乎是最清晰和最容易使用的。现在在我的 flutter 应用程序中,我有 BlocA、BlocB 和 BlocC,我想从 BlocC 监听 BlocA 和 BlocB 的状态变化。
所有区 block 上具有相同状态/事件的示例(更新、更新/更新):
class BlocC extends Bloc<CEvent, CState> {
final BlocA a;
final BlocB b;
StreamSubscription aSubscription;
BlocC({@required this.a, @required this.b}) {
aSubscription = a.state.listen((state) {
if (state is AUpdated) {
dispatch(UpdateC());
}
});
}
@override
CState get initialState => CUpdating();
@override
Stream<CState> mapEventToState(CEvent event) async* {
if (event is UpdateC && b.currentState is BUpdated) {
yield* CUpdated();
}
}
...
在这种情况下,当从 BlocA 状态分派(dispatch)事件时,BlocB 的状态有时不会在 _mapEventToState 方法中更新,并且我的监听器不工作。所以我认为有一种方法可以将一个 bloc 订阅到许多流中,以获得所有流的正确状态转换。
你能帮帮我吗?
最佳答案
这是预期的行为,因为您正在调度 UpdateC()
仅当 BlocA
的状态时是AUpdated
,而不是当 BlocB
的状态时是BUpdated
.
即使您调度的事件改变了 BlocA
的状态和 BlocB
同时更新,这是异步的,所以你不能保证 event is UpdateC && b.currentState is BUpdated
可以永远是真的。所以你损失了一些UpdateC
事件。
对于您的情况,您可以使用 combineLastest2 rxdart 的。并 dispatch UpdateC()
仅当 BlocA
和 BlocB
有 Updated
同时声明。
import 'package:rxdart/rxdart.dart';
class BlocC extends Bloc<CEvent, CState> {
final BlocA a;
final BlocB b;
StreamSubscription<bool> _canUpdateCSubscription;
BlocC({@required this.a, @required this.b}) {
_canUpdateCSubscription = Observable.combineLatest2(
a.state,
b.state,
(aState, bState) => aState is AUpdated && bState is BUpdated,
).listen(
(canUpdateC) {
if (canUpdateC) dispatch(UpdateC());
},
);
}
@override
void dispose() {
_canUpdateCSubscription?.cancel();
_canUpdateCSubscription = null;
super.dispose();
}
@override
CState get initialState => CUpdating();
@override
Stream<CState> mapEventToState(CEvent event) async* {
if (event is UpdateC) {
yield* CUpdated();
}
}
...
关于flutter - 是否有可能监听许多 BloC 的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57080242/
降本手段一招鲜,增效方法吃遍天; 01 互联网行业里; 降本策略千奇百怪,手段却出奇一致;增效方法五花八门,手段更是花里胡哨; 对于企业来说;
有什么方法可以使用 angularjs 中的部分进行代码分组吗? 原因 --- 我的 Controller 包含太多代码。该 Controller 包含了多个方法和大量功能的代码,降低了代码的可读性。
不幸的是,我的数据库的数据模型必须改变,所以我正在寻找最轻松的方式来迁移我的数据。 此时情况如何: create table cargo{ id serial primary key, per
在 QTextEdit 对象中,假设我想知道字符在鼠标光标下的位置。 我会写... void MyQTextEditObject::mousePressEvent(QMouseEvent* mouse
是否可以在 C++ 中返回一个 return 语句或做一些具有类似功能的事情? 例如,如果代码中有几个函数将指针作为输入,并且每个函数都检查指针是否为 nullptr,这将很方便。如果它是一个 nul
我的 PC 上有一个控制台应用程序,它是 signalR 服务器。 我有一个 html 页面,它是互联网上的 signalR 客户端。但我尝试连接服务器,但我有一个错误的请求 400 错误。如果服务器
我想将应用程序作为后台进程运行。当点击应用程序图标时,它不会显示任何 View ,只会启动后台进程。 最佳答案 对于 iOS 这是不可能的,但是对于 android,react native 有 he
我知道有(昂贵的)框架可以让你在 VS C# 中编写 android 应用程序并将其编译为 android apk。 我也知道,可以在 VS 中编写 Java 应用程序(link)。 是否有可能,甚至
我在做: can :manage, :all if user.role == 'admin' can :approve, Anuncio do |anuncio| anuncio.try(:apr
我是一名优秀的程序员,十分优秀!