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
相关产品推荐
相关产品推荐

