206 lines
7.5 KiB
Dart
206 lines
7.5 KiB
Dart
/*
|
|
* @Author: wangyang 1147192855@qq.com
|
|
* @Date:
|
|
* @LastEditors: wangyang 1147192855@qq.com
|
|
* @LastEditTime: 2022-09-29 10:11:54
|
|
* @FilePath: \marking_app\lib\utils\app_upgrade\UpdateDialog.dart
|
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
|
*/
|
|
/*
|
|
* @Descripttion: 版本更新提示弹窗
|
|
* @version:
|
|
* @Author: wy
|
|
* @Date: 2020-07-30 14:03:28
|
|
* @LastEditors: Please set LastEditors
|
|
* @LastEditTime: 2021-01-12 15:08:43
|
|
*/
|
|
import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:marking_app/provider/upgrade_provider.dart';
|
|
import 'package:marking_app/utils/app_upgrade/DownloadApk.dart';
|
|
import 'package:marking_app/utils/app_upgrade/UpgradePermission.dart';
|
|
import 'package:marking_app/utils/app_upgrade/model/UpdateAppEvent.dart';
|
|
import 'package:marking_app/utils/index.dart';
|
|
import 'package:marking_app/utils/my_text.dart';
|
|
import 'package:percent_indicator/linear_percent_indicator.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
import 'package:url_launcher/url_launcher_string.dart';
|
|
|
|
class UpdateDialog extends Dialog {
|
|
final UpdateAppEvent updateAppEvent;
|
|
final String deviceInfo;
|
|
|
|
const UpdateDialog({required this.updateAppEvent, required this.deviceInfo});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Center(
|
|
child: Container(
|
|
width: 319.w,
|
|
height: 440.h,
|
|
padding: EdgeInsets.symmetric(vertical: 8.h),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(18.sp),
|
|
image: const DecorationImage(
|
|
alignment: Alignment.topCenter,
|
|
image: AssetImage("assets/images/upgrade_dialog_bgc.png"),
|
|
fit: BoxFit.fitWidth,
|
|
),
|
|
),
|
|
child: Column(
|
|
children: <Widget>[
|
|
Expanded(
|
|
child: ListView(
|
|
physics: const BouncingScrollPhysics(),
|
|
padding: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0),
|
|
children: [
|
|
Container(
|
|
alignment: Alignment.center,
|
|
margin: EdgeInsets.only(top: 128.h, bottom: 10.h),
|
|
child: quickText(
|
|
updateAppEvent.title,
|
|
size: 18.sp,
|
|
fontWeight: FontWeight.w600,
|
|
color: const Color.fromRGBO(58, 90, 159, 1),
|
|
),
|
|
),
|
|
HtmlWidget(
|
|
updateAppEvent.description,
|
|
customStylesBuilder: (element) {
|
|
return {'color': '#666666', 'font-weight': 'normal', 'text-decoration': 'none'};
|
|
},
|
|
onLoadingBuilder: (context, element, loadingProgress) => const CircularProgressIndicator(),
|
|
renderMode: RenderMode.column,
|
|
textStyle: TextStyle(fontSize: 14.sp, color: Colors.black87),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
const DownloadProgress(),
|
|
DownloadButton(updateAppEvent, deviceInfo: deviceInfo),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
// 调起
|
|
static showUpdateDialog(BuildContext context, UpdateAppEvent updateAppEvent) {
|
|
return showDialog(
|
|
barrierDismissible: false,
|
|
context: context,
|
|
builder: (BuildContext context) {
|
|
return WillPopScope(
|
|
onWillPop: () async => false,
|
|
child: UpdateDialog(updateAppEvent: updateAppEvent, deviceInfo: updateAppEvent.deviceInfo),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
class DownloadProgress extends ConsumerWidget {
|
|
const DownloadProgress({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final count = ref.watch(upgradeProvider);
|
|
var str = (count * 100).toString().split('.')[0];
|
|
if (count <= 0) return Container();
|
|
return Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
LinearPercentIndicator(
|
|
alignment: MainAxisAlignment.center,
|
|
width: 245.w,
|
|
animation: false,
|
|
lineHeight: 20.0.h,
|
|
percent: count,
|
|
center: quickText(
|
|
"$str%",
|
|
size: 14.sp,
|
|
align: TextAlign.center,
|
|
color: Colors.white,
|
|
),
|
|
linearStrokeCap: LinearStrokeCap.roundAll,
|
|
progressColor: Theme.of(context).primaryColor,
|
|
),
|
|
Container(
|
|
height: 6.h,
|
|
),
|
|
quickText('更新中...', size: 12.sp, fontWeight: FontWeight.w500, color: const Color.fromRGBO(90, 90, 90, 1))
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
// 下载按钮
|
|
class DownloadButton extends ConsumerWidget {
|
|
final UpdateAppEvent updateAppEvent;
|
|
final String deviceInfo;
|
|
const DownloadButton(this.updateAppEvent, {required this.deviceInfo, Key? key}) : super(key: key);
|
|
|
|
// 打开浏览器或者对应的对应市场进行下载
|
|
Future<bool> toLaunch(UpdateAppEvent data) async {
|
|
var uri = Uri.parse('market://details?id=com.example.marking_app');
|
|
if (await canLaunchUrl(uri)) {
|
|
// 跳进对应的应用市场进行更新操作
|
|
return await launchUrl(uri);
|
|
}
|
|
// 无法进入应用市场就打开浏览器进行下载
|
|
uri = Uri.parse(data.link);
|
|
if (await canLaunchUrl(uri)) return await launchUrl(uri);
|
|
return false;
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final count = ref.watch(upgradeProvider);
|
|
if (count > 0) return Container();
|
|
|
|
return Container(
|
|
height: 38.h,
|
|
width: 245.w,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.all(Radius.circular(42.h)),
|
|
gradient: const LinearGradient(colors: [
|
|
Color.fromRGBO(24, 70, 238, 1),
|
|
Color.fromRGBO(72, 122, 255, 1),
|
|
]),
|
|
),
|
|
child: MaterialButton(
|
|
onPressed: () => easyThrottle('DownloadButton_App_Upgrade', duration: const Duration(milliseconds: 1000), () async {
|
|
if (deviceInfo == "android" && updateAppEvent.equipment == Equipment.android) {
|
|
// 权限检查 判断是否有读写内存的权限
|
|
bool flag = await UpgradePermission(updateAppEvent.deviceInfo).checkPermission(context, updateAppEvent);
|
|
if (flag) {
|
|
flag = await DownloadApk.installApk(context, updateAppEvent, ref);
|
|
if (!flag) {
|
|
print('执行到了重置更新按钮的地方....');
|
|
ref.read(upgradeProvider.notifier).clean(); // 更新失败重置 更新按钮
|
|
} else {
|
|
print('更新成功重新打开APP..............');
|
|
RestartWidget.restartApp(context); // 安装成功 重启APP
|
|
}
|
|
return;
|
|
}
|
|
// await FlutterClipboard.copy(updateAppEvent.link);
|
|
// setTimeOut(1000, () => ToastUtils.showInfo('下载链接已经复制到设备,可前往浏览器下载安装'));
|
|
} else if (deviceInfo == "ios" && updateAppEvent.equipment == Equipment.ios) {
|
|
try {
|
|
await launchUrlString(updateAppEvent.link);
|
|
} catch (e) {
|
|
toPrint(val: '进来更新报错$e');
|
|
}
|
|
}
|
|
}),
|
|
child: quickText('立即体验', size: 16.sp, color: Colors.white, fontWeight: FontWeight.w500),
|
|
),
|
|
);
|
|
}
|
|
}
|