用过经典BLoC或Provider的Flutter开发者,几乎都撞上过那个让人头疼的运行时崩溃:Error: Could not find the correct Provider above this CounterView Widget。
打开新路由、弹出底部模态框、重构组件子树时最容易踩坑。你盯着BuildContext苦苦追踪类的位置,心里巴不得Dart能在编译时就揪出这个错误,最后只能再套一层provider草草了事。
![]()
核心问题出在哪里?Classic BlocProvider.of(context)和Provider.of(context)依赖Flutter的InheritedWidget元素树遍历机制。请求bloc时,Flutter沿着运行时的元素树向上查找匹配类型T的祖先节点。但当你push一个新PageRoute,Flutter会在原始BlocProvider作用域之外的另一棵子树里构建该路由。祖先节点不在那里,直接崩。
BlocSignal走了一条完全不同的路。它不绑定Flutter的元素树。虽然bloc_signals_flutter提供了BlocSignalProvider供喜欢基于树作用域的开发者使用,但这是严格可选的。而且它的实现没有导入Provider,跟它所模仿的flutter_bloc包做法截然不同。
因为BlocSignal的状态由响应式信号(reactive signals)支撑,你完全可以用编译时安全或全局可访问的模式来定位bloc。状态更新同步传播,不依赖StreamController的微任务。
这意味着把bloc或cubit声明为顶层全局final实例异常干净——跨路由、对话框、底部菜单都能直接访问,再也没有ProviderNotFound的阴影。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.