From 75ac155bc8c968b50f227ec455f29827f00f8f49 Mon Sep 17 00:00:00 2001 From: oldchen <772565130@qq.com> Date: Wed, 21 Aug 2019 14:09:21 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8:=201.Add=20upload=20avatar=20to=20ser?= =?UTF-8?q?ver=202.Add=20change=20username=20to=20server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/config/api_service.dart | 89 +++++++++++++++++++++++------ lib/config/keys.dart | 1 + lib/i10n/localization_intl.dart | 5 ++ lib/i10n/messages_en_US.dart | 2 + lib/i10n/messages_zh_CN.dart | 2 + lib/json/all_beans.dart | 3 +- lib/json/upload_avatar_bean.dart | 29 ++++++++++ lib/logic/avatar_page_logic.dart | 84 +++++++++++++++++++++++++-- lib/logic/login_page_logic.dart | 1 + lib/logic/main_page_logic.dart | 92 ++++++++++++++++++++++++------ lib/model/main_page_model.dart | 20 ++++--- lib/pages/avatar_history_page.dart | 88 ++++++++++++++++++++++++---- lib/pages/login_page.dart | 9 --- lib/pages/nav_page.dart | 2 +- lib/widgets/edit_dialog.dart | 3 +- lib/widgets/login_widget.dart | 30 ++++++---- res/intl_en_US.arb | 12 ++++ res/intl_messages.arb | 14 ++++- res/intl_zh_CN.arb | 12 ++++ 19 files changed, 415 insertions(+), 83 deletions(-) create mode 100644 lib/json/upload_avatar_bean.dart diff --git a/lib/config/api_service.dart b/lib/config/api_service.dart index 96ace00..7c34995 100644 --- a/lib/config/api_service.dart +++ b/lib/config/api_service.dart @@ -57,17 +57,20 @@ class ApiService { Function error, CancelToken token}) { ApiStrategy.getInstance().postUpload( - "fUser/oneDaySuggestion", (data) { - CommonBean commonBean = CommonBean.fromMap(data); - if (commonBean.status == 0) { - success(commonBean); - } else { - failed(commonBean); - } - }, (count, total) {}, - formData: params, errorCallBack: (errorMessage) { - error(errorMessage); - }); + "fUser/oneDaySuggestion", + (data) { + CommonBean commonBean = CommonBean.fromMap(data); + if (commonBean.status == 0) { + success(commonBean); + } else { + failed(commonBean); + } + }, + (count, total) {}, + formData: params, + errorCallBack: (errorMessage) { + error(errorMessage); + }); } ///获取建议列表 @@ -78,8 +81,8 @@ class ApiService { }) { ApiStrategy.getInstance().get( "fUser/getSuggestion", - (data) { - success(data); + (data) { + success(data); }, errorCallBack: (errorMessage) { error(errorMessage); @@ -89,8 +92,13 @@ class ApiService { } ///通用的请求 - void postCommon(Map params, Function success, Function failed, - Function error, String url, CancelToken token) { + void postCommon( + {Map params, + Function success, + Function failed, + Function error, + String url, + CancelToken token}) { ApiStrategy.getInstance().post( url, (data) { @@ -157,11 +165,15 @@ class ApiService { } ///登录 - void login({Map params, Function success, Function failed, - Function error,}) { + void login({ + Map params, + Function success, + Function failed, + Function error, + }) { ApiStrategy.getInstance().post( "fUser/login", - (data) { + (data) { LoginBean login_bean = LoginBean.fromMap(data); if (login_bean.status == 0) { success(login_bean); @@ -174,4 +186,45 @@ class ApiService { error(errorMessage); }); } + + ///修改用户名 + void changeUserName( + {Map params, + Function success, + Function failed, + Function error, + CancelToken token}) { + postCommon( + params: params, + success: success, + failed: failed, + error: error, + url: "fUser/updateUserName", + token: token, + ); + } + + ///上传头像 + void uploadAvatar( + {FormData params, + Function success, + Function failed, + Function error, + CancelToken token}) { + ApiStrategy.getInstance().postUpload( + "fUser/uploadAvatar", + (data) { + UploadAvatarBean bean = UploadAvatarBean.fromMap(data); + if (bean.status == 0) { + success(bean); + } else { + failed(bean); + } + }, + (count, total) {}, + formData: params, + errorCallBack: (errorMessage) { + error(errorMessage); + }); + } } diff --git a/lib/config/keys.dart b/lib/config/keys.dart index 697c236..722e267 100644 --- a/lib/config/keys.dart +++ b/lib/config/keys.dart @@ -21,6 +21,7 @@ class Keys{ static final String enableWeatherShow = "enable_weather_show"; static final String currentUserName = "current_user_name"; static final String lastSuggestTime = "last_suggest_time"; + static final String token = "token"; } \ No newline at end of file diff --git a/lib/i10n/localization_intl.dart b/lib/i10n/localization_intl.dart index 6bee551..33e6164 100644 --- a/lib/i10n/localization_intl.dart +++ b/lib/i10n/localization_intl.dart @@ -314,8 +314,13 @@ class DemoLocalizations { String get pullUpToLoadMore => Intl.message('pull up load more', name: 'pullUpToLoadMore', desc: '上拉加载更多',); String get pullDownToRefresh => Intl.message('pull down to refresh', name: 'pullDownToRefresh', desc: '下拉刷新',); String get reLoading => Intl.message('click to reload', name: 'reLoading', desc: '点击重新加载',); + String get requestError => Intl.message('request error', name: 'requestError', desc: '请求错误',); + String get requestFailed => Intl.message('request failed', name: 'requestFailed', desc: '请求失败',); + + ///以下是版本更新相关 + String get version100 => Intl.message('Version:1.0.0 \n\n' 'The Version 1.0.0 released!\n', name: 'version100', desc: '版本:1.0.0 \n\n' '版本 1.0.0 发布啦!',); diff --git a/lib/i10n/messages_en_US.dart b/lib/i10n/messages_en_US.dart index ec31a11..1eba78a 100644 --- a/lib/i10n/messages_en_US.dart +++ b/lib/i10n/messages_en_US.dart @@ -126,6 +126,8 @@ class MessageLookup extends MessageLookupByLibrary { "register" : MessageLookupByLibrary.simpleMessage("Register"), "remindMe" : MessageLookupByLibrary.simpleMessage("remind me"), "repeat" : MessageLookupByLibrary.simpleMessage("repeat"), + "requestError" : MessageLookupByLibrary.simpleMessage("request error"), + "requestFailed" : MessageLookupByLibrary.simpleMessage("request failed"), "restrictedDes" : MessageLookupByLibrary.simpleMessage("Permission is restricted"), "save" : MessageLookupByLibrary.simpleMessage("save"), "searchIcon" : MessageLookupByLibrary.simpleMessage("Try searching for icon name"), diff --git a/lib/i10n/messages_zh_CN.dart b/lib/i10n/messages_zh_CN.dart index 487195a..97b34a7 100644 --- a/lib/i10n/messages_zh_CN.dart +++ b/lib/i10n/messages_zh_CN.dart @@ -126,6 +126,8 @@ class MessageLookup extends MessageLookupByLibrary { "register" : MessageLookupByLibrary.simpleMessage("注册"), "remindMe" : MessageLookupByLibrary.simpleMessage("提醒我"), "repeat" : MessageLookupByLibrary.simpleMessage("重复"), + "requestError" : MessageLookupByLibrary.simpleMessage("请求错误"), + "requestFailed" : MessageLookupByLibrary.simpleMessage("请求失败"), "restrictedDes" : MessageLookupByLibrary.simpleMessage("权限被限制"), "save" : MessageLookupByLibrary.simpleMessage("保存"), "searchIcon" : MessageLookupByLibrary.simpleMessage("搜索图标名字"), diff --git a/lib/json/all_beans.dart b/lib/json/all_beans.dart index 15aca6e..b021ac9 100644 --- a/lib/json/all_beans.dart +++ b/lib/json/all_beans.dart @@ -2,4 +2,5 @@ export 'common_bean.dart'; export 'photo_bean.dart'; export 'update_info_bean.dart'; export 'weather_bean.dart'; -export 'login_bean.dart'; \ No newline at end of file +export 'login_bean.dart'; +export 'upload_avatar_bean.dart'; \ No newline at end of file diff --git a/lib/json/upload_avatar_bean.dart b/lib/json/upload_avatar_bean.dart new file mode 100644 index 0000000..1f13c47 --- /dev/null +++ b/lib/json/upload_avatar_bean.dart @@ -0,0 +1,29 @@ +class UploadAvatarBean { + + /** + * description : "头像上传成功" + * filePath : "files/772565130@qq.com/2019/7/avatar.jpg" + * status : 0 + */ + + String description; + String filePath; + int status; + + static UploadAvatarBean fromMap(Map map) { + UploadAvatarBean upload_avatar_bean = new UploadAvatarBean(); + upload_avatar_bean.description = map['description']; + upload_avatar_bean.filePath = map['filePath']; + upload_avatar_bean.status = map['status']; + return upload_avatar_bean; + } + + static List fromMapList(dynamic mapList) { + List list = new List(mapList.length); + for (int i = 0; i < mapList.length; i++) { + list[i] = fromMap(mapList[i]); + } + return list; + } + +} diff --git a/lib/logic/avatar_page_logic.dart b/lib/logic/avatar_page_logic.dart index 5a989f2..99788e8 100644 --- a/lib/logic/avatar_page_logic.dart +++ b/lib/logic/avatar_page_logic.dart @@ -2,7 +2,9 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:todo_list/config/api_service.dart'; import 'package:todo_list/i10n/localization_intl.dart'; +import 'package:todo_list/json/upload_avatar_bean.dart'; import 'package:todo_list/model/all_model.dart'; import 'package:image_crop/image_crop.dart'; import 'package:todo_list/pages/avatar_history_page.dart'; @@ -79,15 +81,85 @@ class AvatarPageLogic { String name = '${DateTime.now().millisecondsSinceEpoch}.jpg'; File newFile = file.copySync(newPath + name); if (newFile.existsSync()) { - await SharedUtil.instance.saveString(Keys.localAvatarPath,newFile.path); - await SharedUtil.instance.saveInt(Keys.currentAvatarType, CurrentAvatarType.local); - _model.mainPageModel.currentAvatarType = CurrentAvatarType.local; - _model.mainPageModel.currentAvatarUrl = newFile.path; - _model.mainPageModel.refresh(); - Navigator.of(_model.context).pop(); + final account = await SharedUtil.instance.getString(Keys.account); + if(account == "default" || account == null){ + await _saveImageData(newFile.path); + } else{ + final token = await SharedUtil.instance.getString(Keys.token); + final path = newFile.path; + String fileName = path + .substring(path.lastIndexOf("/") + 1, path.length) + .replaceAll(" ", ""); + String transFormName = Uri.encodeFull(fileName).replaceAll("%", ""); + + uploadAvatar(account,token, path, transFormName); + } } } + Future _saveImageData(String filePath) async { + await SharedUtil.instance.saveString(Keys.localAvatarPath,filePath); + await SharedUtil.instance.saveInt(Keys.currentAvatarType, CurrentAvatarType.local); + _model.mainPageModel.currentAvatarType = CurrentAvatarType.local; + _model.mainPageModel.currentAvatarUrl = filePath; + _model.mainPageModel.refresh(); + Navigator.of(_model.context).pop(); + } + + void uploadAvatar(String account, String token, String filePath, String fileName) async{ + final context = _model.context; + CancelToken cancelToken = CancelToken(); + _showLoadingDialog(context); + ApiService.instance.uploadAvatar( + params: FormData.from({ + "avatar": new UploadFileInfo(new File(filePath), fileName), + "account": account, + "token": token + }), + success: (UploadAvatarBean bean){ + Navigator.pop(context); + _saveImageData(filePath); + }, + failed: (UploadAvatarBean bean){ + Navigator.pop(context); + _showTextDialog(bean.description); + }, + error: (msg){ + Navigator.pop(context); + _showTextDialog(msg); + }, + token: cancelToken, + ); + } + + void _showLoadingDialog(BuildContext context) { + showDialog(context: context, builder: (ctx){ + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20.0))), + content: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Theme.of(context).primaryColor), + ), + ); + }); + } + + void _showTextDialog(String text){ + final context = _model.context; + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20.0))), + content: Text( + text), + ); + }); + } + ImageProvider getAvatarProvider() { final avatarType = _model.currentAvatarType; final url = _model.currentAvatarUrl; diff --git a/lib/logic/login_page_logic.dart b/lib/logic/login_page_logic.dart index b3e427d..18b715b 100644 --- a/lib/logic/login_page_logic.dart +++ b/lib/logic/login_page_logic.dart @@ -94,6 +94,7 @@ class LoginPageLogic { SharedUtil.instance.saveString(Keys.account, account).then((value){ SharedUtil.instance.saveString(Keys.password, encryptPassword); SharedUtil.instance.saveString(Keys.currentUserName, loginBean.username); + SharedUtil.instance.saveString(Keys.token, loginBean.token); }).then((v){ Navigator.of(context).pushAndRemoveUntil( new MaterialPageRoute( diff --git a/lib/logic/main_page_logic.dart b/lib/logic/main_page_logic.dart index 2d9e1a6..ae0709a 100644 --- a/lib/logic/main_page_logic.dart +++ b/lib/logic/main_page_logic.dart @@ -9,6 +9,7 @@ import 'package:todo_list/database/database.dart'; import 'package:todo_list/i10n/localization_intl.dart'; import 'package:todo_list/items/task_item.dart'; import 'package:todo_list/json/color_bean.dart'; +import 'package:todo_list/json/common_bean.dart'; import 'package:todo_list/json/task_bean.dart'; import 'package:todo_list/json/update_info_bean.dart'; import 'package:todo_list/model/all_model.dart'; @@ -17,6 +18,7 @@ import 'package:todo_list/utils/shared_util.dart'; import 'package:todo_list/utils/theme_util.dart'; import 'package:todo_list/widgets/edit_dialog.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:todo_list/widgets/net_loading_widget.dart'; import 'package:todo_list/widgets/update_dialog.dart'; import 'package:package_info/package_info.dart'; @@ -250,33 +252,89 @@ class MainPageLogic { return EditDialog( title: DemoLocalizations.of(context).customUserName, hintText: DemoLocalizations.of(context).inputUserName, + positiveWithPop: false, onValueChanged: (text) { - _model.currentUserName = text; + _model.currentEditingUserName = text; }, initialValue: _model.currentUserName, - onPositive: () { - if (_model.currentUserName.isEmpty) { - showDialog( - context: context, - builder: (ctx) { - return AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.all(Radius.circular(20.0))), - content: Text( - DemoLocalizations.of(context).userNameCantBeNull), - ); - }); + onPositive: () async{ + if (_model.currentEditingUserName.isEmpty) { + _showTextDialog(DemoLocalizations.of(context).userNameCantBeNull); return; } - SharedUtil.instance - .saveString(Keys.currentUserName, _model.currentUserName); - _model.refresh(); + final account = await SharedUtil.instance.getString(Keys.account); + if(account == "default" || account == null){ + _model.currentUserName = _model.currentEditingUserName; + SharedUtil.instance.saveString(Keys.currentUserName, _model.currentUserName); + Navigator.of(context).pop(); + _model.refresh(); + } else{ + _changeUserName(account, _model.currentEditingUserName); + } }, ); }); } + void _showTextDialog(String text){ + final context = _model.context; + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20.0))), + content: Text( + text), + ); + }); + } + + void _changeUserName(String account, String userName) async{ + final context = _model.context; + final token = await SharedUtil.instance.getString(Keys.token); + CancelToken cancelToken = CancelToken(); + _showLoadingDialog(context); + ApiService.instance.changeUserName( + success: (bean) async { + _model.currentUserName = _model.currentEditingUserName; + SharedUtil.instance.saveString(Keys.currentUserName, _model.currentUserName); + Navigator.of(context).pop(); + _model.refresh(); + Navigator.pop(context); + }, + error: (msg) { + Navigator.of(context).pop(); + _showTextDialog(msg); + }, + failed: (CommonBean commonBean){ + Navigator.of(context).pop(); + _showTextDialog(commonBean.description); + }, + params: { + "account": account, + "token": token, + "userName": userName + }, + token: cancelToken, + ); + } + + void _showLoadingDialog(BuildContext context) { + showDialog(context: context, builder: (ctx){ + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20.0))), + content: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Theme.of(context).primaryColor), + ), + ); + }); + } + + void onSearchTap() { Navigator.of(_model.context).push(new CupertinoPageRoute(builder: (ctx) { return ProviderConfig.getInstance().getSearchPage(); diff --git a/lib/model/main_page_model.dart b/lib/model/main_page_model.dart index bc08be1..1212774 100644 --- a/lib/model/main_page_model.dart +++ b/lib/model/main_page_model.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:todo_list/database/database.dart'; import 'package:todo_list/logic/all_logic.dart'; import 'package:todo_list/json/task_bean.dart'; +import 'package:todo_list/widgets/net_loading_widget.dart'; import 'global_model.dart'; @@ -11,27 +12,32 @@ class MainPageModel extends ChangeNotifier { final GlobalKey scaffoldKey = GlobalKey(); List tasks = []; - //当前滑动的卡片位置 + ///当前滑动的卡片位置 int currentCardIndex = 0; - //当前点击进入详情页的index,方便在详情页里面操作删除、更新等 + ///当前点击进入详情页的index,方便在详情页里面操作删除、更新等 int currentTapIndex = 0; - //当前头像的类型 + ///当前头像的类型 int currentAvatarType = CurrentAvatarType.defaultAvatar; - //当前的头像url,比如本地的就是本地路径,网络就是网络地址 + ///当前的头像url,比如本地的就是本地路径,网络就是网络地址 String currentAvatarUrl = "images/icon.png"; - //当前的用户名 + ///当前的用户名 String currentUserName = ""; - //是否开启天气 + ///当前正在编辑中的用户名 + String currentEditingUserName = ""; + + ///是否开启天气 bool enableWeatherShow = false; - //当前位置信息 + ///当前位置信息 String currentPosition = ""; + + MainPageModel() { logic = MainPageLogic(this); } diff --git a/lib/pages/avatar_history_page.dart b/lib/pages/avatar_history_page.dart index 8c0aa04..f694aa1 100644 --- a/lib/pages/avatar_history_page.dart +++ b/lib/pages/avatar_history_page.dart @@ -1,7 +1,9 @@ import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:todo_list/config/api_service.dart'; import 'package:todo_list/i10n/localization_intl.dart'; +import 'package:todo_list/json/upload_avatar_bean.dart'; import 'package:todo_list/model/avatar_page_model.dart'; import 'package:todo_list/model/main_page_model.dart'; import 'package:todo_list/utils/file_util.dart'; @@ -46,21 +48,24 @@ class _AvatarHistoryPageState extends State { padding: EdgeInsets.all(10), children: List.generate(avatarPaths.length, (index) { - final url = avatarPaths[index]; - final name = url.split("/").last; + final path = avatarPaths[index]; + final name = path.split("/").last; return Stack( children: [ InkWell( onTap: () async { - final avatarPageModel = widget.avatarPageModel; - final mainPageModel = avatarPageModel.mainPageModel; - mainPageModel.currentAvatarUrl = url; - mainPageModel.currentAvatarType = CurrentAvatarType.local; - await SharedUtil.instance.saveString(Keys.localAvatarPath, url); - await SharedUtil.instance.saveInt(Keys.currentAvatarType, CurrentAvatarType.local); - mainPageModel.refresh(); - Navigator.of(context).popUntil((route) => route.isFirst); + final account = await SharedUtil.instance.getString(Keys.account); + if(account == "default" || account == null){ + await onAvatarSelect(path, context); + } else{ + final token = await SharedUtil.instance.getString(Keys.token); + String fileName = path + .substring(path.lastIndexOf("/") + 1, path.length) + .replaceAll(" ", ""); + String transFormName = Uri.encodeFull(fileName).replaceAll("%", ""); + uploadAvatar(account,token, path, transFormName, context); + } }, child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(20)), @@ -101,6 +106,69 @@ class _AvatarHistoryPageState extends State { ); } + Future onAvatarSelect(String url, BuildContext context) async { + final avatarPageModel = widget.avatarPageModel; + final mainPageModel = avatarPageModel.mainPageModel; + mainPageModel.currentAvatarUrl = url; + mainPageModel.currentAvatarType = CurrentAvatarType.local; + await SharedUtil.instance.saveString(Keys.localAvatarPath, url); + await SharedUtil.instance.saveInt(Keys.currentAvatarType, CurrentAvatarType.local); + mainPageModel.refresh(); + Navigator.of(context).popUntil((route) => route.isFirst); + } + + void uploadAvatar(String account, String token, String filePath, String fileName, BuildContext context) async{ + CancelToken cancelToken = CancelToken(); + _showLoadingDialog(context); + ApiService.instance.uploadAvatar( + params: FormData.from({ + "avatar": new UploadFileInfo(new File(filePath), fileName), + "account": account, + "token": token + }), + success: (UploadAvatarBean bean){ + Navigator.pop(context); + onAvatarSelect(filePath, context); + }, + failed: (UploadAvatarBean bean){ + Navigator.pop(context); + _showTextDialog(bean.description, context); + }, + error: (msg){ + Navigator.pop(context); + _showTextDialog(msg, context); + }, + token: cancelToken, + ); + } + + void _showLoadingDialog(BuildContext context) { + showDialog(context: context, builder: (ctx){ + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20.0))), + content: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Theme.of(context).primaryColor), + ), + ); + }); + } + + void _showTextDialog(String text, BuildContext context){ + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.all(Radius.circular(20.0))), + content: Text( + text), + ); + }); + } + void getAvatarFiles() async { final avatarPath = await FileUtil.getInstance().getSavePath('/avatar/'); final children = await FileUtil.getInstance().getDirChildren(avatarPath); diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index f284796..0e24c96 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -60,15 +60,6 @@ class LoginPage extends StatelessWidget { } }, ), -// model.canShowBackdrop -// ? BackdropFilter( -// filter: ImageFilter.blur(sigmaX: 3, sigmaY: 3), -// child: Container( -// width: size.width, -// height: size.height, -// color: bgColor.withOpacity(0.1), -// )) -// : Container(), model.showLoginWidget ? LoginWidget(loginPageModel: model,) : Container(), ], ), diff --git a/lib/pages/nav_page.dart b/lib/pages/nav_page.dart index 182dc5d..305cdbc 100644 --- a/lib/pages/nav_page.dart +++ b/lib/pages/nav_page.dart @@ -36,7 +36,7 @@ class NavPage extends StatelessWidget { trailing: Icon(Icons.keyboard_arrow_right), onTap: () async{ final account = await SharedUtil.instance.getString(Keys.account); - if(account == "default"){ + if(account == "default" || account == null){ Navigator.push(context, new CupertinoPageRoute(builder: (ctx) { return ProviderConfig.getInstance().getLoginPage(); })); diff --git a/lib/widgets/edit_dialog.dart b/lib/widgets/edit_dialog.dart index 7ee81b0..bab9087 100644 --- a/lib/widgets/edit_dialog.dart +++ b/lib/widgets/edit_dialog.dart @@ -57,9 +57,8 @@ class EditDialog extends StatelessWidget { ), FlatButton( onPressed: () { - if (onPositive != null) onPositive(); + onPositive?.call(); if(positiveWithPop) Navigator.of(context).pop(); - print("确定"); }, child: Text(DemoLocalizations.of(context).ok, style: sureTextStyle ?? TextStyle(color: Colors.black)), diff --git a/lib/widgets/login_widget.dart b/lib/widgets/login_widget.dart index c9960d9..6d16218 100644 --- a/lib/widgets/login_widget.dart +++ b/lib/widgets/login_widget.dart @@ -45,7 +45,7 @@ class LoginWidget extends StatelessWidget { Icons.email, ), suffixIcon: IconButton( - icon: Icon(Icons.clear), + icon: Icon(Icons.cancel), onPressed: () => Future.delayed( Duration(milliseconds: 100), () => loginPageModel.emailController?.clear(), @@ -67,17 +67,25 @@ class LoginWidget extends StatelessWidget { keyboardType: TextInputType.text, textDirection: TextDirection.ltr, decoration: InputDecoration( - hintText: DemoLocalizations.of(context).inputPassword, - labelText: DemoLocalizations.of(context).password, - labelStyle: TextStyle(fontWeight: FontWeight.bold), - prefixIcon: Icon( - Icons.lock, + hintText: DemoLocalizations.of(context).inputPassword, + labelText: DemoLocalizations.of(context).password, + labelStyle: TextStyle(fontWeight: FontWeight.bold), + prefixIcon: Icon( + Icons.lock, + ), + suffixIcon: FlatButton( + highlightColor: primaryColorLight, + colorBrightness: Brightness.dark, + splashColor: Colors.grey, + onPressed: loginPageModel.logic.onForget, + child: Text( + DemoLocalizations.of(context).forget, + style: TextStyle(color: Colors.black), + textAlign: TextAlign.center, ), - suffixIcon: FlatButton( - onPressed: loginPageModel.logic.onForget, - child: Text(DemoLocalizations.of(context).forget), - )), - obscureText: true, + ), + ), + obscureText: true, ), ), index: 1, diff --git a/res/intl_en_US.arb b/res/intl_en_US.arb index dba0d4b..fc7e11b 100644 --- a/res/intl_en_US.arb +++ b/res/intl_en_US.arb @@ -762,6 +762,18 @@ "type": "text", "placeholders": {} }, + "requestError": "request error", + "@requestError": { + "description": "请求错误", + "type": "text", + "placeholders": {} + }, + "requestFailed": "request failed", + "@requestFailed": { + "description": "请求失败", + "type": "text", + "placeholders": {} + }, "version100": "Version:1.0.0 \n\nThe Version 1.0.0 released!\n", "@version100": { "description": "版本:1.0.0 \n\n版本 1.0.0 发布啦!", diff --git a/res/intl_messages.arb b/res/intl_messages.arb index a817095..07f621e 100644 --- a/res/intl_messages.arb +++ b/res/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2019-08-20T16:08:12.733251", + "@@last_modified": "2019-08-21T11:04:16.413516", "appName": "One Day List", "@appName": { "description": "app的名字", @@ -760,6 +760,18 @@ "type": "text", "placeholders": {} }, + "requestError": "request error", + "@requestError": { + "description": "请求错误", + "type": "text", + "placeholders": {} + }, + "requestFailed": "request failed", + "@requestFailed": { + "description": "请求失败", + "type": "text", + "placeholders": {} + }, "version100": "Version:1.0.0 \n\nThe Version 1.0.0 released!\n", "@version100": { "description": "版本:1.0.0 \n\n版本 1.0.0 发布啦!", diff --git a/res/intl_zh_CN.arb b/res/intl_zh_CN.arb index 792b249..bc8bb5e 100644 --- a/res/intl_zh_CN.arb +++ b/res/intl_zh_CN.arb @@ -760,6 +760,18 @@ "type": "text", "placeholders": {} }, + "requestError": "请求错误", + "@requestError": { + "description": "请求错误", + "type": "text", + "placeholders": {} + }, + "requestFailed": "请求失败", + "@requestFailed": { + "description": "请求失败", + "type": "text", + "placeholders": {} + }, "version100": "版本:1.0.0 \n\n版本 1.0.0 发布啦!", "@version100": { "description": "版本:1.0.0 \n\n版本 1.0.0 发布啦!",