Flutter项目package_info_plus与get_cli依赖冲突求助
问题概述
在Flutter项目中引入package_info_plus: ^7.0.0后遭遇依赖冲突,根源是get_cli: ^1.8.1与package_info_plus、flutter_localizations的版本依赖矛盾:
flutter_localizations强制依赖intl: 0.19.0package_info_plus: ^7.0.0要求win32: >=4.0.0- 但
get_cli: ^1.8.1的依赖链限制intl最高为0.18.x,且依赖的dart_console要求win32: ^2.0.0,三者无法兼容。此前调整http、internet_connection_checker_plus等包版本或排除依赖均未解决问题。
项目环境与依赖配置
environment: sdk: '>=3.1.0 <4.0.0' dependencies: flutter: sdk: flutter file: ^7.0.0 shared_preferences: ^2.0.13 flutter_localizations: sdk: flutter intl: any get_storage: ^2.1.1 get_cli: ^1.8.1 local_session_timeout: ^2.3.1 go_router: ^14.1.2 casbin: ^0.1.0 jwt_decoder: ^2.0.1 flex_color_scheme: ^7.3.1 one_clock: ^2.0.1 cupertino_icons: ^1.0.2 flutter_dotenv: ^5.1.0 json_serializable: ^6.7.1 firebase_core: ^2.24.2 firebase_messaging: ^14.7.9 openid_client: ^0.4.8 hive: ^2.2.3 hive_flutter: ^1.1.0 flutter_svg: ^2.0.10+1 http: ^1.2.0 flutter_json_view: ^1.1.4 get: ^4.6.6 url_launcher: ^6.2.5 internet_connection_checker_plus: ^2.3.0 json_annotation: ^4.9.0 dio: any provider: ^6.1.2 freezed_annotation: ^2.4.1 footer: ^0.0.4 font_awesome_flutter: ^10.7.0
具体错误信息
因为 get_cli >=1.8.3 依赖 intl ^0.18.0,且没有 get_cli 版本匹配 >1.8.1 <1.8.3,所以 get_cli >1.8.1 需要 intl ^0.18.0。
又因为 get_cli 1.8.1 依赖 cli_dialog >=0.5.0 <1.0.0,所以 get_cli >=1.8.1 需要 intl ^0.18.0 或 cli_dialog >=0.5.0 <1.0.0。
(1) 因此,由于没有 cli_dialog 版本匹配 >0.5.0 <1.0.0,且 cli_dialog 0.5.0 依赖 dart_console ^1.0.0,所以 get_cli >=1.8.1 需要 intl ^0.18.0 或 dart_console ^1.0.0。因为没有 dart_console 版本匹配 >1.0.0 <1.1.0-pre.0,且 dart_console >=1.1.0-pre.0 <1.2.0 依赖 intl ^0.17.0,dart_console >1.0.0 <1.2.0 需要 intl ^0.17.0。
又因为 dart_console >=1.2.0 <4.0.0 依赖 intl ^0.18.0,且 dart_console 1.0.0 依赖 win32 ^2.0.0,所以 dart_console >=1.0.0 <4.0.0 需要 win32 ^2.0.0 或 intl ^0.17.0 或 ^0.18.0。
结合 get_cli >=1.8.1 需要 intl ^0.18.0 或 dart_console ^1.0.0 (1),get_cli >=1.8.1 需要 intl ^0.17.0 或 >=0.18.0 <0.19.0 或 win32 ^2.0.0。
又因为 package_info_plus >=4.0.1 依赖 win32 >=4.0.0 <6.0.0,所以若同时使用 package_info_plus >=4.0.1 和 get_cli >=1.8.1,则需要 intl ^0.17.0 或 >=0.18.0 <0.19.0。
而由于 mes_line_in 依赖 sdk 中的 flutter_localizations,后者依赖 intl 0.19.0,因此 package_info_plus >=4.0.1 与 get_cli >=1.8.1 不兼容。
综上,由于 mes_line_in 同时依赖 get_cli ^1.8.1 和 package_info_plus ^7.0.0,版本解析失败。
解决方案
1. 升级get_cli到兼容版本
get_cli的新版本(如^2.0.0及以上)已更新依赖约束,支持intl: 0.19.0和更高版本的win32。修改pubspec.yaml中的get_cli版本:
get_cli: ^2.0.0 # 或最新稳定版
执行flutter pub get,验证冲突是否解决。
2. 降级package_info_plus到兼容版本
将package_info_plus降级到4.0.1以下的版本(如^3.1.0),该版本对win32的依赖为<4.0.0,可与get_cli: ^1.8.1的依赖链兼容,同时兼容intl: 0.19.0:
package_info_plus: ^3.1.0
执行flutter pub get,测试功能是否正常。
3. 使用dependency_overrides强制统一版本(风险较高)
若上述方案不可行,可尝试在pubspec.yaml中添加dependency_overrides,强制指定兼容的intl和win32版本,但需注意可能引发其他依赖的隐性问题:
dependency_overrides: intl: 0.19.0 win32: 4.0.0 # 需确认get_cli的依赖能兼容该版本
执行flutter pub get后,全面测试项目功能,避免潜在崩溃。
替代方案:不使用package_info_plus获取包信息
若不想调整现有依赖版本,可直接读取项目的pubspec.yaml文件获取版本信息:
- 在
pubspec.yaml的assets中添加:
flutter: assets: - pubspec.yaml
- 编写代码读取并解析版本:
import 'package:flutter/services.dart' show rootBundle; import 'package:yaml/yaml.dart'; Future<String> getAppVersion() async { final yamlString = await rootBundle.loadString('pubspec.yaml'); final yamlMap = loadYaml(yamlString); return yamlMap['version'].toString().split('+')[0]; // 获取主版本号 }
此方法仅能获取编译时的版本信息,无法读取平台原生的包信息(如iOS的CFBundleVersion或Android的versionCode),但可满足多数版本展示需求。
内容的提问来源于stack exchange,提问作者Sachithya Rivisara

