修复ota_update下载负值BUG,Flutter修改插件方法

  • 发表于
  • flutter

ota_update

Flutte的OTA更新插件。在Android上,它下载文件(带有进度报告)并触发应用安装意图。在iOS上,它会打开指定IPA网址(苹果商店)。BUG在最新的v2.0.2版本是依然存在,下载时得到的下载进度值显示负值,如:

I/flutter ( 5080): 57
I/flutter ( 5080): 57
I/flutter ( 5080): -56
I/flutter ( 5080): -56
I/flutter ( 5080): -54
I/flutter ( 5080): -54

在进度50%-57%之后,它们全部变为负值并减小。

查看了源码发现它使用了int,导致文件过大产生BUG,换用long就行。

Flutter使用本地修改的ota_update插件

现在我们使用的是远程的插件版本,pubspec.yaml

ota_update: ^2.0.2

原作者迟迟不修复进度负值的BUG只能我们自己来修改,并替换远程版本为本地版本插件,步骤如下:

  1. 打开路径:~/.pub-cache/hosted/pub.dartlang.org/
  2. 找到你ota_update插件包:ota_update-2.0.2
  3. 将整个包文件夹复制到你应用程序文件夹根目录下(与pubspec.yaml级别相同,不在lib文件夹中),然后重命名版本:例如:ota_update-202-fix
  4. 修改pubspec.yaml以指向本地包,打开项目pubspec.yaml将依赖项路径更改为,例如:ota_update: path: ./ota_update-202-fix/

修改java源文件以修复下载进度负值的BUG

打开上边步骤中的本地包文件:android/src/main/java/sk/fourq/otaupdate/OtaUpdatePlugin.java第56行:

progressSink.success(Arrays.asList("" + OtaStatus.DOWNLOADING.ordinal(), "" + ((msg.arg1 * 100) / msg.arg2)));

替换为

Bundle bundle = (Bundle) msg.obj;
progressSink.success(Arrays.asList("" + OtaStatus.DOWNLOADING.ordinal(), "" + ((bundle.getLong("down") * 100) / bundle.getLong("size"))));

找到第203-210行

int bytes_downloaded = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (progressSink != null && bytes_total > 0) {
 Message message = new Message();
 message.arg1 = bytes_downloaded;
 message.arg2 = bytes_total;
 handler.sendMessage(message);
}

替换为

long bytes_downloaded = c.getLong(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
long bytes_total = c.getLong(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (progressSink != null) {
 Message message = new Message();
 Bundle bundle = new Bundle();
 bundle.putLong("down",bytes_downloaded);
 bundle.putLong("size",bytes_total);
 message.obj = bundle;
 handler.sendMessage(message);
}

最后,在文件顶部添加

import android.os.Bundle;

保存,结束,现在代码及配置都修改完毕了:

  1. flutter clean
  2. flutter run

运行测试发现下载进度值已经正常不再是负值。其它Flutter插件修改流程也是一样的,先变远程为本地,再修改配置引用。