Flutter通过Bloc访问TextEditingController提示上下文无对应Cubit如何解决
错误原因
- 主因:调用
BlocProvider.of<UsernameupdateCubit>(context)使用的上下文context,不在UsernameupdateCubit的注册作用域内。你没有在当前组件的父层级通过BlocProvider注册该Cubit实例,Bloc框架无法从当前context树中检索到对应的Cubit对象。 - 附加逻辑错误:Cubit的
nameUpdate方法参数处理逻辑与调用时传入的参数不匹配:你调用方法时传入的是userUpdateController.text(String类型),但Cubit内部代码尝试调用参数的.text属性,后续即便解决了Bloc找不到的问题,也会抛出类型错误。
解决方法
- 首先完成Cubit的注册,保证调用时的context可以访问到实例:
在当前页面的父组件层级套入BlocProvider,示例代码如下:
如果你直接在当前页面内注册Cubit,需要用BlocProvider( create: (context) => UsernameupdateCubit(), child: 你当前的页面组件(), )Builder包裹子组件,避免context层级不对:BlocProvider( create: (context) => UsernameupdateCubit(), child: Builder( builder: (context) { // 在此处返回你原有页面的Widget树,此处的context可以获取到上层的Cubit return Scaffold(/* 原有页面代码 */); } ) ) - 修正Cubit的方法逻辑,适配传入的字符串参数:
class UsernameupdateCubit extends Cubit<UsernameupdateState> { UsernameupdateCubit() : super(UsernameupdateState(userUpdateName: '')); // 调整参数为String类型,直接赋值给状态即可 void nameUpdate(String newUserName) => emit(UsernameupdateState(userUpdateName: newUserName)); } - 可选优化:可以用官方更推荐的
context.read简化Bloc的调用写法:onPressed: () { context.read<UsernameupdateCubit>().nameUpdate(userUpdateController.text); }
内容的提问来源于stack exchange,提问作者user8413111
相关产品推荐
相关产品推荐

