import 'package:flutter/material.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:dio/dio.dart'; import 'package:intl/intl.dart'; import 'package:jpush_flutter/jpush_flutter.dart'; import 'package:package_info/package_info.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_bugly/flutter_bugly.dart'; import './loginFirst.dart'; import '../styles/colors.dart'; import 'dart:io'; import 'dart:async'; import 'dart:ui'; import '../styles/totast.dart'; import 'ChangeUserInfo.dart'; import 'package:redux/redux.dart'; import 'package:flutter_redux/flutter_redux.dart'; import '../redux/AppState.dart'; import '../model/UserInfo.dart'; import '../net/HttpManager.dart'; import '../net/Result.dart'; import '../redux/UserRedux.dart'; import 'package:image_cropper/image_cropper.dart'; import '../widget/CheckUpgrade.dart'; class UserChange extends StatefulWidget { @override UserChangeState createState() => UserChangeState(); } class UserChangeState extends State { String version = ''; bool receiveMsg = false; final GlobalKey _dialogKey = GlobalKey(); @override void initState() { super.initState(); PackageInfo.fromPlatform().then((packageInfo) { setState(() { version = '当前版本:' + packageInfo.version; }); }); } @override Widget build(BuildContext context) { ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context); return StoreConnector( converter: (Store store) => store.state.userInfo, builder: (context, userInfo) { return WillPopScope( key: Key('UserChangesPage'), child: Scaffold( appBar: AppBar( title: Text('个人设置'), centerTitle: true, elevation: 0, ), body: Stack( children: [ RefreshIndicator( color: PRIMARY_COLOR, backgroundColor: Colors.white, displacement: 10, onRefresh: () async { await Future.delayed(const Duration(seconds: 1)); getUserInfo(); }, child: SizedBox.expand( child: SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), child: Column( children: [ _sectionDivier(), _section([ _cell( '头像', ClipOval( child: Image.network(userInfo.icon, width: 36, height: 36), ), onTap: () { _chooseImage(); }, ), _cell( '昵称', userInfo.nickname, placeholder: '请填写昵称', onTap: () { Navigator.push( context, CupertinoPageRoute( builder: (context) => ChangeUserInfo( title: '昵称', val: userInfo.nickname))); }, ), _cell( '性别', userInfo.sex, placeholder: '请添加性别信息', onTap: () { _chooseSex(context); }, ), _cell( '生日', DateFormat('yyyy-MM-dd').format( DateTime.fromMillisecondsSinceEpoch( userInfo.birthday), ), placeholder: '选择生日', onTap: () { _chooseBirthday(context); }, ), _cell('手机', userInfo.phone, onTap: () { Navigator.push( context, CupertinoPageRoute( builder: (context) => ChangeUserInfo( title: '手机号', val: userInfo.phone))); }), _cell('检查更新', version, showBorder: false, onTap: () async { Toast.show(context, '检查更新中', -1, 'loading'); final upgradeInfo = await FlutterBugly.getUpgradeInfo(); Toast.hide(); if (upgradeInfo != null) { showUpgradeDialog( context, upgradeInfo, _dialogKey); } else { Toast.show(context, '已是最新版本', 1500, 'info'); } }) ]), ], ), ), ), ), Positioned( bottom: 10, right: 15, left: 15, height: 48, child: FlatButton( textColor: Colors.white, color: PRIMARY_COLOR, highlightColor: Color(0xFF763434), child: Text( '退出登录', style: TextStyle( fontSize: 16, fontWeight: FontWeight.normal), ), onPressed: () async { Toast.show(context, '退出成功', 1500, 'success'); Navigator.push( context, MaterialPageRoute( builder: (context) => LoginFirst())); final prefs = await SharedPreferences.getInstance(); prefs.remove('token'); JPush jpush = JPush(); jpush.deleteAlias(); // Future.delayed(const Duration(seconds: 1), () { // StoreProvider.of(context).dispatch(UpdateUserAction(null)); // }); }), ) ], ), ), onWillPop: () { Toast.hide(); Navigator.pop(context); return Future.value(false); }); }); } Future updateUserInfo(userInfo, value, key) async { if (Toast.preToast == null) { Toast.show(context, '加载中', -1, 'loading'); } final Result res = await HttpManager.post('userInfo/update', data: {'id': userInfo.id, key: value}); Toast.hide(); if (res.success) { Toast.show(context, '修改成功', 1500, 'success'); getUserInfo(); } else { Toast.show(context, res.error, 1500, 'info'); } } Future getUserInfo() async { Result res = await HttpManager.get('userInfo/getUserInfo'); if (res.success) { StoreProvider.of(context) .dispatch(UpdateUserAction(UserInfo.fromJson(res.data))); } else {} } Future _chooseSex(BuildContext context) async { String sex = await showCupertinoModalPopup( context: context, builder: (BuildContext context) { return CupertinoActionSheet( title: Text('选择性别'), actions: [ CupertinoActionSheetAction( child: Text('男'), onPressed: () { Navigator.pop(context, '男'); }, ), CupertinoActionSheetAction( child: Text('女'), onPressed: () { Navigator.pop(context, '女'); }, ) ], cancelButton: CupertinoDialogAction( child: const Text('取消'), onPressed: () { Navigator.pop(context); }, ), ); }); if (sex != null) { updateUserInfo( StoreProvider.of(context).state.userInfo, sex, 'sex'); } } Future _chooseBirthday(BuildContext context) async { UserInfo userInfo = StoreProvider.of(context).state.userInfo; DateTime date = userInfo.birthday > 0 ? DateTime.fromMillisecondsSinceEpoch(userInfo.birthday) : DateTime.now(); DateTime res = await showCupertinoModalPopup( context: context, builder: (BuildContext context) { return Container( height: 216, color: CupertinoColors.white, child: Column( children: [ SizedBox( height: 44, child: Stack( children: [ Positioned( left: 0, top: 0, bottom: 0, child: CupertinoButton( padding: EdgeInsets.fromLTRB(15, 0, 0, 0), child: Text( '取消', style: TextStyle(color: PRIMARY_COLOR), ), onPressed: () { Navigator.of(context).pop(); }, ), ), Positioned( right: 0, top: 0, bottom: 0, child: CupertinoButton( padding: EdgeInsets.fromLTRB(0, 0, 15, 0), child: Text( '确定', style: TextStyle(color: PRIMARY_COLOR), ), onPressed: () { Navigator.of(context).pop(date); }, ), ) ], ), ), Expanded( flex: 1, child: DefaultTextStyle( style: const TextStyle( color: CupertinoColors.black, fontSize: 22.0, ), child: GestureDetector( // Blocks taps from propagating to the modal sheet and popping. onTap: () {}, child: SafeArea( top: false, child: CupertinoDatePicker( mode: CupertinoDatePickerMode.date, initialDateTime: date, onDateTimeChanged: (DateTime newDateTime) { date = newDateTime; }, ), ), ), ), ) ], ), ); }, ); if (res != null) { updateUserInfo(userInfo, res.millisecondsSinceEpoch, 'birthday'); } } Future _chooseImage() async { String path = await FilePicker.getFilePath(type: FileType.IMAGE); if (path == null) { return; } File croppedFile = await ImageCropper.cropImage( sourcePath: path, ratioX: 1.0, ratioY: 1.0, maxWidth: 512, maxHeight: 512, toolbarColor: PRIMARY_COLOR, ); if (croppedFile == null) { return; } Toast.show(context, '加载中', -1, 'loading'); Result res = await HttpManager.post('assets/uploadFile', data: { 'file': UploadFileInfo(croppedFile, croppedFile.path), }); Toast.hide(); if (res.success) { updateUserInfo(StoreProvider.of(context).state.userInfo, res.data[0], 'icon'); } } Widget _sectionDivier() { return SizedBox(height: 10); } Widget _section(List children) { return Container( color: SUB_COLOR, child: Column( children: children, ), ); } Widget _cell(String title, dynamic child, {String placeholder, void Function() onTap, bool showBorder = true}) { Widget secondChild; if (child == null || (child is String && child.isEmpty)) { secondChild = Text( placeholder ?? '', style: TextStyle(color: PLACEHOLDER_COLOR, fontSize: 13), ); } else if (child is String) { secondChild = Text( child ?? '', style: TextStyle(color: Colors.white, fontSize: 15), ); } else { secondChild = child; } return GestureDetector( onTap: onTap, child: Container( height: 60, padding: EdgeInsets.fromLTRB(15, 0, 15, 0), child: Container( decoration: BoxDecoration( border: Border( bottom: BorderSide( color: Color(0x2E000000), width: showBorder ? 1 : 0, ), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: Text( title ?? '', style: TextStyle(color: Colors.white, fontSize: 14), ), ), secondChild, Padding( padding: EdgeInsets.only(left: 2), child: Image.asset( 'images/icon_inter.png', width: 24, height: 24, ), ) ], ), ), ), ); } }