view.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:vitalapp/architecture/utils/advance_debounce.dart';
  4. import 'package:vitalapp/architecture/utils/prompt_box.dart';
  5. import 'package:vitalapp/components/appbar.dart';
  6. import 'package:vitalapp/components/button.dart';
  7. import 'package:vitalapp/components/dialog_select.dart';
  8. import 'package:vitalapp/components/no_data_view.dart';
  9. import 'package:vitalapp/components/select.dart';
  10. import 'package:vitalapp/database/entities/defines.dart';
  11. import 'package:vitalapp/global.dart';
  12. import 'controller.dart';
  13. import 'widgets/data_table.dart';
  14. import 'widgets/upload_dialog.dart';
  15. class SyncCenterPage extends GetView<SyncCenterController> {
  16. const SyncCenterPage({super.key});
  17. @override
  18. Widget build(BuildContext context) {
  19. return Scaffold(
  20. appBar: VAppBar(titleText: "同步管理"),
  21. body: Column(
  22. mainAxisSize: MainAxisSize.max,
  23. children: [
  24. _Header(),
  25. const SyncDataTableHeader(),
  26. Expanded(child: const SyncDataTableBody()),
  27. ],
  28. ),
  29. );
  30. }
  31. }
  32. class _Header extends GetView<SyncCenterController> {
  33. @override
  34. Widget build(BuildContext context) {
  35. return Container(
  36. padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8),
  37. child: Row(
  38. mainAxisAlignment: MainAxisAlignment.end,
  39. children: [
  40. _buildStateSelect(context),
  41. const SizedBox(width: 12),
  42. _buildUploadAll(),
  43. ],
  44. ),
  45. );
  46. }
  47. Widget _buildUploadAll() {
  48. return SizedBox(
  49. width: 200,
  50. child: VButton(
  51. child: Row(
  52. mainAxisSize: MainAxisSize.min,
  53. children: const [
  54. Icon(Icons.cloud_upload, size: 24),
  55. SizedBox(width: 12),
  56. Text("全部上传", style: TextStyle(fontSize: 18)),
  57. ],
  58. ),
  59. onTap: () {
  60. Debouncer.run(
  61. () async {
  62. if (!kIsOnline) {
  63. PromptBox.toast("请检查网络连接");
  64. return;
  65. }
  66. final count = await controller.getCanUploadCount();
  67. if (count == 0) {
  68. PromptBox.toast("未查询到待上传记录");
  69. return;
  70. }
  71. final result = await SyncUploadDialog.show();
  72. // 等待Dialog关闭动画完成
  73. await Future.delayed(const Duration(milliseconds: 800));
  74. controller.reloadPageList();
  75. },
  76. );
  77. },
  78. ),
  79. );
  80. }
  81. Widget _buildStateSelect(BuildContext context) {
  82. return Row(
  83. mainAxisSize: MainAxisSize.min,
  84. children: [
  85. const Text("上传状态:", style: TextStyle(fontSize: 18)),
  86. const SizedBox(width: 4),
  87. GestureDetector(
  88. child: Container(
  89. height: 56,
  90. width: 160,
  91. padding: const EdgeInsets.symmetric(horizontal: 18),
  92. alignment: Alignment.center,
  93. decoration: BoxDecoration(
  94. border: Border.all(color: Theme.of(context).primaryColor),
  95. borderRadius: BorderRadius.circular(16),
  96. ),
  97. child: Row(
  98. mainAxisAlignment: MainAxisAlignment.end,
  99. children: [
  100. Expanded(
  101. child: Obx(() {
  102. int value =
  103. _convertSyncStateInt(controller.state.syncState);
  104. return Text(
  105. _getSyncStateDesc(value),
  106. style: const TextStyle(
  107. fontSize: 18,
  108. color: Colors.black87,
  109. ),
  110. );
  111. }),
  112. ),
  113. const SizedBox(width: 12),
  114. Icon(
  115. Icons.arrow_drop_down,
  116. size: 36,
  117. color: Theme.of(context).primaryColor,
  118. ),
  119. ],
  120. ),
  121. ),
  122. onTap: () async {
  123. int value = _convertSyncStateInt(controller.state.syncState);
  124. final result = await VDialogSelect<int, int?>(
  125. title: "上传状态",
  126. source: [
  127. -1,
  128. ...OfflineDataSyncState.values.map((e) => e.index).toList(),
  129. ],
  130. labelGetter: (data) => _getSyncStateDesc(data),
  131. valueGetter: (data) => data,
  132. initialValue: value,
  133. ).show<int?>();
  134. if (result != null) {
  135. if (result == -1) {
  136. controller.state.syncState = null;
  137. } else {
  138. controller.state.syncState =
  139. OfflineDataSyncState.values[result];
  140. }
  141. controller.reloadPageList();
  142. }
  143. },
  144. ),
  145. ],
  146. );
  147. }
  148. static String _getSyncStateDesc(int state) {
  149. if (state == -1) {
  150. return "全部";
  151. }
  152. return OfflineDataSyncState.values[state].getDescription();
  153. }
  154. static int _convertSyncStateInt(OfflineDataSyncState? state) {
  155. int value = -1;
  156. if (state != null) {
  157. value = state.index;
  158. }
  159. return value;
  160. }
  161. }