背景
接到一个需求,需要展示一个环状图和一个柱状图,去pub上逛了一圈,选择了功能比较全的MPFlutterChart 库。引入项目时,发现MPFlutterChart 和国际化包flutter_localizations依赖不同的intl版本。为了能使用MPFlutterChart 库,尝试了以下几种解决冲突的方法。
网上查找方法时,看到了这篇文章:https://www.cnblogs.com/pjl43/p/9943882.html,以下方案一到方案三都是这篇文章了的。
方案一,手动尝试历史版本
在pub上查看库的历史版本,往前尝试,找到一个不冲突的版本。方法太笨,不建议采用。
方案二,版本设置为any
设置版本号为any,则AS会自己查找不冲突的版本,引入依赖。相当于机器帮做了手动尝试的过程。如果能找到不冲突的版本,则可以使用方案三来优化。
方案三,从pubspec.lock找到具体版本号
方案二生效后,我们在pubspec.yaml里面看不到使用的具体版本号。这是可以去pubspec.lock中查看项目所依赖的具体版本,可把pubspec.yaml中的any替换成pubspec.lock的具体版本号。(该文章说是在pubspec.lock.yaml,不知是笔误还是因为flutter版本与我的不一样)。
以下是方案二无用情况下的处理
方案四,引入本地库,手动改版本
上面方案二很好,遗憾的是,对我的情况无用。我项目flutter_localizations依赖的intl是0.15.8,而MPFlutterChart 依赖的是0.16.0;而且,MPFlutterChart 是从第一个版本就是依赖0.16.0的,即使设置为any,也找不到依赖0.15.8的版本号。
pub上找不到对应版本,那可以从github上clone代码,修改依赖版本号后,通过本地引入的方式引入。
缺点:
1.下次升级MPFlutterChart 版本,需要重新colone代码,修改依赖版本,不易维护
2.降低intl版本,可能会出现一些在0.16.0版本已被修复的问题,甚至有的新API调不到导致无法运行。
方案五,修改flutter_localizations的依赖版本
降低版本存在风险,那能不能给flutter_localizations升级版本呢?想去pub上查看flutter_localizations依赖的intl版本号,发现无法搜索到。再看下pubspec.yaml文件里的引入方式,它和其他库的引入明显不同。
dependencies:
flutter:
sdk: flutter
#国际化支持
flutter_localizations:
sdk: flutter
看这引入方式,猜测它应该来自flutter的sdk。打开.packages文件,发现它的路径是%flutter_sdk%packages/flutter_localizations/lib/。打开里面的pubspec.yaml,果然找到了依赖的intl版本是0.15.8,将其改为0.16.0,从新获取依赖,可正常运行。
缺点:
1.此修改只能改自己本地的代码,如果别人拉取项目,而他电脑的依赖版本没修改,依然无法运行,不易于团队协作。
2.修改sdk包的依赖版本,可能会导致API不兼容问题。
方案六,升级flutter_sdk版本
单独修改sdk的依赖版本可能会出现问题,但是整体升级sdk则安全得多,因为每个sdk发布前必然经过大量的测试,尤其是稳定版的sdk。
由于MPFlutterChart 一开始就支持intl 0.16.0,因此猜测它发布的时候,flutter的sdk已经支持到0.16.0了。查看了MPFlutterChart 第一个版本的发布时间,19年9月。查看那段时间的flutter代码,发现果然已经支持0.16.0。所以,如果flutter_升级到1.12.13及以上的稳定版本,就不再有这个问题。
最后
这个问题的原因是我的flutter_sdk版本过低,没跟上官方最新版。但是如果以后还遇到其他第三方库和sdk库版本冲突,可以参考上面思路。