一个插件引发的Flutter 3.0 折腾记

起因

因为之前用的插件Image_gallery选取视频的时候,一次最大只能取10M以内的视频文件,所以改成了FilePicker,虽然界面方面不如image_gallery,但好歹能获取大文件了,不至于内存溢出。

换了FilePicker发现,某些相册视频的封面没法显示,会报错,我用的是video_thumbnail这个插件,版本0.4.6,看了下最新的版本是0.5.0,所以想升级下好了,结果升级报错,意思就是我当前的flutter Dart版本低了,需要升级。

就在同一天3.0发布的前几个小时,我从2.8.1 升级到了2.10.5,然后video_thumbnail升级成功了,发现还是有问题,但这个插件也不能废掉,别处还有用,就把video_compress这个插件用回来了。

video_thumbnail升级到0.5.0以后,video_trimmer这个插件又坐不住了,嚷嚷着要升级,然后也升了,结果升级后的video_trimmer 里面的实现把ffmpeg换成了ffmpeg-kit,而ffmpeg和ffmpeg-kit不能共存。而我原来用的ffmpeg从0.4.2版本开始废弃掉了。所以一不做二不休,干脆把代码里的ffmpeg全换成了ffmpeg-kit,而且因为App里某个功能需要full-gpl的版本,把video_trimmer 在github fork了一个新仓库,并且把默认的https版本改成了full-gpl拿来用。

到这里选择大视频并且编辑和存储这块功能都升级完成了。

落坑

兴高采烈的在我自己的手机上玩了下视频编辑功能,很爽,结果发现视频不能下载了, 卡在0.0%不动。

用真机测试新App,OK。

模拟器测试(Android 9,10,11,12)新App,OK。

怎么搞都是新包没问题,升级App有问题。

百思不得其解。

是我之前大刀阔斧的简化代码出了问题?

还是Flutter升级有什么新特性我没有了解?比如work-manager更新版本了?

release包也看不到错误。

真机也没办法调试升级的情况,测试机上的app总是会被debug包冲掉。

只能寄希望安卓模拟器,之前因为信号x的问题,不能正常访问网络,所以我一直以真机开发为主。

解决安卓模拟器上网问题,主要做好两点:

  1. 镜像文件不要选AS 推荐(Recommended)的,去x86 Images 选不带Google_APIs的,不然模拟器内部默认会以是否能访问google来判断是否联网。

  2. DNS要改成自己电脑的(后来发现好像也不是必须的。网上大部分这样说)

  3. 能上网以后,信号带x还要执行下面的三行,再开关一下飞行模式就好了

    adb devices adb -s emulator-5554 shell settings put global captive_portal_mode 0

OK,到此我们就把安卓模拟器搞定了。

出坑

无可奈何,干脆回退吧,还好有git。

git stash
复制代码

把修改的代码先放暂存区。

git checkout 回退到两天前的版本

 再去到flutter 的sdk目录,把flutter 的版本强制checkout到2.8.1

git reset --hard 77d935af4db863f6abd0b9c31c7e6df2a13de57b
flutter doctor
复制代码

再模拟器测试、真机测试、一切OK

得出结论,不是我代码的问题,推断是flutter sdk的问题。

既然这样,得知今天flutter发布3.0.0了,尝试一下。

git checkout -f ee4e09cce01d6f2d7f4baebd247fde02e5008851
flutter doctor
复制代码

再模拟器测试、真机测试新安装没问题、升级app有问题。

把代码checkout到最新,再把修改从暂存区拿出来

git stash pop
复制代码

再模拟器测试、真机测试、升级app有问题。

太晚了,睡。

早起来回寻思,是回退到2.8.1这个老版本讲究呢,还是想办法往前推进。

不行,得往前,以后路还长着呢,迟早得解决。

从头开始捋下载这块的代码,注意到半年前用的flutter downloader因为保存路径不能指定的问题所以用了一个其他人的fork,看原作者最近升级了,心想这个问题估计解决了吧,所以之前flutter 升2.10.5的时候,因为插件兼容的原因也升级了。

其实问题就出在这个插件。

用安卓真机跑,没问题,新包。

用安卓模拟器12跑,有问题,是升级包。注意,安卓模拟器可以模拟升级的情况!不会冲掉上一个版本。

报错了。

原因就是save_in_public_storage字段找不到。

原来我用的非官方的包,DATABASE_VERSION 改成了3.

而最新的官方包增加了save_in_public_storage 字段,DATABASE_VERSION 也改成了3.

安卓sqlite helper依赖 DATABASE_VERSION 版本来判断是否更新表结构,所以DATABASE_VERSION没升就会导致原来的App运行时还是老的表结构,没有save_in_public_storage字段,所以只要DATABASE_VERSION + 1就好。

修改代码,问题果然解决了。

这里顺便提一下,如果要用pub上比人的插件,发现有需要修改的,之前是直接改了,但后来发现flutter repair命令会冲掉修改(flutter clean不会),所以这不是好办法。正确的做法是去github上fork一份代码,然后比如

flutter_downloader:  
    git:    
        url: [email protected]:xxx/flutter_downloader.git
复制代码

这样引用的好处是

  1. 修改不会被冲掉
  2. 官方如果更新了,可以把更新拉过来与自己的fork代码合并

总结

  1. 用好模拟器,虽然真机用起来很爽,但真机解决不了一些问题

  2. 做好版本管理很重要,回退关键时刻能保命

  3. flutter doctor 解千愁,有问题没问题doctor一下

  4. 选对pub源也很重要,切换一次版本3小时吃不消

  5. 拥抱变化,新的插件会改掉很多bug,去掉无用的引用减少体积,还会有新特性可以直接拿来用

上述有不明白的地方加我微信

猜你喜欢

转载自juejin.im/post/7097096488966160391