app_update_view.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'package:trackoffical_app/logger.dart';
  5. import 'package:trackoffical_app/pb.dart' as pb;
  6. import 'package:trackoffical_app/service/app.dart';
  7. import 'package:trackoffical_app/widget/will_exit_after_2_back.dart';
  8. import '../styles/theme.dart';
  9. class AppUpdateController extends GetxController {
  10. final downloadProcess = 0.0.obs;
  11. Timer? _ticker;
  12. @override
  13. void onReady() {
  14. var arg = Get.arguments;
  15. if (arg is pb.GetUpdateVersionReply){
  16. App.to.updateApp(arg).then((value){
  17. info('下载完成');
  18. }, onError: (e){
  19. warn('安装失败:', e);
  20. });
  21. }
  22. _ticker = Timer.periodic(100.milliseconds, (timer) {
  23. App.to.getUpdateAppProcess().then((value) => downloadProcess.value = value);
  24. });
  25. }
  26. @override
  27. void onClose(){
  28. _ticker?.cancel();
  29. }
  30. }
  31. class AppUpdateView extends GetView<AppUpdateController> {
  32. final pb.GetUpdateVersionReply data;
  33. const AppUpdateView(this.data, {super.key});
  34. static Bindings bindings() {
  35. return BindingsBuilder(() {
  36. Get.put<AppUpdateController>(AppUpdateController());
  37. });
  38. }
  39. static void show(pb.GetUpdateVersionReply updateInfo) {
  40. Get.offAll(
  41. AppUpdateView(updateInfo),
  42. binding: AppUpdateView.bindings(),
  43. arguments: updateInfo
  44. );
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. return WillExitAfter2Back(child: Scaffold(
  49. body: Container(
  50. width: double.infinity,
  51. height: double.infinity,
  52. padding: const EdgeInsets.all(24),
  53. child: Center(
  54. child: Column(
  55. mainAxisSize: MainAxisSize.min,
  56. children: [
  57. const SizedBox(height: 100),
  58. Image.asset('assets/images/sign_in_logo.png', height: 45.77),
  59. const SizedBox(height: 45.35),
  60. Image.asset('assets/images/ic_logo_rect.png', height: 54),
  61. const SizedBox(height: 21),
  62. Text('小飞龙定向软件升级',
  63. style: context.textTheme.titleLarge?.copyWith(fontSize: 13, color: const Color(0xffaaaaaa))),
  64. const SizedBox(height: 24),
  65. Flexible(
  66. flex: 1,
  67. child: Container(
  68. padding: const EdgeInsets.all(24),
  69. height: 400,
  70. width: double.infinity,
  71. child: SizedBox(
  72. width: double.infinity,
  73. child: Column(
  74. crossAxisAlignment: CrossAxisAlignment.start,
  75. children: [
  76. const Text('更新内容:'),
  77. Text(data.vMemo)
  78. ],
  79. ) ,
  80. ) ,
  81. ),
  82. ),
  83. const SizedBox(height: 24),
  84. SizedBox(
  85. height: 17.42,
  86. child: ClipRRect(
  87. borderRadius: const BorderRadius.all(Radius.circular(8.71)),
  88. child: Obx(() => LinearProgressIndicator(
  89. value: controller.downloadProcess.value),
  90. ) )
  91. ),
  92. const SizedBox(height: 100)
  93. ],
  94. ),
  95. ),
  96. ),
  97. )) ;
  98. }
  99. }
  100. void main() async {
  101. var c = AppUpdateController();
  102. c.downloadProcess.value = 0.5;
  103. Get.put(c);
  104. runApp(GetMaterialApp(
  105. theme: appThemeData(),
  106. home: AppUpdateView(pb.GetUpdateVersionReply()..vMemo= "更新内容")));
  107. }