You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里还有两处逻辑错误:

  1. getPendingVisitCount()返回的是数量,但你把它当成了列表对象使用:
    // 假设你的VisitSchedules类有一个存放待办日程的列表属性,比如pendingSchedules
    var scheduleList = Provider.of<VisitSchedules>(context).pendingSchedules;
    var scheduleCount = scheduleList.length;
    
  2. Text('Date: ${}')是空插值,需要根据你的数据结构填充字段,比如:
    Text('Date: ${scheduleList[index].date}')
    

内容的提问来源于stack exchange,提问作者Mohamad Jabaly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:09:52