UPDATE 找到onChange重写方法后,似乎没有发出更新状态#confused
UPDATE 2 进一步的调试显示,当尝试发出更新的状态时,StreamController似乎已关闭。
由于某种原因,我的应用程序中的BlocBuilders中的1个在Cubit发出后拒绝重绘,并且出于我的生命,我无法弄清为什么在运行或调试时没有错误,状态数据正在更新并传递到发射。
当前,它是一个钩子小部件,但我尝试使其变为无状态,有状态,并在context.bloc上有效地调用了cubit方法。
我试图使它成为一个消费者,没有使它成为听众,甚至尝试弄乱listenWhen和buildWhen,也没有任何迹象表明为什么它没有构建。
它呈现加载状态,并在此终止。
小部件:
class LandingView extends HookWidget {
@override
Widget build(BuildContext context) {
final hasError = useState<bool>(false);
return Scaffold(
key: const Key(LANDING_VIEW_KEY),
body: BlocProvider<CoreCubit>(
create: (_) => sl<CoreCubit>()..fetchDomainOptions(),
child: BlocBuilder<CoreCubit, CoreState>(
builder: (context, state) {
switch (state.status) {
case CoreStatus.loaded:
return LandingViewLoaded();
case CoreStatus.error:
return LandingViewError();
case CoreStatus.loading:
default:
return AppIcon();
}
},
),
),
);
}
}
Cubit方法:
Future<void> fetchDomainOptions() async {
final inputEither = await getDomainOptions();
return inputEither.fold(
_handleFailure,
(options) {
emit(state.copyWith(
domainOptions: options,
status: CoreStatus.loaded,
));
},
);
}
我还有其他一些小部件可以处理冻结的数据类,并且可以处理相同的状态键逻辑而没有任何问题,我什至尝试在其上添加lastUpdated时间戳键来进行更多数据更改,但是初始状态domainOptions
为null,status
为CoreStatus.loading,应该足以触发UI更新。
TIA
答案 0 :(得分:1)
我还没有弄清楚为什么会发生这种情况,但是我相信我们在这里处理某种比赛条件。 另外,我不知道解决此问题的适当解决方案,但我发现延迟一小段时间来延迟调用generate()可以防止此问题的发生。
void load() async {
try {
emit(LoadingState());
final vats = await provider.all();
await Future<void>.delayed(const Duration(milliseconds: 50));
emit(LoadedState(vats));
} catch (e) {
print(e.toString());
emit(ErrorState());
}
}
添加await Future<void>.delayed(const Duration(milliseconds: [whatever is needed]));
,然后发出新状态。
在cubit的GitHub上阅读此问题后,我得出了这个结论:Emitted state not received by CubitBuilder