Flutter从3.0.5降级至2.5.0后报错,寻求解决方案
Flutter降级到2.5.0后兼容问题解决办法
问题描述
我用git checkout 2.5.0将Flutter版本从3.0.5降级到2.5.0后,项目出现了无法解决的错误,希望让项目在2.5.0版本正常运行。
报错信息
../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/percent_indicator-4.2.1/lib/linear_percent_indicator.dart:162:5: Warning: The class 'WidgetsBinding' cannot be null. Try replacing '?.' with '.' WidgetsBinding?.instance?.addPostFrameCallback((_) { ^^^^^^^^^^^^^^ ../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_messaging_platform_interface-3.2.0/lib/src/method_channel/utils/exception.dart:13:11: Error: Method not found: 'Error.throwWithStackTrace'. Error.throwWithStackTrace(exception, stackTrace); ^^^^^^^^^^^^^^^^^^^ ../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_messaging_platform_interface-3.2.0/lib/src/method_channel/utils/exception.dart:16:9: Error: Method not found: 'Error.throwWithStackTrace'. Error.throwWithStackTrace( ^^^^^^^^^^^^^^^^^^^ ../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_messaging_platform_interface-3.2.0/lib/src/method_channel/utils/exception.dart:11:7: Error: A non-null value must be returned since the return type 'Never' doesn't allow null. Never convertPlatformException(Object exception, StackTrace stackTrace) { ^ ../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.2.0/lib/src/method_channel/utils/exception.dart:14:11: Error: Method not found: 'Error.throwWithStackTrace'. Error.throwWithStackTrace(exception, stackTrace); ^^^^^^^^^^^^^^^^^^^ ../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.2.0/lib/src/method_channel/utils/exception.dart:17:9: Error: Method not found: 'Error.throwWithStackTrace'. Error.throwWithStackTrace( ^^^^^^^^^^^^^^^^^^^ ../../../Downloads/flutter_windows_2.10.2-stable/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_platform_interface-6.2.0/lib/src/method_channel/utils/exception.dart:12:7: Error: A non-null value must be returned since the return type 'Never' doesn't allow null. Never convertPlatformException(Object exception, StackTrace stackTrace) { ^
pubspec.yaml内容
environment: sdk: ">=2.1.0 <3.0.0" dependencies: flutter: sdk: flutter cloud_firestore: cupertino_icons: null firebase_auth: firebase_core: firebase_messaging: flutter_google_places: null flutter_spinkit: ^5.1.0 geocoder: geoflutterfire: geolocator: google_maps_flutter: null google_maps_webservice: null http: null location: ^4.4.0 modal_bottom_sheet: ^2.0.1 percent_indicator: ^4.2.1 provider: null rxdart: any shared_preferences: ^2.0.15 uuid: null url_launcher: ^6.0.5 get_it: ^7.2.0 plugin_platform_interface: geolocator_platform_interface: geocoding: ^2.0.4 google_api_availability: google_api_headers: ^1.1.1 mockito: ^5.2.0
解决办法
1. 修正Dart SDK版本约束
Flutter 2.5.0对应的Dart版本是2.14.0,你的pubspec里sdk: ">=2.1.0 <3.0.0"范围太宽泛,改成:
environment: sdk: ">=2.14.0 <3.0.0"
确保SDK版本和当前Flutter版本严格匹配,避免语法兼容问题。
2. 降级不兼容的依赖包
报错核心是依赖版本过高,不兼容Flutter 2.5.0,修改pubspec的dependencies为以下兼容版本:
dependencies: flutter: sdk: flutter cloud_firestore: ^3.1.0 cupertino_icons: ^1.0.4 firebase_auth: ^3.3.0 firebase_core: ^1.10.0 firebase_messaging: ^11.2.0 flutter_google_places: ^0.3.0 flutter_spinkit: ^5.1.0 geocoder: ^0.2.1 geoflutterfire: ^3.0.1 geolocator: ^8.2.0 google_maps_flutter: ^2.1.1 google_maps_webservice: ^0.0.20 http: ^0.13.4 location: ^4.4.0 modal_bottom_sheet: ^2.0.1 percent_indicator: ^3.4.0 provider: ^6.0.2 rxdart: ^0.27.3 shared_preferences: ^2.0.15 uuid: ^3.0.6 url_launcher: ^6.0.5 get_it: ^7.2.0 plugin_platform_interface: ^2.1.2 geolocator_platform_interface: ^4.0.0 geocoding: ^2.0.4 google_api_availability: ^2.0.1 google_api_headers: ^1.1.1 mockito: ^4.1.3
percent_indicator降级到3.4.0,适配旧版Flutter的WidgetsBinding写法- Firebase系列依赖全部降级到兼容Flutter 2.5.0的稳定版本
mockito降级到4.1.3,兼容Dart 2.14的语法规范
3. 清理缓存并重新获取依赖
执行以下命令彻底清理缓存并重新拉取适配的依赖:
flutter clean flutter pub get
如果问题依旧,可以手动删除本地.pub-cache目录中对应的高版本依赖包,再重新执行flutter pub get。
4. 手动修复依赖源码(可选)
如果不想降级percent_indicator,可以找到本地依赖中的linear_percent_indicator.dart文件(路径即报错提示的路径),将第162行的:
WidgetsBinding?.instance?.addPostFrameCallback((_) {
改成:
WidgetsBinding.instance.addPostFrameCallback((_) {
因为Flutter 2.5.0中WidgetsBinding.instance是非空的,不需要空安全的?.操作符。
内容的提问来源于stack exchange,提问作者Praveesh Ramroop
相关产品推荐
相关产品推荐

