You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter嵌套Cubit在父状态变更时未重新创建如何处理?

问题解答

该行为属于预期特性

BlocProvider的create方法默认仅会在其首次插入Widget树时执行一次,除非BlocProvider本身被完全销毁再重新插入,否则不会重复触发。再加上ListView.builder会复用已存在的列表项Widget,只要对应位置的Widget未被标记为需要重建,嵌套的BlocProvider就会保留原有实例,不会重新执行create逻辑。

实现需求的修改方案

你只需要给每个列表项对应的BlocProvider绑定与Item实例唯一对应的Key即可,当FirstCubit更新列表后,对应位置Item如果发生变化,Key的变化会触发Flutter销毁旧的BlocProvider实例,重新创建新的SecondCubit:

class ItemsWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.max,
      children: [
        BlocBuilder<FirstCubit, FirstState>(
          builder: (context, state) {
            return Expanded(
              child: ListView.builder(
                itemCount: state.items.length,
                itemBuilder: (context, index) {
                  Item item = state.items[index];
                  return BlocProvider<SecondCubit>(
                    // 新增key,优先使用Item的业务唯一标识生成,也可改用ValueKey(item.hashCode)
                    key: ValueKey(item.id),
                    create: (_) => SecondCubit(item),
                    child: ItemWidget(),
                  );
                },
              ),
            );
          },
        ),
      ],
    );
  }
}

如果你希望降低实例销毁重建的性能开销,也可以选择给SecondCubit实现自定义的Item更新方法,在外层通过BlocListener监听FirstCubit的状态变化,主动调用SecondCubit的更新方法替换内部Item实例即可。

内容的提问来源于stack exchange,提问作者Apri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:57:00