背景
有时候第三方插件不满足我们的需求时需要对第三方插件进行二次开发或扩展,这里就涉及到将第三方插件复制一份代码到本地,进行本地化的过程。
本地化步骤
步骤一
打开插件pubspec.yaml,修改属性name,值改为重新定义的插件名,以插件webview_flutter为例,插件名改为name: webview_flutter_xx;
步骤二
打开插件根目录下ios文件夹,修改podspec文件名重新以新插件名命名:webview_flutter_xx.podspec;
步骤三
将上一步的webview_flutter_xx.podspec里的配置s.name改成新的插件名;
步骤四
全局搜索,把dart文件中引用到的旧插件名改为新插件名;
全局搜索,把配置中引用到的旧插件名改为新插件名;
注意原生的地方不要统一更换,比如webview_flutter里android有个地rootProject.name命名和旧包名一样的不用改;
改完包名后,Flutter代码引用到新包名的地方可以统一搜索替换;
注意:这里全局搜索最好用as或xcode复核一下,和vscode相互补充搜索确保完整。
至此,一个本地化的第三方插件就改造完成了。
大部情况下单独运行时很顺畅,但是。。。现实往往没这么顺利。
场景
还是以webview_flutter为例,前面我们做了一个本地化的插件webview_flutter_xx;
在我们的主工程里还引入的 flutter_html 插件,这个插件里面也引用了webview_flutter,这时候冲突就来了;
冲突一:Android包名冲突
冲突二:Android类名引用错误
冲突三:iOS文件名冲突
冲突四:iOS类名名冲突
冲突五:Flutter 渠道唯一标识名冲突
解决冲突一
在pubspec.yaml里,如下例子
flutter:
plugin:
platforms:
android:
package: io.flutter.plugins.webviewflutter.xx
pluginClass: WebViewFlutterPlugin
ios:
pluginClass: YZFLTWebViewFlutterPlugin
把adnroid package包名改为新包名,同时全局搜索(vscode/as/xcode并用)旧包名,把相关配置里的旧包名改为新包名,同时把目录也改为新包名目录,注意一个一个改,不要改错了;
android的pluginClass可以不用改;
解决冲突二
android的包名冲突导致类引用出错,在文件中一个一个改就可以了;
解决冲突三
ios的pluginClass重新命名,重新pod install生成相应的文件;
解决冲突四
这步是工作量最大的,先把ios的pluginClass重新命名,重新pod install生成相应的文件;
然后就是修改文件的文件名、类名、引用类名等;
解决冲突五
Flutter和原生通信的渠道Channel的唯一标识不能重复,否则会报check的错误,需要重新命名。
至此,一个完整的无冲突的本地化插件完成了,同时插件也基本上失去了和第三方代码同步的可能性,或者很麻烦,只能自己维护了。