From 18c3b86e8a3743030eea0524c1ea546c97847dfe Mon Sep 17 00:00:00 2001 From: wyf <494641114@qq.com> Date: Wed, 17 Dec 2025 11:01:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9C=A0=E8=8A=B1=E7=B3=96?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=9F=8E=E5=B8=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/util/MyUtils.dart | 27 +- .../mh_controller/people_info_controller.dart | 86 +++++- lib/main.dart | 1 + lib/pages/mh_page/device/mht_people_info.dart | 276 ++++++++++++++++-- lib/pages/mh_page/people_info.dart | 166 ++++++++++- lib/pages/person/select_city.dart | 66 ++++- lib/pages/person/update_person_page.dart | 27 +- 7 files changed, 572 insertions(+), 77 deletions(-) diff --git a/lib/common/util/MyUtils.dart b/lib/common/util/MyUtils.dart index ba1b836..6393b5e 100644 --- a/lib/common/util/MyUtils.dart +++ b/lib/common/util/MyUtils.dart @@ -6,13 +6,13 @@ import 'package:flutter_svg/svg.dart'; import 'package:intl/intl.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:vbvs_app/common/color/app_uri_status.dart'; +import 'package:vbvs_app/common/pojo/city.dart'; import 'package:vbvs_app/common/util/CommonVariables.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/controller/mh_controller/mh_language_controller.dart'; import 'package:vbvs_app/controller/setting/language/language_controller.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; -import 'package:vbvs_app/language/AppLanguage.dart'; import 'package:vbvs_app/model/api_response.dart'; ThemeController themeController = Get.find(); @@ -20,6 +20,31 @@ LanguageController languageController = Get.find(); MHLanguageController mhLanguageController = Get.find(); class MyUtils { + // 获取城市显示文本 + // 更详细的显示逻辑(可选) + static String getDetailedCityDisplayText(CityModel? cityModel) { + if (cityModel == null) { + return '选择城市'.tr; + } + + // 根据数据层级显示不同的格式 + if (cityModel.city != null && cityModel.city!.isNotEmpty) { + // 三级数据:国家-省份-城市 + return '${cityModel.country ?? ''}-${cityModel.province ?? ''}-${cityModel.city ?? cityModel.value ?? ''}'; + } else if (cityModel.province != null && cityModel.province!.isNotEmpty) { + // 二级数据:国家-省份 + return '${cityModel.country ?? ''}-${cityModel.province ?? cityModel.value ?? ''}'; + } else if (cityModel.country != null && cityModel.country!.isNotEmpty) { + // 一级数据:国家 + return cityModel.country!; + } else if (cityModel.value != null && cityModel.value!.isNotEmpty) { + // 只有 value 字段 + return cityModel.value!; + } else { + return '选择城市'.tr; + } + } + static String formatTimestampToSleep(int milliseconds) { final date = DateTime.fromMillisecondsSinceEpoch(milliseconds); return "${date.year}-${date.month}-${date.day}"; diff --git a/lib/controller/mh_controller/people_info_controller.dart b/lib/controller/mh_controller/people_info_controller.dart index 42c8c80..17f02a7 100644 --- a/lib/controller/mh_controller/people_info_controller.dart +++ b/lib/controller/mh_controller/people_info_controller.dart @@ -5,6 +5,7 @@ import 'package:flutter/src/widgets/framework.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart'; +import 'package:vbvs_app/common/pojo/city.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; @@ -23,6 +24,7 @@ class PeopleInfoModel { String? phone; String? contact; List peopleList = []; + List cityModels = []; PeopleInfoModel(); factory PeopleInfoModel.fromJson(Map json) { @@ -43,25 +45,33 @@ class PeopleInfoController extends GetControllerEx { attr = GetModel(PeopleInfoModel()).obs; } + final CityModelController cityController = Get.find(); + @override Future onInit() async { super.onInit(); - // await getPeoples(Get.arguments['mac']); // 控制器创建时立即执行 + cityDataFuture = cityController.loadAndSetCityData().then((success) { + return cityController.cityList; + }); } + late Future> cityDataFuture; + getPeoples(String mac) async { String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.person_info; String queryUrl = "$serviceAddress$serviceName$serviceApi?mac=$mac"; - requestWithLog( + await requestWithLog( logTitle: "获取设备的人员信息列表", method: MyHttpMethod.get, queryUrl: queryUrl, onSuccess: (res) { if (res.data != null && res.data is List) { model.peopleList = res.data; + model.cityModels = []; // 清空之前的数据 + initializeCityData(); // 初始化城市数据 updateAll(); print("peopleList: ${model.peopleList}"); } @@ -96,4 +106,74 @@ class PeopleInfoController extends GetControllerEx { }, ); } -} + + Future initializeCityData() async { + try { + // 确保城市数据已加载 + if (!cityController.isDataLoaded) { + await cityController.loadAndSetCityData(); + } + + // 清空现有的城市模型列表 + model.cityModels = []; + + // 遍历peopleList中的每个人,查找对应的城市数据 + for (var person in model.peopleList) { + if (person is Map) { + // 获取person中的city_id + final cityId = person['city_id']?.toString(); + + if (cityId != null && cityId.isNotEmpty) { + ef.log("开始查找city_id: $cityId"); + + // 使用cityController查找完整的城市数据 + final CityModel? completeCityData = cityController.findCityById(cityId); + + if (completeCityData != null) { + // 将找到的城市数据添加到cityModels列表中 + model.cityModels.add(completeCityData); + ef.log("成功添加城市数据: ${completeCityData.displayName} for person: ${person['name'] ?? 'Unknown'}"); + } else { + // 如果找不到对应的城市数据,添加一个空的CityModel,但保留city_id + final CityModel emptyCityModel = CityModel(id: int.tryParse(cityId)); + model.cityModels.add(emptyCityModel); + ef.log("未找到对应城市数据,创建默认CityModel for city_id: $cityId"); + } + } else { + // 如果person没有city_id,添加一个空的CityModel + model.cityModels.add(CityModel()); + ef.log("person没有city_id,添加空CityModel"); + } + } + } + + // 确保cityModels列表长度与peopleList一致 + while (model.cityModels.length < model.peopleList.length) { + model.cityModels.add(CityModel()); + } + + // 更新UI + updateAll(); + + ef.log("初始化城市数据完成,peopleList长度: ${model.peopleList.length}, cityModels长度: ${model.cityModels.length}"); + } catch (e) { + ef.log("初始化城市数据失败: $e"); + } + } + + // 可选:添加一个方法来获取特定person的城市数据 + CityModel? getCityForPerson(int personIndex) { + if (personIndex >= 0 && personIndex < model.cityModels.length) { + return model.cityModels[personIndex]; + } + return null; + } + + // 可选:添加一个方法来更新特定person的城市数据 + void updateCityForPerson(int personIndex, CityModel cityModel) { + if (personIndex >= 0 && personIndex < model.cityModels.length) { + model.cityModels[personIndex] = cityModel; + updateAll(); + } + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 47f1b0f..3304064 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -912,6 +912,7 @@ class MyApp extends StatelessWidget { Get.lazyPut(() => AuthBindTelController()), Get.lazyPut(() => CommonMessageSettingController()), Get.lazyPut(() => MHTDeviceUpgradeController()), + Get.lazyPut(() => CityModelController()), ])); } diff --git a/lib/pages/mh_page/device/mht_people_info.dart b/lib/pages/mh_page/device/mht_people_info.dart index 2758290..0409f88 100644 --- a/lib/pages/mh_page/device/mht_people_info.dart +++ b/lib/pages/mh_page/device/mht_people_info.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:intl/intl.dart'; import 'package:vbvs_app/common/color/ServiceConstant.dart'; +import 'package:vbvs_app/common/pojo/city.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/common/util/requestWithLog.dart'; @@ -12,7 +13,9 @@ import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/pages/common/selectDialog.dart'; import 'package:vbvs_app/pages/mh_page/device/controller/mht_bluetooth_controller.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart'; +import 'package:vbvs_app/pages/person/select_city.dart'; +//保存人员信息 class MHTPeopleInfoPage extends StatefulWidget { const MHTPeopleInfoPage({Key? key}) : super(key: key); @@ -22,10 +25,13 @@ class MHTPeopleInfoPage extends StatefulWidget { class _MHTPeopleInfoPageState extends State { final MHTBlueToothController bluetoothController = Get.find(); + final CityModelController cityController = Get.find(); final List _nameControllers = []; final List _contactControllers = []; List> peopleList = []; + List cityModels = []; // 存储每个person的城市数据 bool isLoading = true; + late Future> cityDataFuture; @override void initState() { @@ -34,11 +40,19 @@ class _MHTPeopleInfoPageState extends State { } void _initializeData() async { + // 先加载城市数据 + cityDataFuture = cityController.loadAndSetCityData().then((success) { + return cityController.cityList; + }); + + // 等待城市数据加载完成后再初始化其他数据 + await cityDataFuture; + final device = bluetoothController.currentFullDevice; //todo 初始化传感器id // Initialize person A peopleList.add({ - 'mac'.tr: device?.macA, + 'mac': device?.macA, 'gender': 1, 'id': device!.macAID, }); @@ -46,12 +60,15 @@ class _MHTPeopleInfoPageState extends State { // Initialize person B if exists if (device?.macB != null && device!.macB!.isNotEmpty) { peopleList.add({ - 'mac'.tr: device.macB, + 'mac': device.macB, 'gender': 1, 'id': device!.macBID, }); } + // 初始化城市模型列表 + cityModels = List.filled(peopleList.length, CityModel()); + // Initialize controllers after data is loaded _initializeControllers(); setState(() => isLoading = false); @@ -100,12 +117,11 @@ class _MHTPeopleInfoPageState extends State { String serviceAddress = ServiceConstant.service_address; String serviceName = ServiceConstant.server_service; String serviceApi = ServiceConstant.personnel_info; - String type = "user_message_setting"; String queryUrl = "${serviceAddress}${serviceName}${serviceApi}"; try { var body = { - 'mac'.tr: personData['mac'.tr], + 'mac': personData['mac'], 'name': personData['name'], 'gender': personData['gender'], 'height': personData['height'], @@ -115,6 +131,8 @@ class _MHTPeopleInfoPageState extends State { : personData['birthday'], 'contact': personData['contact'], 'id': personData['id'], + 'UTC': personData['UTC'], + 'city_id': personData['city_id'], }; await requestWithLog( logTitle: "保存用户信息".tr, @@ -130,22 +148,83 @@ class _MHTPeopleInfoPageState extends State { print(res); }, ); - // showToast("保存成功(${personData['mac']})", color: color_success); } catch (e) { print("Error saving person data: $e"); - showToast("保存失败(${personData['mac']})"); + } + } + + // 根据城市ID查找完整的城市数据 + CityModel? findCompleteCityDataById(int? id, List cityData) { + if (id == null) return null; + + try { + // 遍历三级数据结构查找匹配的ID + for (var country in cityData) { + // 检查国家节点是否有ID匹配 + if (country.id == id) { + return CityModel( + id: country.id, + value: country.value, + label: country.label, + country: country.value ?? country.country, + province: null, + city: null, + UTC: country.UTC, + children: country.children, + ); + } + + // 检查省份节点 + for (var province in country.children ?? []) { + if (province.id == id) { + return CityModel( + id: province.id, + value: province.value, + label: province.label, + country: country.value ?? country.country, + province: province.value ?? province.province, + city: null, + UTC: province.UTC, + children: province.children, + ); + } + + // 检查城市节点 + for (var city in province.children ?? []) { + if (city.id == id) { + return CityModel( + id: city.id, + value: city.value, + label: city.label, + country: country.value ?? country.country, + province: province.value ?? province.province, + city: city.value ?? city.city, + UTC: city.UTC, + children: city.children, + ); + } + } + } + } + + return null; + } catch (e) { + print("根据ID查找完整城市数据失败:$e"); + return null; } } @override Widget build(BuildContext context) { if (isLoading) { - return Center(child:CircularProgressIndicator( - strokeWidth: 2, - valueColor: AlwaysStoppedAnimation( - themeController.currentColor.sc1, - ), - ),); + return Center( + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation( + themeController.currentColor.sc1, + ), + ), + ); } return LayoutBuilder( @@ -193,19 +272,84 @@ class _MHTPeopleInfoPageState extends State { borderRadius: 16.rpx, gradientDirection: GradientDirection.vertical, onTap: () async { - // Save all people data - for (var person in peopleList) { - await _savePersonData(person, context); + // 数据验证 + bool isValid = true; + + for (int i = 0; i < peopleList.length; i++) { + var person = peopleList[i]; + + // 验证身高 + if (person['height'] != null && + person['height'].toString().isNotEmpty && + int.tryParse(person['height'].toString()) == + null) { + TopSlideNotification.show(context, + text: "请选择身高".tr, + textColor: Color(0xFFFF7159)); + isValid = false; + break; + } + + // 验证体重 + if (person['weight'] != null && + person['weight'].toString().isNotEmpty && + int.tryParse(person['weight'].toString()) == + null) { + TopSlideNotification.show(context, + text: "请选择体重".tr, + textColor: Color(0xFFFF7159)); + isValid = false; + break; + } + + // 验证联系方式 + if (person['contact'] != null && + person['contact'].toString().isNotEmpty && + !MyUtils.isValidPhoneNumber( + person['contact'].toString())) { + TopSlideNotification.show(context, + text: "请输入正确的联系人电话".tr, + textColor: Color(0xFFFF7159)); + isValid = false; + break; + } + + // 验证城市选择 + final cityModel = cityModels[i]; + if (cityModel.id == null) { + TopSlideNotification.show(context, + text: "请选择城市".tr, + textColor: Color(0xFFFF7159)); + isValid = false; + break; + } + } + + if (isValid) { + // 保存所有人员数据 + for (int i = 0; i < peopleList.length; i++) { + final person = peopleList[i]; + final cityModel = cityModels[i]; + + // 添加城市信息到person数据 + person['UTC'] = cityModel.UTC; + person['city_id'] = cityModel.id; + + await _savePersonData(person, context); + } + + TopSlideNotification.show(context, text: "保存成功".tr); + MHTHomeController mhtHomeController = Get.find(); + mhtHomeController.getPersonList(); + + // 跳转到下一页 + Map data = {}; + final device = + bluetoothController.currentFullDevice; + data['_id'] = device!.deviceID; + data['isNextStep'] = true; + Get.toNamed("/editBedPage", arguments: data); } - TopSlideNotification.show(context, text: "保存成功".tr); - MHTHomeController mhtHomeController = Get.find(); - mhtHomeController.getPersonList(); - // Get.offNamed("/bindDeviceSuccess"); - Map data = {}; - final device = bluetoothController.currentFullDevice; - data['_id'] = device!.deviceID; - data['isNextStep'] = true; - Get.toNamed("/editBedPage", arguments: data); }, colors: const [ Color(0xFFFCFCFC), @@ -330,7 +474,7 @@ class _MHTPeopleInfoPageState extends State { const Duration(milliseconds: 250), () { showOneSelectionDialog(context, - title: "选择性别".tr, + title: "选择性别".tr, arr: ["女".tr, "男".tr], checkIndex: peopleList[index] ['gender'], @@ -400,7 +544,7 @@ class _MHTPeopleInfoPageState extends State { () { showHeightPickerDialog( context, - title: "选择分数".tr, + title: "选择身高".tr, initialHeight: int.tryParse( peopleList[index]['height'] ?? '170') ?? @@ -467,8 +611,7 @@ class _MHTPeopleInfoPageState extends State { () { showWeightPickerDialog( context, - title: "选择体重".tr, - + title: "选择体重".tr, initialWeight: "50", onConfirm: (int selectedWeight) { setState(() { @@ -531,7 +674,7 @@ class _MHTPeopleInfoPageState extends State { const Duration(milliseconds: 250), () { showDateSelectionDialog(context, - title: "选择生日".tr, + title: "选择生日".tr, checkDate: peopleList[index] ['birthday'] is DateTime ? peopleList[index]['birthday'] @@ -650,6 +793,80 @@ class _MHTPeopleInfoPageState extends State { ), ), getLine(), + // 城市选择部分 + Container( + height: 90.rpx, + margin: EdgeInsets.only( + left: 40.rpx, right: 35.rpx), + child: InkWell( + onTap: () { + FocusScope.of(context) + .requestFocus(FocusNode()); + Future.delayed( + const Duration(milliseconds: 250), + () { + showCitySelectionDialog( + context, + selectedCity: cityModels[index], + onCityChanged: (CityModel newCity) { + setState(() { + cityModels[index] = newCity; + }); + }, + title: "选择城市".tr, + cityDataFuture: cityDataFuture, + colors: CitySelectionColors( + pickerBackgroundColor: + stringToColor("#003058"), + confirmTextColor: + stringToColor("#84F5FF"), + selectedCityColor: + stringToColor("#84F5FF"), + ), + ); + }); + }, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '请选择城市'.tr, + style: TextStyle( + fontFamily: 'Readex Pro', + color: Color(0xFF9EA4B7), + fontSize: 30.rpx, + letterSpacing: 0, + ), + ), + Row( + children: [ + Text( + cityModels[index].id != null + ? MyUtils + .getDetailedCityDisplayText( + cityModels[index]) + : "请选择城市".tr, + style: TextStyle( + color: + cityModels[index].id != null + ? Colors.white + : themeController + .currentColor.sc4, + fontSize: 30.rpx, + ), + ), + SizedBox(width: 16.rpx), + Icon(Icons.expand_more, + color: Colors.white, + size: 48.rpx), + ], + ), + ], + ), + ), + ), + getLine(), ], )) ], @@ -667,3 +884,4 @@ class _MHTPeopleInfoPageState extends State { ); } } + diff --git a/lib/pages/mh_page/people_info.dart b/lib/pages/mh_page/people_info.dart index 5261c0f..f6da9d0 100644 --- a/lib/pages/mh_page/people_info.dart +++ b/lib/pages/mh_page/people_info.dart @@ -1,24 +1,22 @@ import 'dart:async'; import 'package:ef/ef.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; import 'package:flutter_svg/svg.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; +import 'package:vbvs_app/common/color/appConstants.dart'; +import 'package:vbvs_app/common/pojo/city.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; -import 'package:vbvs_app/controller/home/home_controller.dart'; -import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; import 'package:vbvs_app/controller/mh_controller/people_info_controller.dart'; -import 'package:vbvs_app/controller/person/person_controller.dart'; - import 'package:vbvs_app/pages/common/selectDialog.dart'; import 'package:vbvs_app/pages/mh_page/homepage/controller/mht_home_controller.dart'; import 'package:vbvs_app/pages/mh_page/test/WebviewTestModel.dart'; +import 'package:vbvs_app/pages/person/select_city.dart'; +//更新人员信息 class PeopleInfoPage extends GetView { Map data; PeopleInfoPage({required this.data}); @@ -32,9 +30,10 @@ class PeopleInfoPage extends GetView { } PeopleInfoController controller = Get.put(PeopleInfoController()); + @override Widget build(BuildContext context) { - getPersonData(); + getPersonData(); return LayoutBuilder( builder: (context, boxConstraints) => GestureDetector( onTap: () { @@ -123,6 +122,22 @@ class PeopleInfoPage extends GetView { isValid = false; break; } + // if (d['UTC'] == null || + // d['UTC'].toString().isEmpty) { + // TopSlideNotification.show(context, + // text: "请选择城市".tr, + // textColor: Color(0xFFFF7159)); + // isValid = false; + // break; + // } + // if (d['city_id'] ==null || + // d['city_id'].toString().isEmpty) { + // TopSlideNotification.show(context, + // text: "请选择城市".tr, + // textColor: Color(0xFFFF7159)); + // isValid = false; + // break; + // } } // 所有数据合法,开始保存 if (isValid) { @@ -785,6 +800,137 @@ class PeopleInfoPage extends GetView { ), ), getLine(), + Container( + height: 90.rpx, + margin: EdgeInsets.only( + left: 40.rpx, right: 35.rpx), + child: InkWell( + onTap: () { + // if (widget.status == + // BindType.share.code) { + // TopSlideNotification.show( + // context, + // text: "被分享用户只能修改用户名称", + // textColor: + // themeController + // .currentColor + // .sc9); + // return; + // } + FocusScope.of(context) + .requestFocus( + FocusNode()); + Future.delayed( + Duration( + milliseconds: 250), + () { + // 使用当前选中的城市数据,如果没有则创建默认 + CityModel? currentCity; + if (controller + .model + .cityModels + .isNotEmpty && + index < + controller + .model + .cityModels + .length) { + currentCity = controller + .model + .cityModels[index]; + } else { + currentCity = CityModel(); + } + + showCitySelectionDialog( + context, + selectedCity: currentCity, + onCityChanged: + (CityModel newCity) { + final list = controller + .model.cityModels; + if (index < + list.length) { + // 替换 + list[index] = newCity; + } else { + // 补齐并追加 + list.add(newCity); + } + controller.model + .peopleList[ + index]['UTC'] = + list[index].UTC; + controller.model + .peopleList[ + index] + ['city_id'] = list[ + index] + .id; + controller.updateAll(); + }, + + title: "选择城市".tr, + cityDataFuture: controller + .cityDataFuture, // 传入预加载的数据 + colors: + CitySelectionColors( + pickerBackgroundColor: + stringToColor( + "#003058"), + confirmTextColor: + stringToColor( + "#84F5FF"), + selectedCityColor: + stringToColor( + "#84F5FF"), + ), + ); + }); + }, + child: Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + '请选择城市'.tr, + style: TextStyle( + fontFamily: + 'Readex Pro', + color: + Color(0xFF9EA4B7), + fontSize: 30.rpx, + letterSpacing: 0, + ), + ), + Text( + getCityModel(index) != + null + ? MyUtils + .getDetailedCityDisplayText( + getCityModel( + index)) + : "请选择城市".tr, + style: TextStyle( + color: getCityModel( + index) != + null + ? themeController + .currentColor + .sc3 + : themeController + .currentColor + .sc4, + fontSize: AppConstants() + .title_text_fontSize, + ), + ), + ], + ), + ), + ), + getLine(), ], ), ) @@ -819,4 +965,10 @@ class PeopleInfoPage extends GetView { await peopleInfoController .getPeoples(Get.arguments['mac'.tr]); // 控制器创建时立即执行 } + + CityModel? getCityModel(int index) { + final list = controller.model.cityModels; + if (list.isEmpty || index >= list.length) return null; + return list[index]; + } } diff --git a/lib/pages/person/select_city.dart b/lib/pages/person/select_city.dart index 41f8f9a..f967cee 100644 --- a/lib/pages/person/select_city.dart +++ b/lib/pages/person/select_city.dart @@ -37,16 +37,35 @@ Future> loadCityData() async { } } +// 定义城市选择器颜色配置 +class CitySelectionColors { + final Color? pickerBackgroundColor; // 选择器整体背景色 + final Color? confirmTextColor; // 确定按钮文字颜色 + final Color? selectedCityColor; // 选中的城市背景色 + + const CitySelectionColors({ + this.pickerBackgroundColor, + this.confirmTextColor, + this.selectedCityColor, + }); +} + Future showCitySelectionDialog( BuildContext context, { required CityModel selectedCity, Function? onCityChanged, String title = "选择城市", required Future> cityDataFuture, // 改为required参数 + CitySelectionColors? colors, // 新增:颜色配置参数 }) { ThemeController themeController = Get.find(); final bool isChinese = Get.locale?.languageCode == 'zh' ?? true; + // 使用传入的颜色,如果没传则使用主题颜色 + final Color pickerBackgroundColor = colors?.pickerBackgroundColor ?? themeController.currentColor.sc17; + final Color confirmTextColor = colors?.confirmTextColor ?? themeController.currentColor.sc2; + final Color selectedCityColor = colors?.selectedCityColor ?? themeController.currentColor.sc2; + final RxList countries = [].obs; final RxList provinces = [].obs; final RxList cities = [].obs; @@ -243,12 +262,21 @@ Future showCitySelectionDialog( builder: (context, snapshot) { // 数据加载中 if (snapshot.connectionState == ConnectionState.waiting) { - return _buildLoadingBottomSheet(themeController); + return _buildLoadingBottomSheet( + themeController, + pickerBackgroundColor, + confirmTextColor, + ); } // 数据加载错误 if (snapshot.hasError || !snapshot.hasData) { - return _buildErrorBottomSheet(themeController, context); + return _buildErrorBottomSheet( + themeController, + context, + pickerBackgroundColor, + confirmTextColor, + ); } final cityData = snapshot.data!; @@ -265,6 +293,9 @@ Future showCitySelectionDialog( title, cityData, onCityChanged, + pickerBackgroundColor: pickerBackgroundColor, + confirmTextColor: confirmTextColor, + selectedCityColor: selectedCityColor, countries: countries, provinces: provinces, cities: cities, @@ -350,6 +381,9 @@ Widget _buildCityPickerContent( String title, List cityData, Function? onCityChanged, { + required Color pickerBackgroundColor, + required Color confirmTextColor, + required Color selectedCityColor, required RxList countries, required RxList provinces, required RxList cities, @@ -481,7 +515,7 @@ Widget _buildCityPickerContent( return Container( width: double.infinity, decoration: BoxDecoration( - color: themeController.currentColor.sc17, + color: pickerBackgroundColor, // 使用传入的选择器整体颜色 borderRadius: BorderRadius.only( topLeft: Radius.circular(20.rpx), topRight: Radius.circular(20.rpx), @@ -549,7 +583,7 @@ Widget _buildCityPickerContent( child: Text("确定".tr, style: TextStyle( fontSize: 30.rpx, - color: themeController.currentColor.sc2, + color: confirmTextColor, // 使用传入的确定文字颜色 )), ), ); @@ -600,7 +634,7 @@ Widget _buildCityPickerContent( height: 90.rpx, margin: EdgeInsets.symmetric(horizontal: 0.rpx), decoration: BoxDecoration( - color: themeController.currentColor.sc2, + color: selectedCityColor, // 使用传入的选中城市颜色 borderRadius: BorderRadius.circular(16.rpx), ), ), @@ -677,11 +711,15 @@ Widget _buildCityPickerContent( } // 加载中 BottomSheet -Widget _buildLoadingBottomSheet(ThemeController themeController) { +Widget _buildLoadingBottomSheet( + ThemeController themeController, + Color pickerBackgroundColor, + Color confirmTextColor, +) { return Container( width: double.infinity, decoration: BoxDecoration( - color: themeController.currentColor.sc17, + color: pickerBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(20.rpx), topRight: Radius.circular(20.rpx), @@ -692,7 +730,7 @@ Widget _buildLoadingBottomSheet(ThemeController themeController) { mainAxisSize: MainAxisSize.min, children: [ CircularProgressIndicator( - color: themeController.currentColor.sc2, + color: confirmTextColor, ), SizedBox(height: 20.rpx), Text( @@ -709,11 +747,15 @@ Widget _buildLoadingBottomSheet(ThemeController themeController) { // 错误 BottomSheet Widget _buildErrorBottomSheet( - ThemeController themeController, BuildContext context) { + ThemeController themeController, + BuildContext context, + Color pickerBackgroundColor, + Color confirmTextColor, +) { return Container( width: double.infinity, decoration: BoxDecoration( - color: themeController.currentColor.sc17, + color: pickerBackgroundColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(20.rpx), topRight: Radius.circular(20.rpx), @@ -739,7 +781,7 @@ Widget _buildErrorBottomSheet( child: Container( padding: EdgeInsets.symmetric(horizontal: 30.rpx, vertical: 15.rpx), decoration: BoxDecoration( - color: themeController.currentColor.sc2, + color: confirmTextColor, borderRadius: BorderRadius.circular(8.rpx), ), child: Text( @@ -754,4 +796,4 @@ Widget _buildErrorBottomSheet( ], ), ); -} +} \ No newline at end of file diff --git a/lib/pages/person/update_person_page.dart b/lib/pages/person/update_person_page.dart index a7e3f9a..cd55454 100644 --- a/lib/pages/person/update_person_page.dart +++ b/lib/pages/person/update_person_page.dart @@ -632,7 +632,7 @@ class _UpdatePageState extends State { }, child: Center( child: Text( - _getDetailedCityDisplayText( + MyUtils.getDetailedCityDisplayText( personController.cityModel), textAlign: TextAlign.right, style: TextStyle( @@ -650,6 +650,7 @@ class _UpdatePageState extends State { ), ), ), + Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 117.rpx, 0, 0), @@ -858,28 +859,4 @@ class _UpdatePageState extends State { ); } - // 获取城市显示文本 - // 更详细的显示逻辑(可选) - String _getDetailedCityDisplayText(CityModel? cityModel) { - if (cityModel == null) { - return '选择城市'.tr; - } - - // 根据数据层级显示不同的格式 - if (cityModel.city != null && cityModel.city!.isNotEmpty) { - // 三级数据:国家-省份-城市 - return '${cityModel.country ?? ''}-${cityModel.province ?? ''}-${cityModel.city ?? cityModel.value ?? ''}'; - } else if (cityModel.province != null && cityModel.province!.isNotEmpty) { - // 二级数据:国家-省份 - return '${cityModel.country ?? ''}-${cityModel.province ?? cityModel.value ?? ''}'; - } else if (cityModel.country != null && cityModel.country!.isNotEmpty) { - // 一级数据:国家 - return cityModel.country!; - } else if (cityModel.value != null && cityModel.value!.isNotEmpty) { - // 只有 value 字段 - return cityModel.value!; - } else { - return '选择城市'.tr; - } - } }