flutter - cubit 发射后 BlocBuilder 不更新
问题描述
更新找到 onChange 覆盖方法后,似乎没有发出更新的状态#confused
更新 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();
}
},
),
),
);
}
}
肘法:
Future<void> fetchDomainOptions() async {
final inputEither = await getDomainOptions();
return inputEither.fold(
_handleFailure,
(options) {
emit(state.copyWith(
domainOptions: options,
status: CoreStatus.loaded,
));
},
);
}
我还有一些其他小部件可以处理冻结的数据类和相同的状态键逻辑而没有任何问题,我什至尝试在其上添加 lastUpdated 时间戳键以进行更多数据更改,但在初始statedomainOptions
为 null 并且status
是 CoreStatus.loading,它应该已经足以触发 UI 更新。
TIA
解决方案
我还没有弄清楚为什么会发生这种情况,但我相信我们正在处理某种竞争条件。此外,我不知道解决该问题的正确解决方案,但我发现在短时间内延迟调用 emit() 可以防止此问题发生。
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 上阅读了这个问题后,我得出了这个结论:CubitBuilder 未收到 Emitted state
推荐阅读
- sql - 在 SQL 中的分区上进行连接?
- vb.net - 按 n 和循环拆分输出结果
- php - 在集合类型 Symfony 4 中添加实体
- ionic-framework - 使用设备的浏览器启动 Twitter,而不是在 iOS 设备上启动 Twitter 应用程序
- php - 我的插入查询只执行一次
- sql-server-2017 - 无法在 SQL Server 2017 中执行 .sql 文件中的查询
- javascript - 使用量角器的过时元素引用错误
- corda - net.corda.core.serialization.SerializationWhitelist:读取配置文件时出错
- react-native - 当 editable={false} 时 React Native TextInput 变得透明 - 如何防止这种行为?
- javascript - 分组和求和,并为每个数组 javascript 生成一个对象