Flutter 添加多个ChangeNotifierProvider时出现找不到OTPViewModel报错
Provider找不到对应实例的报错原因与解决方法
- 最高发的原因:Provider作用域被路由隔断
当前代码把MultiProvider放在了MaterialApp的home属性内部,这种写法下MultiProvider的覆盖范围仅包含GPS页面及其所有下层子组件。如果MobileOTP是通过Navigator跳转的独立路由页面,它的Widget树直接挂载在MaterialApp层级,完全不在MultiProvider的覆盖范围内,自然会抛出找不到OTPViewModel的错误。
正确的挂载方式是将MultiProvider提升到MaterialApp的外层,让全应用的所有路由都处于Provider的覆盖范围内,参考写法:Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider<GPSViewModel>(create: (_) => GPSViewModel()), ChangeNotifierProvider<OTPViewModel>(create: (_) => OTPViewModel()), ], child: MaterialApp( title: 'Flutter Demo', theme: ThemeData(primarySwatch: Colors.blue), home: GPS(), ), ); } - 常见操作失误:热重载未生效
如果是在原有Provider配置的基础上新增了OTPViewModel,之后仅执行热重载操作,Provider的注册列表不会被重新加载,就会触发找不到对应Provider的报错。这种情况直接执行热重启,重新加载整个应用即可解决。 - 无需修改的写法说明
你在initState中通过Provider.of<OTPViewModel>(context, listen: false)访问状态的逻辑本身没有问题,只要组件确实在Provider的作用域内,listen: false的配置不会触发依赖异常,不需要额外加延迟逻辑或者用Consumer包裹。
内容的提问来源于stack exchange,提问作者Ali Yar Khan
相关产品推荐
相关产品推荐

