Flutter Bloc调用context.read时找不到正确Provider的原因
核心原因
你遇到的ProviderNotFoundException是因为**AppBottomNavigationBarState并没有被作为Provider注入到Flutter的上下文(Context)中**,而context.read<T>()方法只能获取那些通过Provider/BlocProvider等明确注入到上下文的对象。
详细解释
你的注入逻辑:在
main.dart里,你只通过BlocProvider注入了AppBottomNavigationBarCubit的实例,并没有单独注入AppBottomNavigationBarState:BlocProvider<AppBottomNavigationBarCubit>( create: (context) => AppBottomNavigationBarCubit(), child: MaterialApp(...), )上下文里只存在
AppBottomNavigationBarCubit的实例,不存在AppBottomNavigationBarState的Provider,所以context.read<AppBottomNavigationBarState>()自然找不到对应的对象,抛出异常。BlocBuilder的state参数来源:BlocBuilder的作用就是监听Cubit的状态变化,它内部会从上下文获取对应的Cubit实例,然后订阅其状态流,每次Cubit发射新状态时,就会把最新的AppBottomNavigationBarState传递给builder函数的state参数。这个state是BlocBuilder主动从Cubit那里拿到的,不需要单独注入到上下文,所以可以直接使用。可选的替代写法:
如果你想通过上下文获取状态,正确的方式是先拿到Cubit实例,再访问其state属性:context.read<AppBottomNavigationBarCubit>().state.selectedIndex但更推荐直接使用
BlocBuilder提供的state参数,因为它已经是当前最新的状态,代码更简洁,也避免了重复从上下文获取Cubit的操作。
总结
context.read<T>()只能获取被显式注入到上下文的对象,你的状态类并没有被注入,所以报错。BlocBuilder的state参数是Cubit当前的状态,由BlocBuilder内部从Cubit获取,无需单独注入,因此可以直接使用。
内容的提问来源于stack exchange,提问作者Ertuğrul Faruk Pişkin

