import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/upload_result.dart'; import 'package:huixiang/retrofit/data/user_info.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/flutter_utils.dart'; import 'package:huixiang/view_widget/cupertino_date_picker.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:image_pickers/image_pickers.dart'; import 'package:intl/intl.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class UserInfoPage extends StatefulWidget { @override State createState() { return _UserInfoPage(); } } class _UserInfoPage extends State { ApiService apiService; Map modifyInfo = { "birth": "", "headimg": "", "nickname": "", "sex": "" }; @override void initState() { super.initState(); SharedPreferences.getInstance().then((value) => { print(value.getString('user')), user = UserInfo.fromJson(jsonDecode(value.getString('user'))), mobile = value.getString('mobile'), modifyInfo["nickname"] = user.nickname, modifyInfo["birth"] = user.birth, modifyInfo["headimg"] = user.headimg, modifyInfo["sex"] = user.sex, age = AppUtils.getAgeByString(user.birth), refresh(), apiService = ApiService(Dio(), context: context, token: value.getString('token')), }); } String age; String mobile = ""; String locale = "zh"; UserInfo user; refresh() async { setState(() {}); } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: S.of(context).zhanghaoxinxi, titleColor: Colors.black, background: Color(0xFFF7F7F7), leadingColor: Colors.black, ), body: Container( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: [ Container( margin: EdgeInsets.only(left: 16.w), child: Text( S.of(context).gerenxinxi, style: TextStyle( fontWeight: FontWeight.bold, color: Color(0xFF353535), fontSize: 16.sp, ), ), ), userInfo(), ], ), ), ); } Widget settingItem(left, right) { return Container( margin: EdgeInsets.fromLTRB(16, 8, 16, 8), padding: EdgeInsets.fromLTRB(20, 16, 20, 16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(8)), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ],), child: Row( children: [ Expanded( child: Text( left, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14.sp, color: Color(0xFF353535), ), ), flex: 1, ), Text( right, style: TextStyle( fontSize: 12.sp, color: Color(0xFF727272), ), ), SizedBox( width: 16.w, ), Icon( Icons.keyboard_arrow_right, size: 20, ), ], ), ); } Widget userInfo() { return Container( margin: EdgeInsets.fromLTRB(16, 32, 16, 16), padding: EdgeInsets.fromLTRB(20, 6, 20, 18), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(8)), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ), ], ), child: Column( children: [ InkWell( onTap: () { showImagePicker(); }, child: avatarItem(0, ""), ), InkWell( onTap: () { editname(); }, child: avatarItem(1, (modifyInfo["nickname"]) == "" ? "回乡" : modifyInfo["nickname"]), ), InkWell( onTap:(modifyInfo["birth"] == "")?showDateSelector:(){}, child: avatarItem( 2, (modifyInfo["birth"] != null && modifyInfo["birth"] != "") ? modifyInfo["birth"] : S.of(context).wanshanshengrixinxi_yhq), ), avatarItem(3, mobile), avatarItem( 4, (age == null || age == "") ? S.of(context).wanshanshengrixinxi_nl : S.of(context).sui(age)), ], ), ); } editname() async { dynamic name = await Navigator.of(context).pushNamed('/router/edit_name', arguments: {"nick": modifyInfo['nickname']}); if (name != null && name != "") { modifyInfo["nickname"] = name; setState(() {}); modifyInfos(); } } List itemLefts = [ S.current.touxiang, S.current.yonghuming, S.current.wodeshengri, S.current.shoujihao, S.current.wodenianling, ]; showDateSelector() async { DateTime dateTime = await showModalBottomSheet( backgroundColor: Colors.transparent, context: context, builder: (_) { return CupertinoDatePickerWidget(); }); if (dateTime != null ) { modifyInfo["birth"] = DateFormat("yyyy-MM-dd").format(dateTime); user.birth = modifyInfo["birth"]; age = AppUtils.getAge(dateTime); modifyInfos(); setState(() {}); } } ///显示图片选择方式 showImagePicker() { showCupertinoModalPopup( context: context, builder: (contetx) { return CupertinoActionSheet( title: Text(S.of(context).genghuantouxiang), actions: [ CupertinoActionSheetAction( child: Text(S.of(context).paizhao), onPressed: () { openCamera(); Navigator.of(context).pop(); }, isDefaultAction: true, isDestructiveAction: false, ), CupertinoActionSheetAction( child: Text(S.of(context).xiangce), onPressed: () { openStorage(); Navigator.of(context).pop(); }, isDefaultAction: true, isDestructiveAction: false, ), ], cancelButton: CupertinoActionSheetAction( onPressed: () { Navigator.of(context).pop(); }, child: Text(S.of(context).quxiao), isDestructiveAction: true, ), ); }); } ///拍照 openCamera() async { if (await Permission.camera.isGranted) { Media medias = await ImagePickers.openCamera( cameraMimeType: CameraMimeType.photo, cropConfig: CropConfig( enableCrop: true, width: 200, height: 200, ), compressSize: 500, ); if (medias == null) return; filePath = medias.path; fileUpload(); } else { await Permission.camera.request(); openCamera(); } } String filePath; ///打开相册 openStorage() async { if (await Permission.storage.isGranted) { List medias = await ImagePickers.pickerPaths( galleryMode: GalleryMode.image, selectCount: 1, showGif: true, showCamera: false, compressSize: 500, uiConfig: UIConfig( uiThemeColor: Color(0xFFFFFFFF), ), cropConfig: CropConfig( enableCrop: true, width: 200, height: 200, ), ); if (medias == null || medias.length == 0) return; filePath = medias[0].path; setState(() {}); fileUpload(); } else { await Permission.storage.request(); openStorage(); } } // Future cropImage(imagePath) async { // File croppedFile = await ImageCropper.cropImage( // sourcePath: imagePath, // aspectRatioPresets: [ // CropAspectRatioPreset.square, // // CropAspectRatioPreset.ratio3x2, // // CropAspectRatioPreset.original, // // CropAspectRatioPreset.ratio4x3, // // CropAspectRatioPreset.ratio16x9 // ], // aspectRatio: CropAspectRatio(ratioX: 1, ratioY: 1), // androidUiSettings: AndroidUiSettings( // toolbarTitle: 'Cropper', // toolbarColor: Colors.black, // toolbarWidgetColor: Colors.white, // initAspectRatio: CropAspectRatioPreset.square, // hideBottomControls: true, // lockAspectRatio: false), // iosUiSettings: IOSUiSettings( // minimumAspectRatio: 1.0, // resetAspectRatioEnabled: false, // aspectRatioPickerButtonHidden: true, // rectWidth: 500.w, // rectHeight: 500.h, // )); // return croppedFile; // } ///调用修改用户信息接口 modifyInfos() async { var info = await apiService.editInfo(modifyInfo).catchError((onError) {}); if (info.isSuccess) { setState(() { SmartDialog.showToast("用户信息修改成功", alignment: Alignment.center); }); } } ///文件上传 fileUpload() async { if (filePath != null && filePath != "" && await File(filePath).exists()) { BaseData baseData = await apiService.upload(File(filePath), 123123123,false).catchError((onError) {}); if (baseData != null && baseData.isSuccess) { UploadResult uploadResult = baseData.data; modifyInfo["headimg"] = uploadResult.url; modifyInfos(); } } } Widget avatarItem(type, value) { print("object: $value"); return Container( margin: EdgeInsets.only(top: 14.h, bottom: 14.h), child: Row( children: [ Expanded( child: Text( itemLefts[type], style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14.sp, color: Color(0xFF353535), ), ), flex: 1, ), buildValue(type, value), if (type != 4 && type != 3 && (((modifyInfo["birth"] == "")) || type != 2)) valueEnd(), ], ), ); } Widget valueEnd() { return Container( child: Row( children: [ SizedBox( width: 8.w, ), Icon( Icons.keyboard_arrow_right, size: 20.sp, ) ], ), ); } Widget buildValue(type, value) { if (type == 0) { return ClipRRect( borderRadius: BorderRadius.circular(4), child: filePath == null || filePath == "" ? (modifyInfo["headimg"] != null && modifyInfo["headimg"] != "" ? MImage( modifyInfo["headimg"], width: 42, height: 42, fit: BoxFit.cover, ) : Image.asset( "assets/image/default_1.png", width: 42, height: 42, fit: BoxFit.cover, )) : Image.file( File(filePath), width: 42, height: 42, fit: BoxFit.cover, ), ); } else if (type == 1) { return Text( value, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14.sp, color: Colors.black, ), ); } else { return Text( value, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14.sp, color: Color(0xFF727272), ), ); } } }