Flutter安装provider ^3.1.0版本后运行出现inheritFromElement等方法缺失报错
/C:/Users/Praveen/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/provider-3.2.0/lib/src/delegate_widget.dart:194:18: Error: Superclass has no method named 'inheritFromElement'.
return super.inheritFromElement(ancestor, aspect: aspect);
^^^^^^^^^^^^^^^^^^
/C:/Users/Praveen/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/provider-3.2.0/lib/src/provider.dart:259:19: Error: The method 'inheritFromWidgetOfExactType' isn't defined for the class 'BuildContext'.
- 'BuildContext' is from 'package:flutter/src/widgets/framework.dart' ('/D:/src/flutter/packages/flutter/lib/src/widgets/framework.dart').
请尝试将名称更正为现有方法的名称,或定义一个名为inheritFromWidgetOfExactType的方法。
? context.inheritFromWidgetOfExactType(type) as InheritedProvider
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/C:/Users/Praveen/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/provider-3.2.0/lib/src/provider.dart:260:19: Error: The method 'ancestorInheritedElementForWidgetOfExactType' isn't defined for the class 'BuildContext'.- 'BuildContext' is from 'package:flutter/src/widgets/framework.dart' ('/D:/src/flutter/packages/flutter/lib/src/widgets/framework.dart').
请尝试将名称更正为现有方法的名称,或定义一个名为ancestorInheritedElementForWidgetOfExactType的方法。
: context.ancestorInheritedElementForWidgetOfExactType(type)?.widget
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FAILURE: 构建因异常失败。- 错误位置:
脚本 'D:\src\flutter\packages\flutter_tools\gradle\flutter.gradle' 第1035行- 错误原因:
执行task ':app:compileFlutterBuildDebug'失败。进程'command 'D:\src\flutter\bin\flutter.bat''执行结束,返回非零退出值1
- 解决方案尝试:
添加--stacktrace参数运行可获取堆栈跟踪,添加--info或--debug参数运行可获取更多日志输出,添加--scan参数运行可获取完整洞察信息。
构建在23秒后失败
异常:Gradle任务assembleDebug执行失败,退出码为1
- 该错误为低版本provider与高版本Flutter SDK不兼容导致:provider 3.x版本使用的
inheritFromWidgetOfExactType、ancestorInheritedElementForWidgetOfExactType、inheritFromElement方法在Flutter 1.13及以上版本中已被正式移除,替换为新的InheritedWidget相关API。 - 你在pubspec中声明的是provider 3.1.0版本,但实际拉取到的兼容最高小版本为3.2.0,两个版本都存在相同的适配问题。
方案1(推荐):升级provider版本
直接升级provider到4.0及以上的兼容版本,在pubspec.yaml中修改依赖配置:
dependencies: flutter: sdk: flutter # 替换原有3.x版本声明,推荐使用4.3.3及以上稳定兼容版本 provider: ^4.3.3
修改完成后执行命令flutter pub get重新拉取依赖即可解决问题。
方案2(不推荐):降级Flutter SDK
如果项目必须使用3.x版本的provider,可将Flutter SDK降级到1.12.x及以下版本。
方案3(临时修复):手动修改缓存源码
仅适合临时调试使用,清理pub缓存后修改会失效:
- 打开报错对应的provider源码文件:
/C:/Users/Praveen/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/provider-3.2.0/lib/src/provider.dart - 将第259行的
context.inheritFromWidgetOfExactType(type) as InheritedProvider替换为context.dependOnInheritedWidgetOfExactType<InheritedProvider>() - 将第260行的
context.ancestorInheritedElementForWidgetOfExactType(type)?.widget替换为context.getElementForInheritedWidgetOfExactType<InheritedProvider>()?.widget - 打开同目录下的
delegate_widget.dart,将第194行的super.inheritFromElement(ancestor, aspect: aspect)替换为super.dependOnInheritedElement(ancestor, aspect: aspect)
内容的提问来源于stack exchange,提问作者Praveen Ezekiel

