记录flutter app检测更新(仅内部更新)

直接上代码,粘贴复制即可使用:
import 'package:get/get.dart';
import 'package:package_info/package_info.dart';
class AppUtils {
  static checkUpdate() async {
    PackageInfo info = await PackageInfo.fromPlatform();
    dynamic ui = await HttpUtils.get(PortAddress.QY_UPDATE);
    if(ui != null) {
      if (info.version != ui['os-version']) {
        Get.dialog(WillPopScope(
          onWillPop: notWillPop,
          child: AlertDialog(
            title: Text('发现新版本 V' + ui['os-version']),
            content: AppUpdate(url: ui['url'], updateInfo: ui['update-info'],
              fileName: 'app' + '.' + ui['os-version'] + '.' +
                  '1' + '.apk',),
          ),
        )
        );
      }
    }
  }

  static Future<bool> notWillPop() async {
    return false;
  }
}
import 'dart:io';
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:open_file/open_file.dart';
import 'package:path_provider/path_provider.dart';
class AppUpdate extends StatefulWidget {

  final url;
  final updateInfo;
  final fileName;

  const AppUpdate({Key? key, this.url, this.updateInfo, this.fileName}) : super(key: key);

  @override
  _AppUpdateState createState() => _AppUpdateState();

}

class _AppUpdateState extends State<AppUpdate> {

  double progressValue = 0.0;
  List<dynamic>? infoList;
  List<Widget>? wList;
@override
void initState() {
  super.initState();

  try {
  
    installApk(widget.url);

  } catch(e) {
    exit(0);
  }
}
@override
Widget build(BuildContext context) {
  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    mainAxisSize: MainAxisSize.min,
    children: [
      Text("${widget.updateInfo}"),
      SizedBox(height: 30.0,),
      LinearProgressIndicator(
        value: progressValue,
        backgroundColor: Colors.blueGrey,
        valueColor: AlwaysStoppedAnimation<Color>(Colors.pink),
      )
    ],
  );
}
/// 安装apk
Future<Null> installApk(String url) async {
  File _apkFile = await downloadAndroid(url);
  String _apkFilePath = _apkFile.path;

  if (_apkFilePath.isEmpty) {
    print('APK路径错误');
    return;
  }
  await OpenFile.open(_apkFilePath);
}
/// 下载安卓更新包
Future<File> downloadAndroid(String url) async {
  /// 创建存储文件
  Directory? storageDir = await getExternalStorageDirectory();
  String storagePath = storageDir!.path;
  File file = new File('$storagePath/${widget.fileName}');
  // print('下载地址:${storagePath}');
  if (!file.existsSync()) {
    file.createSync();
  }

  try {
    /// 发起下载请求
    Response response = await Dio().get(url,
        onReceiveProgress: showDownloadProgress,
        options: Options(
          responseType: ResponseType.bytes,
          followRedirects: false,
        ));
    // debugPrint('===请求headler: ${response.headers}');
    file.writeAsBytesSync(response.data);
    return file;
  } catch (e) {
    print(e);
  }
  return file;
}
/// 展示下载进度
void showDownloadProgress(num received, num total) {
  if (total != -1) {
    double _progress =
    double.parse('${(received / total).toStringAsFixed(2)}');
    setState(() {
      progressValue = _progress;
    });
  }
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值