cubit 发射后 BlocBuilder 不更新
Posted
技术标签:
【中文标题】cubit 发射后 BlocBuilder 不更新【英文标题】:BlocBuilder not updating after cubit emit 【发布时间】:2021-01-29 21:40:36 【问题描述】:更新在找到 onChange 覆盖方法后,似乎没有发出更新的状态#confused
更新 2 进一步调试显示,当更新状态尝试发出时,StreamController 似乎已关闭。
由于某种原因,我的应用程序中的 1 个 BlocBuilders 在 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 时间戳键以进行更多数据更改,但是在初始状态下,domainOptions
为 null,status
为 CoreStatus.loading,应该已经足以触发 UI 更新。
TIA
【问题讨论】:
这个问题你解决了吗?对我来说,即使我发出状态,它仍然具有旧状态。对我来说,我正在重新获取列表。第一次,它工作得很好,但是当我重新获取列表时,我发出了一个加载状态,但是在发出加载状态之后,我看到了加载状态(来自上次获取) @Pushpendra 尝试转换为有状态小部件 @ZEHINZ 对我来说,我正在覆盖状态的相等运算符,并且我发出的状态使其与旧状态相同。 嗨,你解决了这个问题吗?我有这个问题,在第二页无法更新第一页,但我从服务器获取新数据但不更新页面 这有什么更新吗?这里也一样 【参考方案1】:我还没有弄清楚为什么会发生这种情况,但我相信我们正在处理某种竞争条件。 另外,我不知道解决此问题的正确解决方案,但我发现在短时间内延迟调用 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上阅读了这个问题后得出了这个结论:Emitted state not received by CubitBuilder
【讨论】:
谢谢,但是,这并没有解决问题,而是将我带到了 onChange 覆盖,这表明状态实际上没有发射。找出原因会很有趣。以上是关于cubit 发射后 BlocBuilder 不更新的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Bloc:更新后未调用 BlocBuilder,ListView 仍显示旧数据
调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始