diff --git a/lib/main.dart b/lib/main.dart index 0b49948..28b8722 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:dating_touchme_app/config/env_config.dart'; import 'package:dating_touchme_app/network/network_service.dart'; import 'package:dating_touchme_app/pages/main_page.dart'; import 'package:dating_touchme_app/pages/mine/login_page.dart'; +import 'package:dating_touchme_app/pages/mine/user_info_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; @@ -73,7 +74,8 @@ class MyApp extends StatelessWidget { // 如果token不为空,显示主页;如果token为空,显示登录页面 if (token != null && token.isNotEmpty) { - return MainPage(); + // return MainPage(); + return UserInfoPage(); } else { return LoginPage(); } diff --git a/lib/pages/mine/user_info_controller.dart b/lib/pages/mine/user_info_controller.dart new file mode 100644 index 0000000..f8ccfbd --- /dev/null +++ b/lib/pages/mine/user_info_controller.dart @@ -0,0 +1,222 @@ +import 'dart:io'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:image_picker/image_picker.dart'; + +class UserInfoController extends GetxController { + // 用户信息表单字段 + final gender = 'male'.obs; // 默认选择男性 + final nickname = ''.obs; + final birthday = ''.obs; + final education = ''.obs; + final invitationCode = ''.obs; + final avatarUrl = ''.obs; + + // 加载状态 + final isSubmitting = false.obs; + + // GetStorage实例,用于存储用户信息 + final storage = GetStorage(); + + // 选择性别 + void selectGender(String selectedGender) { + gender.value = selectedGender; + // 打印选择的性别 + print('选择的性别: $selectedGender'); + // 显示选择结果 + SmartDialog.showToast('已选择${selectedGender == 'male' ? '男' : '女'}性'); + } + + // 选择日期 + void selectBirthday(String selectedDate) { + birthday.value = selectedDate; + // 打印选择的日期 + print('选择的出生日期: $selectedDate'); + // 显示选择结果 + SmartDialog.showToast('出生日期已选择'); + } + + // 选择学历 + void selectEducation(String selectedEducation) { + education.value = selectedEducation; + // 打印选择的学历 + print('选择的学历: $selectedEducation'); + // 显示选择结果 + SmartDialog.showToast('学历已选择'); + + + } + + // 选择头像 - 业务逻辑处理 + Future handleCameraCapture() async { + try { + // 请求相机权限并拍照 + final ImagePicker picker = ImagePicker(); + final XFile? photo = await picker.pickImage(source: ImageSource.camera); + + if (photo != null) { + await processSelectedImage(File(photo.path)); + } + } catch (e) { + print('拍照失败: $e'); + // 更友好的错误提示 + if (e.toString().contains('permission') || e.toString().contains('权限')) { + SmartDialog.showToast('相机权限被拒绝,请在设置中允许访问相机'); + } else if (e.toString().contains('camera') || e.toString().contains('相机')) { + SmartDialog.showToast('设备没有可用的相机'); + } else { + SmartDialog.showToast('拍照失败,请重试'); + } + } + } + + Future handleGallerySelection() async { + try { + // 从相册选择图片 + final ImagePicker picker = ImagePicker(); + final XFile? image = await picker.pickImage(source: ImageSource.gallery); + + if (image != null) { + await processSelectedImage(File(image.path)); + } + } catch (e) { + print('选择图片失败: $e'); + // 更友好的错误提示 + if (e.toString().contains('permission') || e.toString().contains('权限')) { + SmartDialog.showToast('相册权限被拒绝,请在设置中允许访问相册'); + } else { + SmartDialog.showToast('选择图片失败,请重试'); + } + } + } + + // 处理选中的图片 + Future processSelectedImage(File imageFile) async { + try { + // 显示加载提示 + SmartDialog.showLoading(msg: '正在处理头像...'); + + // 更新本地头像URL(实际项目中应该先上传到服务器) + // 这里直接使用本地文件路径作为临时URL + avatarUrl.value = imageFile.path; + + // 保存到本地存储 + final currentUserInfo = storage.read('userInfo') ?? {}; + if (currentUserInfo is Map) { + currentUserInfo['avatarUrl'] = imageFile.path; + await storage.write('userInfo', currentUserInfo); + } + + SmartDialog.dismiss(); + SmartDialog.showToast('头像设置成功'); + } catch (e) { + SmartDialog.dismiss(); + print('处理图片失败: $e'); + SmartDialog.showToast('处理图片失败'); + } + } + + // 选择头像入口方法(保持兼容性) + void selectAvatar() { + // 这个方法现在只是一个入口,实际的UI交互在页面中实现 + // 页面会调用上面的具体处理方法 + } + + // 验证表单 + bool _validateForm() { + // 验证昵称 + if (nickname.value.isEmpty) { + SmartDialog.showToast('请输入昵称'); + return false; + } + + // 验证生日 + if (birthday.value.isEmpty) { + SmartDialog.showToast('请选择出生日期'); + return false; + } + + // 验证学历 + if (education.value.isEmpty) { + SmartDialog.showToast('请选择学历'); + return false; + } + + return true; + } + + // 构建提交参数 + Map _buildSubmitParams() { + return { + 'gender': gender.value == 'male' ? 1 : 2, // 1:男, 2:女 + 'nickname': nickname.value, + 'birthday': birthday.value, + 'education': education.value, + if (invitationCode.value.isNotEmpty) 'invitationCode': invitationCode.value, + if (avatarUrl.value.isNotEmpty) 'avatarUrl': avatarUrl.value, + }; + } + + // 提交用户信息 + Future submitUserInfo() async { + // 验证表单 + if (!_validateForm()) { + return; + } + + isSubmitting.value = true; + + try { + // 构建请求参数 + final params = _buildSubmitParams(); + + // 调用UserApi中的完善用户信息接口 + // 注意:这里需要在UserApi中添加updateUserInfo方法 + // 由于目前没有看到完整的API定义,这里先模拟成功 + // 实际项目中应该调用真实的API + + // 模拟网络延迟 + await Future.delayed(const Duration(seconds: 1)); + + // 打印提交的信息 + print('提交用户信息参数: $params'); + + // 模拟成功响应 + // final response = await _userApi.updateUserInfo(params); + + // 处理响应 + // if (response.data.isSuccess) { + // 更新本地存储的用户信息 + final currentUserInfo = storage.read('userInfo') ?? {}; + if (currentUserInfo is Map) { + currentUserInfo.addAll({ + 'gender': gender.value, + 'nickname': nickname.value, + 'birthday': birthday.value, + 'education': education.value, + }); + await storage.write('userInfo', currentUserInfo); + } + + // 显示成功提示 + SmartDialog.showToast('信息提交成功!'); + // 延迟后跳转 + Future.delayed(const Duration(milliseconds: 1500), () { + // 跳转到主页面(暂时注释,实际使用时需要导入并替换正确的路由) + // Get.offAllNamed('/main'); + }); + // } else { + // Get.snackbar('错误', response.data.message); + // } + } catch (e) { + print('提交用户信息失败: $e'); + // 显示错误提示 + SmartDialog.showToast('提交失败,请重试'); + } finally { + isSubmitting.value = false; + } + } +} \ No newline at end of file diff --git a/lib/pages/mine/user_info_page.dart b/lib/pages/mine/user_info_page.dart index 358bc30..b323c68 100644 --- a/lib/pages/mine/user_info_page.dart +++ b/lib/pages/mine/user_info_page.dart @@ -1,393 +1,566 @@ +import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:get/get.dart'; +import 'user_info_controller.dart'; -class UserInfoPage extends StatefulWidget { +class UserInfoPage extends StatelessWidget { const UserInfoPage({Key? key}) : super(key: key); - @override - State createState() => _UserInfoPageState(); -} - -class _UserInfoPageState extends State { - String _gender = 'male'; // 默认选择男性 - String _nickname = '强壮的瘦子'; - String _birthday = ''; - String _education = ''; - String _invitationCode = ''; + // 显示头像选择选项 + void _showAvatarOptions(UserInfoController controller) { + showCupertinoModalPopup( + context: Get.context!, + builder: (context) => CupertinoActionSheet( + title: const Text('选择头像'), + actions: [ + CupertinoActionSheetAction( + child: const Text('拍照'), + onPressed: () async { + Navigator.pop(context); + await controller.handleCameraCapture(); + }, + ), + CupertinoActionSheetAction( + child: const Text('从相册选择'), + onPressed: () async { + Navigator.pop(context); + await controller.handleGallerySelection(); + }, + ), + ], + cancelButton: CupertinoActionSheetAction( + child: const Text('取消'), + isDestructiveAction: true, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + ); + } - @override - Widget build(BuildContext context) { - return Scaffold( - body: Stack( - children: [ - // 背景图 - Positioned.fill( - child: Image.asset( - Assets.imagesBgInformation, - fit: BoxFit.cover, - ), + // 显示学历选择弹框 + void _showEducationPicker(UserInfoController controller) { + final List educationOptions = ['大专以下', '大专', '本科', '硕士及以上']; + + showModalBottomSheet( + context: Get.context!, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(8), + topRight: Radius.circular(8), + ), + ), + builder: (BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, // 明确设置背景色 + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(8), + topRight: Radius.circular(8), + ), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 标题和关闭按钮 + Stack( + alignment: Alignment.center, + children: [ + // 关闭按钮 - 左对齐 + Align( + alignment: Alignment.centerLeft, + child: IconButton( + icon: const Icon(Icons.close), + onPressed: () { + Navigator.pop(context); + }, + ), + ), + // 标题 - 居中 + Text( + '学历', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, ), - // 内容区域 - SafeArea( - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: 20.0), - child: Column( - children: [ - // 标题 - const SizedBox(height: 20), - Text( - '完善信息', - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - color: Color.fromRGBO(51, 51, 51, 1), + ), + ], + ), + const SizedBox(height: 16), + + // 学历选项列表 + for (String education in educationOptions) + Container( + margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), // 左右10,上下6 + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: controller.education.value == education + ? const Color.fromRGBO(123, 104, 238, 1) // 紫色 + : const Color.fromRGBO(247, 247, 247, 1), + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 25), // 增加水平内边距 + minimumSize: const Size(double.infinity, 48), // 宽度充满,最小高度48 + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(32), + ), + elevation: 0, + ), + onPressed: () { + Navigator.pop(context); + controller.selectEducation(education); + }, + child: Text( + education, + style: TextStyle( + color: controller.education.value == education ? Colors.white : Colors.black, + fontSize: 16, + ), ), ), - const SizedBox(height: 30), - - // 头像 - Stack( + ), + + // 底部间距 + const SizedBox(height: 20), + ], + ), + ); + }, + ); + } + + // 显示日期选择器 + void _showDatePicker(UserInfoController controller) { + // 计算最小和最大日期 + final now = DateTime.now(); + final maxDate = DateTime(now.year - 18); // 最小18岁 + final minDate = DateTime(now.year - 80); // 最大80岁 + + // 初始选择日期(默认为25岁) + DateTime initialDate = DateTime(now.year - 25); + if (controller.birthday.value.isNotEmpty) { + try { + final List dateParts = controller.birthday.value.split('-'); + if (dateParts.length == 3) { + initialDate = DateTime( + int.parse(dateParts[0]), + int.parse(dateParts[1]), + int.parse(dateParts[2]), + ); + // 确保初始日期在有效范围内 + if (initialDate.isBefore(minDate)) initialDate = minDate; + if (initialDate.isAfter(maxDate)) initialDate = maxDate; + } + } catch (e) { + print('解析日期失败: $e'); + } + } + + // 临时存储选择的日期 + DateTime? selectedDate = initialDate; + + showCupertinoModalPopup( + context: Get.context!, + builder: (BuildContext context) { + return Container( + height: 300, + color: CupertinoColors.white, + child: Column( + children: [ + // 头部按钮区域 + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CupertinoButton( + child: const Text('取消'), + onPressed: () { + Navigator.pop(context); + }, + ), + CupertinoButton( + child: const Text('确定'), + onPressed: () { + Navigator.pop(context); + if (selectedDate != null) { + // 格式化为YYYY-MM-DD + final formattedDate = '${selectedDate!.year}-' + '${selectedDate!.month.toString().padLeft(2, '0')}-' + '${selectedDate!.day.toString().padLeft(2, '0')}'; + controller.selectBirthday(formattedDate); + } + }, + ), + ], + ), + ), + // 日期选择器 + Expanded( + child: CupertinoDatePicker( + mode: CupertinoDatePickerMode.date, + initialDateTime: initialDate, + minimumDate: minDate, + maximumDate: maxDate, + onDateTimeChanged: (DateTime dateTime) { + selectedDate = dateTime; + }, + use24hFormat: true, + backgroundColor: CupertinoColors.white, + ), + ), + ], + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return GetX( + init: UserInfoController(), + builder: (controller) { + return Scaffold( + body: Stack( + children: [ + // 背景图 + Positioned.fill( + child: Image.asset( + Assets.imagesBgInformation, + fit: BoxFit.cover, + ), + ), + // 内容区域 + SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Column( children: [ - Container( - width: 85, - height: 85, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Colors.grey, + // 标题 + const SizedBox(height: 20), + const Text( + '完善信息', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Color.fromRGBO(51, 51, 51, 1), ), - child: ClipOval( - // 这里可以替换为实际的头像图片 - child: Image.asset( - Assets.imagesAvatarsExample, - fit: BoxFit.cover, + ), + const SizedBox(height: 25), + + // 头像 + GestureDetector( + onTap: () => _showAvatarOptions(controller), + child: Stack( + children: [ + Container( + width: 85, + height: 85, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.grey, + ), + child: ClipOval( + // 根据avatarUrl显示头像,如果为空则显示默认图片 + child: controller.avatarUrl.value.isNotEmpty + ? Image.file( + File(controller.avatarUrl.value), + fit: BoxFit.cover, + width: 85, + height: 85, + ) + : Image.asset( + Assets.imagesAvatarsExample, + fit: BoxFit.cover, + ), + ), + ), + Positioned( + bottom: 0, + right: 0, + child: Container( + width: 20, + height: 20, + child: Stack( + children: [ + Center( + child: Image.asset( + Assets.imagesBgEditAvatars, + ), + ), + Center( + child: Image.asset( + Assets.imagesEditAvatarsIcon, + width: 12, + height: 12, + ), + ), + ], + ), + ), + ), + ], + ), + ), + const SizedBox(height: 25), + + // 性别选择 + const Align( + alignment: Alignment.centerLeft, + child: Text( + '性别 (注册后不可修改)', + style: TextStyle( + fontSize: 15, + color: Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500, ), ), ), - Positioned( - bottom: 0, - right: 0, - child: Container( - width: 30, - height: 30, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Colors.blue, + const SizedBox(height: 10), + Row( + children: [ + GestureDetector( + onTap: () => controller.selectGender('male'), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: controller.gender.value == 'male' ? Colors.black : Colors.grey[200], + ), + child: Row( + children: [ + Image.asset( + Assets.imagesManIcon, + width: 20, + height: 20, + color: controller.gender.value == 'male' ? Colors.white : Colors.black, + ), + const SizedBox(width: 5), + ], + ), + ), ), - child: Image.asset( - Assets.imagesBgEditAvatars, - width: 16, - height: 16, - color: Colors.white, + const SizedBox(width: 20), + GestureDetector( + onTap: () => controller.selectGender('female'), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + color: controller.gender.value == 'female' ? Colors.pink : Colors.grey[200], + ), + child: Row( + children: [ + Image.asset( + Assets.imagesWomenIcon, + width: 20, + height: 20, + color: controller.gender.value == 'female' ? Colors.white : Colors.black, + ), + const SizedBox(width: 5), + ], + ), ), + ), + ], + ), + const SizedBox(height: 25), + + // 昵称 + const Align( + alignment: Alignment.centerLeft, + child: Text( + '昵称', + style: TextStyle( + fontSize: 15, + color: Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500, + ), ), ), - ], - ), - const SizedBox(height: 30), - - // 性别选择 - const Align( - alignment: Alignment.centerLeft, - child: Text( - '性别 (注册后不可修改)', - style: TextStyle( - fontSize: 16, - color: Color.fromRGBO(144, 144, 144, 1), - fontWeight: FontWeight.w500, + const SizedBox(height: 10), + Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(32), + color: Color.fromRGBO(247, 247, 247, 1), + ), + child: Row( + children: [ + Expanded( + child: TextField( + controller: TextEditingController(text: controller.nickname.value), + onChanged: (value) { + controller.nickname.value = value; + }, + decoration: const InputDecoration( + border: InputBorder.none, + hintText: '请输入昵称', + hintStyle: TextStyle(color: Colors.grey), + ), + ), + ), + ], + ), ), - ), - ), - const SizedBox(height: 10), - Row( - children: [ + const SizedBox(height: 25), + + // 出生日期 + const Align( + alignment: Alignment.centerLeft, + child: Text( + '年龄', + style: TextStyle( + fontSize: 15, + color: Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500, + ), + ), + ), + const SizedBox(height: 10), GestureDetector( onTap: () { - setState(() { - _gender = 'male'; - }); + // 显示Cupertino日期选择器 + _showDatePicker(controller); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: _gender == 'male' ? Colors.black : Colors.grey[200], + borderRadius: BorderRadius.circular(32), + color: Color.fromRGBO(247, 247, 247, 1), ), child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Image.asset( - Assets.imagesManIcon, - width: 20, - height: 20, - color: _gender == 'male' ? Colors.white : Colors.black, + Text( + controller.birthday.value.isEmpty ? '请选择你的出生日期' : controller.birthday.value, + style: TextStyle( + color: controller.birthday.value.isEmpty ? Colors.grey : Colors.black, + ), ), - const SizedBox(width: 5), + const Icon(Icons.arrow_forward_ios, color: Colors.grey), ], ), ), ), - const SizedBox(width: 20), + const SizedBox(height: 25), + + // 学历 + const Align( + alignment: Alignment.centerLeft, + child: Text( + '学历', + style: TextStyle( + fontSize: 15, + color: Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500, + ), + ), + ), + const SizedBox(height: 10), GestureDetector( onTap: () { - setState(() { - _gender = 'female'; - }); + // 显示学历选择弹框 + _showEducationPicker(controller); }, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: _gender == 'female' ? Colors.pink : Colors.grey[200], + borderRadius: BorderRadius.circular(32), + color: Color.fromRGBO(247, 247, 247, 1), ), child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Image.asset( - Assets.imagesWomenIcon, - width: 20, - height: 20, - color: _gender == 'female' ? Colors.white : Colors.black, + Text( + controller.education.value.isEmpty ? '请选择你的学历' : controller.education.value, + style: TextStyle( + color: controller.education.value.isEmpty ? Colors.grey : Colors.black, + ), ), - const SizedBox(width: 5), + const Icon(Icons.arrow_forward_ios, color: Colors.grey), ], ), ), ), - ], - ), - const SizedBox(height: 30), - - // 昵称 - const Align( - alignment: Alignment.centerLeft, - child: Text( - '昵称', - style: TextStyle( - fontSize: 16, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ), - ), - const SizedBox(height: 10), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: Colors.white, - ), - child: Row( - children: [ - Expanded( - child: TextField( - controller: TextEditingController(text: _nickname), - onChanged: (value) { - _nickname = value; - }, - decoration: const InputDecoration( - border: InputBorder.none, - ), + const SizedBox(height: 25), + + // 邀请码 + const Align( + alignment: Alignment.centerLeft, + child: Text( + '邀请码 (非必填)', + style: TextStyle( + fontSize: 15, + color: Color.fromRGBO(144, 144, 144, 1), + fontWeight: FontWeight.w500, ), ), - TextButton( - onPressed: () { - // 随机昵称功能(不需要实现) + ), + const SizedBox(height: 10), + Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(32), + color: Color.fromRGBO(247, 247, 247, 1), + ), + child: TextField( + onChanged: (value) { + controller.invitationCode.value = value; }, - child: const Text( - '随机', - style: TextStyle( - color: Colors.grey, - ), + decoration: const InputDecoration( + hintText: '请输入邀请码', + hintStyle: TextStyle(color: Colors.grey), + border: InputBorder.none, ), ), - ], - ), - ), - const SizedBox(height: 30), - - // 出生日期 - const Align( - alignment: Alignment.centerLeft, - child: Text( - '年龄', - style: TextStyle( - fontSize: 16, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ), - ), - const SizedBox(height: 10), - GestureDetector( - onTap: () { - // 打开日期选择器 - _selectDate(); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: Colors.white, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - _birthday.isEmpty ? '请选择你的出生日期' : _birthday, - style: TextStyle( - color: _birthday.isEmpty ? Colors.grey : Colors.black, - ), - ), - const Icon(Icons.arrow_forward_ios, color: Colors.grey), - ], - ), - ), - ), - const SizedBox(height: 30), - - // 学历 - const Align( - alignment: Alignment.centerLeft, - child: Text( - '学历', - style: TextStyle( - fontSize: 16, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ), - ), - const SizedBox(height: 10), - GestureDetector( - onTap: () { - // 打开学历选择器 - _selectEducation(); - }, - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: Colors.white, ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - _education.isEmpty ? '请选择你的学历' : _education, - style: TextStyle( - color: _education.isEmpty ? Colors.grey : Colors.black, + const SizedBox(height: 50), + + // 开始交友按钮 + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + onPressed: controller.isSubmitting.value + ? null + : controller.submitUserInfo, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25), ), ), - const Icon(Icons.arrow_forward_ios, color: Colors.grey), - ], - ), - ), - ), - const SizedBox(height: 30), - - // 邀请码 - const Align( - alignment: Alignment.centerLeft, - child: Text( - '邀请码 (非必填)', - style: TextStyle( - fontSize: 16, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - ), - ), - const SizedBox(height: 10), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: Colors.white, - ), - child: TextField( - onChanged: (value) { - _invitationCode = value; - }, - decoration: const InputDecoration( - hintText: '请输入邀请码', - hintStyle: TextStyle(color: Colors.grey), - border: InputBorder.none, - ), - ), - ), - const SizedBox(height: 50), - - // 开始交友按钮 - SizedBox( - width: double.infinity, - height: 50, - child: ElevatedButton( - onPressed: () { - // 提交用户信息 - _submitUserInfo(); - }, - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - child: const Text( - '开始交友', - style: TextStyle( - fontSize: 18, - color: Colors.white, + child: controller.isSubmitting.value + ? const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : const Text( + '开始交友', + style: TextStyle( + fontSize: 18, + color: Colors.white, + ), + ), ), ), - ), + const SizedBox(height: 30), + ], ), - const SizedBox(height: 30), - ], + ), ), - ), + ], ), - ], - ), - ); - } - - // 选择日期 - void _selectDate() { - // 这里可以实现日期选择逻辑 - // 为了简单起见,我们先设置一个默认日期 - setState(() { - _birthday = '1990-01-01'; - }); - } - - // 选择学历 - void _selectEducation() { - // 这里可以实现学历选择逻辑 - // 为了简单起见,我们先设置一个默认学历 - setState(() { - _education = '本科'; - }); - } - - // 提交用户信息 - void _submitUserInfo() { - // 这里可以实现提交逻辑 - print('提交用户信息:'); - print('性别: $_gender'); - print('昵称: $_nickname'); - print('生日: $_birthday'); - print('学历: $_education'); - print('邀请码: $_invitationCode'); - - // 可以添加验证逻辑 - if (_birthday.isEmpty || _education.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('请完善所有必填信息')), - ); - return; - } - - // 提交成功后跳转到下一个页面 - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('信息提交成功')), + ); + }, ); } } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index a241428..1473b31 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "88.0.0" analyzer: @@ -14,7 +14,7 @@ packages: description: name: analyzer sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.1.1" ansicolor: @@ -22,7 +22,7 @@ packages: description: name: ansicolor sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" archive: @@ -30,7 +30,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.7" args: @@ -38,7 +38,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" async: @@ -46,7 +46,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.13.0" boolean_selector: @@ -54,7 +54,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" build: @@ -62,7 +62,7 @@ packages: description: name: build sha256: dfb67ccc9a78c642193e0c2d94cb9e48c2c818b3178a86097d644acdcde6a8d9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.2" build_config: @@ -70,7 +70,7 @@ packages: description: name: build_config sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" build_daemon: @@ -78,7 +78,7 @@ packages: description: name: build_daemon sha256: "409002f1adeea601018715d613115cfaf0e31f512cb80ae4534c79867ae2363d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.0" build_runner: @@ -86,7 +86,7 @@ packages: description: name: build_runner sha256: a9461b8e586bf018dd4afd2e13b49b08c6a844a4b226c8d1d10f3a723cdd78c3 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.10.1" built_collection: @@ -94,7 +94,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: @@ -102,7 +102,7 @@ packages: description: name: built_value sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.12.0" characters: @@ -110,7 +110,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" checked_yaml: @@ -118,7 +118,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.4" clock: @@ -126,7 +126,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" code_builder: @@ -134,7 +134,7 @@ packages: description: name: code_builder sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.11.0" collection: @@ -142,7 +142,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.19.1" convert: @@ -150,7 +150,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" cross_file: @@ -158,23 +158,23 @@ packages: description: name: cross_file sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.3.5" crypto: dependency: transitive description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.flutter-io.cn" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" csslib: dependency: transitive description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" cupertino_icons: @@ -182,7 +182,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.8" dart_style: @@ -190,7 +190,7 @@ packages: description: name: dart_style sha256: c87dfe3d56f183ffe9106a18aebc6db431fc7c98c31a54b952a77f3d54a85697 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" dio: @@ -198,7 +198,7 @@ packages: description: name: dio sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.9.0" dio_web_adapter: @@ -206,7 +206,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" event_bus: @@ -214,7 +214,7 @@ packages: description: name: event_bus sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" fake_async: @@ -222,7 +222,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.3" ffi: @@ -230,7 +230,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" file: @@ -238,7 +238,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" file_selector_linux: @@ -246,7 +246,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+2" file_selector_macos: @@ -254,7 +254,7 @@ packages: description: name: file_selector_macos sha256: "88707a3bec4b988aaed3b4df5d7441ee4e987f20b286cddca5d6a8270cab23f2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.4+5" file_selector_platform_interface: @@ -262,7 +262,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.6.2" file_selector_windows: @@ -270,7 +270,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+4" fixnum: @@ -278,7 +278,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" flutter: @@ -291,7 +291,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.0" flutter_localizations: @@ -304,7 +304,7 @@ packages: description: name: flutter_native_splash sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.7" flutter_plugin_android_lifecycle: @@ -312,7 +312,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.32" flutter_screenutil: @@ -320,7 +320,7 @@ packages: description: name: flutter_screenutil sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.9.3" flutter_smart_dialog: @@ -328,7 +328,7 @@ packages: description: name: flutter_smart_dialog sha256: "0852df132cb03fd8fc5144eb404c31eb7eb50c22aecb1cc2504f2f598090d756" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.8+9" flutter_test: @@ -346,7 +346,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" get: @@ -354,7 +354,7 @@ packages: description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.7.2" get_storage: @@ -362,7 +362,7 @@ packages: description: name: get_storage sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" glob: @@ -370,7 +370,7 @@ packages: description: name: glob sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.3" graphs: @@ -378,7 +378,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" hotreloader: @@ -386,7 +386,7 @@ packages: description: name: hotreloader sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" html: @@ -394,7 +394,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.15.6" http: @@ -402,7 +402,7 @@ packages: description: name: http sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.0" http_multi_server: @@ -410,7 +410,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.2" http_parser: @@ -418,7 +418,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.2" im_flutter_sdk: @@ -426,7 +426,7 @@ packages: description: name: im_flutter_sdk sha256: "952bd7a4846d9645adf6bf67c781573aba2825e12bbedfa7bb9f8b234bb1410b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" im_flutter_sdk_android: @@ -434,7 +434,7 @@ packages: description: name: im_flutter_sdk_android sha256: d809f8091b24bb70f55c8a1a040f7e0a27aef4756ac71549ce62e460f2151de6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" im_flutter_sdk_interface: @@ -442,7 +442,7 @@ packages: description: name: im_flutter_sdk_interface sha256: "82aef6f78bc7e4afc26768631262535b641cc885220981cc9deb871abf14efa8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" im_flutter_sdk_ios: @@ -450,7 +450,7 @@ packages: description: name: im_flutter_sdk_ios sha256: "5455ecd4e5877dd289051ca280ffb435d8f7f477a46f32bbb1bfc903dc03952a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.1" image: @@ -458,7 +458,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.5.4" image_picker: @@ -466,7 +466,7 @@ packages: description: name: image_picker sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" image_picker_android: @@ -474,7 +474,7 @@ packages: description: name: image_picker_android sha256: ca2a3b04d34e76157e9ae680ef16014fb4c2d20484e78417eaed6139330056f6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+7" image_picker_for_web: @@ -482,7 +482,7 @@ packages: description: name: image_picker_for_web sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.0" image_picker_ios: @@ -490,7 +490,7 @@ packages: description: name: image_picker_ios sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+1" image_picker_linux: @@ -498,7 +498,7 @@ packages: description: name: image_picker_linux sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" image_picker_macos: @@ -506,7 +506,7 @@ packages: description: name: image_picker_macos sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2+1" image_picker_platform_interface: @@ -514,7 +514,7 @@ packages: description: name: image_picker_platform_interface sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.11.1" image_picker_windows: @@ -522,7 +522,7 @@ packages: description: name: image_picker_windows sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" intl: @@ -530,7 +530,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.20.2" io: @@ -538,7 +538,7 @@ packages: description: name: io sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.5" json_annotation: @@ -546,7 +546,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.0" json_serializable: @@ -554,7 +554,7 @@ packages: description: name: json_serializable sha256: "33a040668b31b320aafa4822b7b1e177e163fc3c1e835c6750319d4ab23aa6fe" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.11.1" leak_tracker: @@ -562,7 +562,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "11.0.2" leak_tracker_flutter_testing: @@ -570,7 +570,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.10" leak_tracker_testing: @@ -578,7 +578,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.2" lean_builder: @@ -586,7 +586,7 @@ packages: description: name: lean_builder sha256: ef5cd5f907157eb7aa87d1704504b5a6386d2cbff88a3c2b3344477bab323ee9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.2" lints: @@ -594,7 +594,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" logging: @@ -602,7 +602,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" matcher: @@ -610,7 +610,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.12.17" material_color_utilities: @@ -618,7 +618,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.11.1" meta: @@ -626,7 +626,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.16.0" mime: @@ -634,7 +634,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" package_config: @@ -642,7 +642,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" path: @@ -650,7 +650,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" path_provider: @@ -658,7 +658,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.5" path_provider_android: @@ -666,7 +666,7 @@ packages: description: name: path_provider_android sha256: e122c5ea805bb6773bb12ce667611265980940145be920cd09a4b0ec0285cb16 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.20" path_provider_foundation: @@ -674,7 +674,7 @@ packages: description: name: path_provider_foundation sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" path_provider_linux: @@ -682,7 +682,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -690,7 +690,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" path_provider_windows: @@ -698,7 +698,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" petitparser: @@ -706,7 +706,7 @@ packages: description: name: petitparser sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" platform: @@ -714,7 +714,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.6" plugin_platform_interface: @@ -722,7 +722,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.8" pool: @@ -730,7 +730,7 @@ packages: description: name: pool sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.2" posix: @@ -738,7 +738,7 @@ packages: description: name: posix sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.0.3" protobuf: @@ -746,7 +746,7 @@ packages: description: name: protobuf sha256: "826d6a306be26f29e5cd9faeb0c97aad5897270341dab6dbd7b8acd675937006" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.0" pub_semver: @@ -754,7 +754,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" pubspec_parse: @@ -762,7 +762,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.0" retrofit: @@ -770,7 +770,7 @@ packages: description: name: retrofit sha256: "7d78824afa6eeeaf6ac58220910ee7a97597b39e93360d4bda230b7c6df45089" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.0" retrofit_generator: @@ -778,7 +778,7 @@ packages: description: name: retrofit_generator sha256: "47998fb9f214935e4eb00741aebc636ffcb62cb8ae73b474ac88127ce2744428" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.1.2" shelf: @@ -786,7 +786,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.2" shelf_web_socket: @@ -794,7 +794,7 @@ packages: description: name: shelf_web_socket sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" sky_engine: @@ -807,7 +807,7 @@ packages: description: name: source_gen sha256: "9098ab86015c4f1d8af6486b547b11100e73b193e1899015033cb3e14ad20243" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.2" source_helper: @@ -815,7 +815,7 @@ packages: description: name: source_helper sha256: "6a3c6cc82073a8797f8c4dc4572146114a39652851c157db37e964d9c7038723" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.8" source_span: @@ -823,7 +823,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.10.1" stack_trace: @@ -831,7 +831,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.12.1" stream_channel: @@ -839,7 +839,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" stream_transform: @@ -847,7 +847,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" string_scanner: @@ -855,7 +855,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" term_glyph: @@ -863,7 +863,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.2" test_api: @@ -871,7 +871,7 @@ packages: description: name: test_api sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.6" typed_data: @@ -879,7 +879,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" universal_io: @@ -887,7 +887,7 @@ packages: description: name: universal_io sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.2" vector_math: @@ -895,7 +895,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" vm_service: @@ -903,7 +903,7 @@ packages: description: name: vm_service sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "15.0.2" watcher: @@ -911,7 +911,7 @@ packages: description: name: watcher sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.4" web: @@ -919,7 +919,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" web_socket: @@ -927,7 +927,7 @@ packages: description: name: web_socket sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" web_socket_channel: @@ -935,7 +935,7 @@ packages: description: name: web_socket_channel sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.3" xdg_directories: @@ -943,7 +943,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" xml: @@ -951,7 +951,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.6.1" xxh3: @@ -959,7 +959,7 @@ packages: description: name: xxh3 sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" yaml: @@ -967,7 +967,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" sdks: