|
|
|
@ -51,7 +51,8 @@ class EnterpriseListController extends GetxController { |
|
|
|
@override |
|
|
|
@override |
|
|
|
void onInit() { |
|
|
|
void onInit() { |
|
|
|
// 页面初始化时,启动完整的“同步-再加载”流程 |
|
|
|
// 页面初始化时,启动完整的“同步-再加载”流程 |
|
|
|
loadAndSyncEnterprises(); |
|
|
|
// loadAndSyncEnterprises(); |
|
|
|
|
|
|
|
search(); |
|
|
|
super.onInit(); |
|
|
|
super.onInit(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -96,51 +97,119 @@ class EnterpriseListController extends GetxController { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 弹出冲突选择对话框的辅助方法 |
|
|
|
// [修改后] 弹出冲突选择对话框的辅助方法 |
|
|
|
Future<Enterprise?> _showConflictDialog(EnterpriseConflict conflict) { |
|
|
|
Future<Enterprise?> _showConflictDialog(EnterpriseConflict conflict) { |
|
|
|
return Get.dialog<Enterprise>( |
|
|
|
return Get.dialog<Enterprise>( |
|
|
|
AlertDialog( |
|
|
|
AlertDialog( |
|
|
|
title: Text('数据冲突: ${conflict.localVersion.name}'), |
|
|
|
title: Text('数据冲突'), |
|
|
|
|
|
|
|
|
|
|
|
// [修改 1] 将所有内容(包括按钮)都放在 content 中 |
|
|
|
|
|
|
|
content: Column( |
|
|
|
content: Column( |
|
|
|
// mainAxisSize.min 让 Column 的高度自适应内容,防止它无限高 |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
// crossAxisAlignment.stretch 让所有子元素水平撑满 |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.stretch, |
|
|
|
crossAxisAlignment: CrossAxisAlignment.stretch, |
|
|
|
children: [ |
|
|
|
children: [ |
|
|
|
const Text('服务器上的数据与本地数据不一致,请选择要保留的版本。'), |
|
|
|
Text('${conflict.localVersion.name} 服务器上的数据与本地数据不一致,请选择要保留的版本。'), |
|
|
|
const SizedBox(height: 24), // 在文本和按钮之间添加一些间距 |
|
|
|
const SizedBox(height: 24), |
|
|
|
// 第一个按钮 |
|
|
|
|
|
|
|
ElevatedButton( |
|
|
|
// --- 本地版本选择区 --- |
|
|
|
child: Text( |
|
|
|
Row( |
|
|
|
'使用客户端版本\n(修改于: ${conflict.localVersion.lastModifiedTime.toUtc().toDateTimeString2()})', |
|
|
|
children: [ |
|
|
|
textAlign: TextAlign.center, |
|
|
|
// 使用 Expanded 让主按钮填充可用空间 |
|
|
|
), |
|
|
|
Expanded( |
|
|
|
onPressed: () => Get.back(result: conflict.localVersion), |
|
|
|
child: ElevatedButton( |
|
|
|
|
|
|
|
child: Text( |
|
|
|
|
|
|
|
'使用客户端版本\n(修改于: ${conflict.localVersion.lastModifiedTime.toLocal().toDateTimeString2()})', |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
onPressed: () => Get.back(result: conflict.localVersion), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
const SizedBox(width: 8), // 按钮间的间距 |
|
|
|
|
|
|
|
// 查看详情按钮 |
|
|
|
|
|
|
|
IconButton( |
|
|
|
|
|
|
|
icon: const Icon(Icons.info_outline), |
|
|
|
|
|
|
|
tooltip: '查看客户端版本详情', |
|
|
|
|
|
|
|
onPressed: () => navigateToDetailsView(conflict.localVersion), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
const SizedBox(height: 8), |
|
|
|
const SizedBox(height: 8), |
|
|
|
|
|
|
|
|
|
|
|
// 第二个按钮 |
|
|
|
// --- 服务器版本选择区 --- |
|
|
|
ElevatedButton( |
|
|
|
Row( |
|
|
|
style: ElevatedButton.styleFrom( |
|
|
|
children: [ |
|
|
|
backgroundColor: Get.theme.colorScheme.primary, |
|
|
|
Expanded( |
|
|
|
foregroundColor: Get.theme.colorScheme.onPrimary, |
|
|
|
child: ElevatedButton( |
|
|
|
), |
|
|
|
style: ElevatedButton.styleFrom( |
|
|
|
child: Text( |
|
|
|
backgroundColor: Get.theme.colorScheme.primary, |
|
|
|
'使用服务器版本\n(修改于: ${conflict.serverVersion.lastModifiedTime.toUtc().toDateTimeString2()})', |
|
|
|
foregroundColor: Get.theme.colorScheme.onPrimary, |
|
|
|
textAlign: TextAlign.center, |
|
|
|
), |
|
|
|
), |
|
|
|
child: Text( |
|
|
|
onPressed: () => Get.back(result: conflict.serverVersion), |
|
|
|
'使用服务器版本\n(修改于: ${conflict.serverVersion.lastModifiedTime.toLocal().toDateTimeString2()})', |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
onPressed: () => Get.back(result: conflict.serverVersion), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
const SizedBox(width: 8), |
|
|
|
|
|
|
|
IconButton( |
|
|
|
|
|
|
|
icon: const Icon(Icons.info_outline), |
|
|
|
|
|
|
|
tooltip: '查看服务器版本详情', |
|
|
|
|
|
|
|
onPressed: () => |
|
|
|
|
|
|
|
navigateToDetailsView(conflict.serverVersion), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
], |
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
|
|
|
|
|
|
|
|
// [修改 2] 不再需要 actions 属性 |
|
|
|
|
|
|
|
// actions: [ ... ], |
|
|
|
|
|
|
|
), |
|
|
|
), |
|
|
|
|
|
|
|
// 设置为 false,防止用户点击对话框外部意外关闭它 |
|
|
|
|
|
|
|
barrierDismissible: false, |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// // 弹出冲突选择对话框的辅助方法 |
|
|
|
|
|
|
|
// Future<Enterprise?> _showConflictDialog(EnterpriseConflict conflict) { |
|
|
|
|
|
|
|
// return Get.dialog<Enterprise>( |
|
|
|
|
|
|
|
// AlertDialog( |
|
|
|
|
|
|
|
// title: Text('数据冲突: ${conflict.localVersion.name}'), |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // [修改 1] 将所有内容(包括按钮)都放在 content 中 |
|
|
|
|
|
|
|
// content: Column( |
|
|
|
|
|
|
|
// // mainAxisSize.min 让 Column 的高度自适应内容,防止它无限高 |
|
|
|
|
|
|
|
// mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
// // crossAxisAlignment.stretch 让所有子元素水平撑满 |
|
|
|
|
|
|
|
// crossAxisAlignment: CrossAxisAlignment.stretch, |
|
|
|
|
|
|
|
// children: [ |
|
|
|
|
|
|
|
// const Text('服务器上的数据与本地数据不一致,请选择要保留的版本。'), |
|
|
|
|
|
|
|
// const SizedBox(height: 24), // 在文本和按钮之间添加一些间距 |
|
|
|
|
|
|
|
// // 第一个按钮 |
|
|
|
|
|
|
|
// ElevatedButton( |
|
|
|
|
|
|
|
// child: Text( |
|
|
|
|
|
|
|
// '使用客户端版本\n(修改于: ${conflict.localVersion.lastModifiedTime.toUtc().toDateTimeString2()})', |
|
|
|
|
|
|
|
// textAlign: TextAlign.center, |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// onPressed: () => Get.back(result: conflict.localVersion), |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// const SizedBox(height: 8), |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // 第二个按钮 |
|
|
|
|
|
|
|
// ElevatedButton( |
|
|
|
|
|
|
|
// style: ElevatedButton.styleFrom( |
|
|
|
|
|
|
|
// backgroundColor: Get.theme.colorScheme.primary, |
|
|
|
|
|
|
|
// foregroundColor: Get.theme.colorScheme.onPrimary, |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// child: Text( |
|
|
|
|
|
|
|
// '使用服务器版本\n(修改于: ${conflict.serverVersion.lastModifiedTime.toUtc().toDateTimeString2()})', |
|
|
|
|
|
|
|
// textAlign: TextAlign.center, |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// onPressed: () => Get.back(result: conflict.serverVersion), |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// ], |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // [修改 2] 不再需要 actions 属性 |
|
|
|
|
|
|
|
// // actions: [ ... ], |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// ); |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
void search() { |
|
|
|
void search() { |
|
|
|
loadEnterprises(); |
|
|
|
loadEnterprises(); |
|
|
|
@ -191,6 +260,17 @@ class EnterpriseListController extends GetxController { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// [新] 封装一个导航到详情页的辅助方法,避免代码重复 |
|
|
|
|
|
|
|
void navigateToDetailsView(Enterprise enterprise) { |
|
|
|
|
|
|
|
Get.toNamed( |
|
|
|
|
|
|
|
AppRoutes.enterpriseForm, |
|
|
|
|
|
|
|
arguments: { |
|
|
|
|
|
|
|
'data': enterprise, |
|
|
|
|
|
|
|
'mode': FormMode.view, // 关键:以只读模式打开 |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 导航到新增表单页面 |
|
|
|
/// 导航到新增表单页面 |
|
|
|
Future<void> navigateToAddForm() async { |
|
|
|
Future<void> navigateToAddForm() async { |
|
|
|
final result = await Get.toNamed( |
|
|
|
final result = await Get.toNamed( |
|
|
|
|