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

Flutter跳转到ReceiptDetailScreen提示找不到对应Provider如何解决?

错误原因

核心原因有两点:

  1. 路由参数解析错误:你从ReceiptListScreen跳转时传递的是{'id': id}格式的Map,但在ReceiptDetailScreen中直接把整个arguments对象赋值给了id变量,相当于把Map作为参数传给了findById方法,类型不匹配的异常会干扰运行时的错误提示,和Provider查找逻辑冲突。
  2. Provider注册方式不规范:你使用ChangeNotifierProvider.value来初始化全新的GreatPlaces实例,这个构造函数仅适用于复用已存在的ChangeNotifier实例,直接用来创建新实例会导致实例生命周期异常,路由切换时可能出现Provider丢失的问题。
解决方案

按以下步骤修改即可:

1. 修正Provider注册逻辑

把main.dart中GreatPlaces的注册代码改为标准的create构造写法:

// 修改前
ChangeNotifierProvider.value(value: GreatPlaces()),
// 修改后
ChangeNotifierProvider(create: (context) => GreatPlaces()),

2. 修正参数解析逻辑

修改ReceiptDetailScreen中获取id的代码,正确从路由参数中提取id值:

@override
Widget build(BuildContext context) {
  // 新增参数解析逻辑,适配传递的Map结构
  final routeArgs = ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>?;
  final id = routeArgs?['id'] as String;
  final selectedReceipt = Provider.of<GreatPlaces>(context, listen: false).findById(id);
  // 其余原有代码保持不变
}

3. 校验类导入路径

确认ReceiptListScreen和ReceiptDetailScreen中导入GreatPlaces的import语句完全一致,没有引用到错误路径下的同名类。

修改完成后重新运行项目即可正常跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:45:03