175 lines
5.3 KiB
Dart
175 lines
5.3 KiB
Dart
import 'package:app/widgets/base/button/index.dart';
|
|
import 'package:app/widgets/base/tag/index.dart';
|
|
import 'package:app_installer/app_installer.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import '../../utils/transfer/download.dart';
|
|
import '../base/config/config.dart';
|
|
|
|
///下载状态枚举
|
|
enum UploadState {
|
|
notStarted, //未开始下载
|
|
downloading, //下载中
|
|
completed, //下载完毕
|
|
}
|
|
|
|
class AppUpdateUi extends StatefulWidget {
|
|
final String version;
|
|
final List<String> updateNotice;
|
|
final String uploadUrl; //下载地址
|
|
|
|
const AppUpdateUi({
|
|
super.key,
|
|
required this.version,
|
|
required this.updateNotice,
|
|
required this.uploadUrl,
|
|
});
|
|
|
|
@override
|
|
State<AppUpdateUi> createState() => _UpdateUiState();
|
|
}
|
|
|
|
class _UpdateUiState extends State<AppUpdateUi> {
|
|
int _uploadProgress = 0; //下载进度
|
|
UploadState _uploadState = UploadState.notStarted;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
getLocalApk();
|
|
}
|
|
|
|
///读取本地是否有下载记录
|
|
void getLocalApk() async {
|
|
String url = await LocalDownload.getFilePath(url: widget.uploadUrl, path: '/apk');
|
|
if (url.isNotEmpty) {
|
|
setState(() {
|
|
_uploadState = UploadState.completed;
|
|
});
|
|
}
|
|
}
|
|
|
|
///下载apk
|
|
void _handUploadApk() async {
|
|
if (_uploadState == UploadState.notStarted) {
|
|
setState(() {
|
|
_uploadState = UploadState.downloading;
|
|
});
|
|
LocalDownload.downLoadFile(
|
|
url: widget.uploadUrl,
|
|
path: "/apk",
|
|
onProgress: (double double) {
|
|
setState(() {
|
|
_uploadProgress = double.toInt();
|
|
});
|
|
},
|
|
onDone: (apk) async {
|
|
setState(() {
|
|
_uploadState = UploadState.completed;
|
|
});
|
|
AppInstaller.installApk(apk);
|
|
},
|
|
);
|
|
} else if (_uploadState == UploadState.completed) {
|
|
String url = await LocalDownload.getFilePath(url: widget.uploadUrl, path: '/apk');
|
|
AppInstaller.installApk(url);
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
String text;
|
|
if (_uploadState == UploadState.downloading) {
|
|
text = "$_uploadProgress%";
|
|
} else if (_uploadState == UploadState.completed) {
|
|
text = '安装';
|
|
} else {
|
|
text = '立即升级';
|
|
}
|
|
return IntrinsicHeight(
|
|
child: Container(
|
|
color: Colors.transparent,
|
|
padding: EdgeInsets.symmetric(horizontal: 40),
|
|
alignment: Alignment.center,
|
|
child: ConstrainedBox(
|
|
constraints: BoxConstraints(
|
|
maxWidth: 500,
|
|
),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Stack(
|
|
fit: StackFit.passthrough,
|
|
children: [
|
|
Image.asset("assets/image/version_bg.png"),
|
|
Positioned(
|
|
top: 0,
|
|
left: 0,
|
|
right: 0,
|
|
bottom: 0,
|
|
child: DefaultTextStyle(
|
|
style: TextStyle(
|
|
fontSize: 16,
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.w700,
|
|
),
|
|
child: FractionalTranslation(
|
|
translation: Offset(0.35, 0.3),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text("发现新版本"),
|
|
SizedBox(width: 10),
|
|
Tag(
|
|
text: "V ${widget.version}",
|
|
type: ThemeType.warning,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
Material(
|
|
borderRadius: BorderRadius.only(
|
|
bottomLeft: Radius.circular(20),
|
|
bottomRight: Radius.circular(20),
|
|
),
|
|
child: Container(
|
|
padding: EdgeInsets.all(15),
|
|
width: double.infinity,
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
...widget.updateNotice.asMap().entries.map((entry) {
|
|
final index = entry.key;
|
|
final item = entry.value;
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: 5),
|
|
child: Text("${index + 1}.$item"),
|
|
);
|
|
}),
|
|
Container(
|
|
margin: EdgeInsets.only(top: 20),
|
|
height: 40,
|
|
child: Button(
|
|
text: text,
|
|
onPressed: _uploadState == UploadState.downloading
|
|
? null
|
|
: _handUploadApk,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|