import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:vitalapp/architecture/utils/advance_debounce.dart'; import 'package:vitalapp/architecture/utils/prompt_box.dart'; import 'package:vitalapp/components/appbar.dart'; import 'package:vitalapp/components/button.dart'; import 'package:vitalapp/components/dialog_select.dart'; import 'package:vitalapp/components/no_data_view.dart'; import 'package:vitalapp/components/select.dart'; import 'package:vitalapp/database/entities/defines.dart'; import 'package:vitalapp/global.dart'; import 'controller.dart'; import 'widgets/data_table.dart'; import 'widgets/upload_dialog.dart'; class SyncCenterPage extends GetView { const SyncCenterPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: VAppBar(titleText: "同步管理"), body: Column( mainAxisSize: MainAxisSize.max, children: [ _Header(), const SyncDataTableHeader(), Expanded(child: const SyncDataTableBody()), ], ), ); } } class _Header extends GetView { @override Widget build(BuildContext context) { return Container( padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ _buildStateSelect(context), const SizedBox(width: 12), _buildUploadAll(), ], ), ); } Widget _buildUploadAll() { return SizedBox( width: 200, child: VButton( child: Row( mainAxisSize: MainAxisSize.min, children: const [ Icon(Icons.cloud_upload, size: 24), SizedBox(width: 12), Text("全部上传", style: TextStyle(fontSize: 18)), ], ), onTap: () { Debouncer.run( () async { if (!kIsOnline) { PromptBox.toast("请检查网络连接"); return; } final count = await controller.getCanUploadCount(); if (count == 0) { PromptBox.toast("未查询到待上传记录"); return; } final result = await SyncUploadDialog.show(); // 等待Dialog关闭动画完成 await Future.delayed(const Duration(milliseconds: 800)); controller.reloadPageList(); }, ); }, ), ); } Widget _buildStateSelect(BuildContext context) { return Row( mainAxisSize: MainAxisSize.min, children: [ const Text("上传状态:", style: TextStyle(fontSize: 18)), const SizedBox(width: 4), GestureDetector( child: Container( height: 56, width: 160, padding: const EdgeInsets.symmetric(horizontal: 18), alignment: Alignment.center, decoration: BoxDecoration( border: Border.all(color: Theme.of(context).primaryColor), borderRadius: BorderRadius.circular(16), ), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Expanded( child: Obx(() { int value = _convertSyncStateInt(controller.state.syncState); return Text( _getSyncStateDesc(value), style: const TextStyle( fontSize: 18, color: Colors.black87, ), ); }), ), const SizedBox(width: 12), Icon( Icons.arrow_drop_down, size: 36, color: Theme.of(context).primaryColor, ), ], ), ), onTap: () async { int value = _convertSyncStateInt(controller.state.syncState); final result = await VDialogSelect( title: "上传状态", source: [ -1, ...OfflineDataSyncState.values.map((e) => e.index).toList(), ], labelGetter: (data) => _getSyncStateDesc(data), valueGetter: (data) => data, initialValue: value, ).show(); if (result != null) { if (result == -1) { controller.state.syncState = null; } else { controller.state.syncState = OfflineDataSyncState.values[result]; } controller.reloadPageList(); } }, ), ], ); } static String _getSyncStateDesc(int state) { if (state == -1) { return "全部"; } return OfflineDataSyncState.values[state].getDescription(); } static int _convertSyncStateInt(OfflineDataSyncState? state) { int value = -1; if (state != null) { value = state.index; } return value; } }