gpt4 book ai didi

flutter - 是否有可能监听许多 BloC 的状态?

转载 作者:IT王子 更新时间:2023-10-29 07:16:59 25 4
gpt4 key购买 nike

在询问 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()仅当 BlocABlocBUpdated同时声明。

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/

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