Flutter路由跳转后无法找到Provider<VisitSchedules>的问题求助
问题原因
你把MultiProvider放在了MaterialApp的home节点下,导致Provider的作用域仅局限于HomeScreen及其子组件。通过Navigator跳转的新页面属于MaterialApp管理的路由栈,不在MultiProvider的子树范围内,所以无法获取到VisitSchedules实例。
解决方案
方案1:全局配置Provider(推荐)
将MultiProvider作为MaterialApp的父组件,让整个应用的所有路由都能访问到Provider:
void main() { runApp( MultiProvider( providers: [ // 推荐用create方法创建实例,比value更适合初始化场景 ChangeNotifierProvider(create: (_) => VisitSchedules()) ], child: MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: HomeScreen(), ), ), ); }
注意:修改后执行hot-restart(不是hot-reload)才能生效。
方案2:路由内嵌套Provider(按需使用)
如果不需要全局共享状态,也可以在跳转路由时,将已有的Provider实例传递给新页面:
// 在触发跳转的地方修改代码 Navigator.push( context, MaterialPageRoute( builder: (context) => ChangeNotifierProvider.value( value: Provider.of<VisitSchedules>(context, listen: false), child: VisitSchedulesScreen(), ), ), );
额外代码问题修复
你的VisitSchedulesScreen里还有两处逻辑错误:
getPendingVisitCount()返回的是数量,但你把它当成了列表对象使用:// 假设你的VisitSchedules类有一个存放待办日程的列表属性,比如pendingSchedules var scheduleList = Provider.of<VisitSchedules>(context).pendingSchedules; var scheduleCount = scheduleList.length;Text('Date: ${}')是空插值,需要根据你的数据结构填充字段,比如:Text('Date: ${scheduleList[index].date}')
内容的提问来源于stack exchange,提问作者Mohamad Jabaly
相关产品推荐
相关产品推荐

