Flutter ChangeNotifierProxyProvider报update参数缺失及类型不匹配错误如何解决
问题原因
- 报错是provider包版本不兼容导致的,旧教程使用的是3.x及更早版本的provider,而你本地项目安装的是4.0及以上版本的provider,4.0版本对ProxyProvider系列接口做了不兼容更新:
- 原先支持3个入参的
create参数被拆分,现在create仅接收BuildContext单个入参,负责首次实例初始化 - 新增必填的
update参数,接收BuildContext、依赖的实例、旧实例三个入参,负责依赖更新时刷新当前实例
- 原先支持3个入参的
- 你的两个报错正好对应这个接口变更:一是没有传入必填的
update参数,二是你把本该传给update的三参数函数传给了仅接受单参数的create参数。
解决方案
两种方案可选,推荐第一种适配新版API:
方案1:适配新版provider接口
修改所有ChangeNotifierProxyProvider的代码,拆分create和update逻辑即可,以Products对应的配置为例:
ChangeNotifierProxyProvider<Auth, Products>( // create负责首次初始化,暂时传空值,后续update会自动更新 create: (ctx) => Products('', '', []), // 依赖的Auth实例更新时触发update,走你原先的逻辑 update: (ctx, auth, previousProducts) => Products( auth.token, auth.userId, previousProducts == null ? [] : previousProducts.items, ), )
同理修改Orders对应的配置:
ChangeNotifierProxyProvider<Auth, Orders>( create: (ctx) => Orders('', '', []), update: (ctx, auth, previousOrders) => Orders( auth.token, auth.userId, previousOrders == null ? [] : previousOrders.orders, ), )
修改完成后错误就会消失,逻辑和你原先的写法完全一致。
方案2:锁定provider旧版本
如果你不想改动现有代码,可以在pubspec.yaml中指定使用旧版本provider:
dependencies: flutter: sdk: flutter provider: ^3.2.0
执行flutter pub get后即可恢复正常。
内容的提问来源于stack exchange,提问作者user11874694
相关产品推荐
相关产品推荐

