You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
8.1KB

  1. import 'package:farm_tpf/data/repository/user_repository.dart';
  2. import 'package:farm_tpf/models/account.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart';
  4. import 'package:farm_tpf/presentation/custom_widgets/widget_toast.dart';
  5. import 'package:farm_tpf/presentation/screens/profile/sc_change_password.dart';
  6. import 'package:farm_tpf/utils/const_color.dart';
  7. import 'package:farm_tpf/utils/validators.dart';
  8. import 'package:flutter/material.dart';
  9. import 'package:fluttertoast/fluttertoast.dart';
  10. import 'package:keyboard_dismisser/keyboard_dismisser.dart';
  11. import 'package:package_info/package_info.dart';
  12. import 'bloc_get_account.dart';
  13. class UpdateProfileScreen extends StatefulWidget {
  14. static Route route() {
  15. return MaterialPageRoute<void>(builder: (_) => UpdateProfileScreen());
  16. }
  17. @override
  18. _UpdateProfileScreenState createState() => _UpdateProfileScreenState();
  19. }
  20. class _UpdateProfileScreenState extends State<UpdateProfileScreen> {
  21. final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  22. final _repository = UserRepository();
  23. GlobalKey<FormState> _formKey = GlobalKey();
  24. bool _autoValidate = false;
  25. FlutterToast flutterToast;
  26. Account _account = Account();
  27. TextEditingController _userNameController = TextEditingController();
  28. TextEditingController _fullNameController = TextEditingController();
  29. TextEditingController _emailController = TextEditingController();
  30. TextEditingController _addressController = TextEditingController();
  31. PackageInfo _packageInfo = PackageInfo(
  32. version: '1.0.0',
  33. buildNumber: '1.',
  34. );
  35. Future<void> _initPackageInfo() async {
  36. final PackageInfo info = await PackageInfo.fromPlatform();
  37. setState(() {
  38. _packageInfo = info;
  39. });
  40. }
  41. @override
  42. void initState() {
  43. super.initState();
  44. _initPackageInfo();
  45. flutterToast = FlutterToast(context);
  46. getAccountBloc.getAccount((data) {
  47. _account = data;
  48. _userNameController.text = _account.login;
  49. _fullNameController.text = _account.fullName.toString();
  50. _emailController.text = _account.email.toString();
  51. _addressController.text = _account.address;
  52. }, (err) {
  53. flutterToast.showToast(child: WidgetToast(message: "Lỗi tải dữ liệu"));
  54. });
  55. }
  56. _validateInputs() async {
  57. if (_formKey.currentState.validate()) {
  58. _formKey.currentState.save();
  59. LoadingDialog.showLoadingDialog(_scaffoldKey.currentContext);
  60. _repository.updateProfile(_account).then((value) {
  61. LoadingDialog.hideLoadingDialog(_scaffoldKey.currentContext);
  62. _scaffoldKey.currentState.showSnackBar(SnackBar(
  63. content: Row(
  64. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  65. children: <Widget>[
  66. Text('Cập nhật thành công.'),
  67. Icon(Icons.done),
  68. ],
  69. ),
  70. backgroundColor: Colors.green,
  71. duration: Duration(seconds: 3),
  72. ));
  73. }).catchError((onError) {
  74. _scaffoldKey.currentState.showSnackBar(SnackBar(
  75. content: Row(
  76. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  77. children: <Widget>[
  78. Text('Cập nhật không thành công.'),
  79. Icon(Icons.error),
  80. ],
  81. ),
  82. backgroundColor: Colors.red,
  83. duration: Duration(seconds: 3),
  84. ));
  85. LoadingDialog.hideLoadingDialog(_scaffoldKey.currentContext);
  86. print("error");
  87. });
  88. } else {
  89. _autoValidate = true;
  90. }
  91. }
  92. Widget _userNameField() {
  93. return TextFormField(
  94. keyboardType: TextInputType.text,
  95. enabled: false,
  96. decoration: InputDecoration(labelText: "Tài khoản"),
  97. controller: _userNameController,
  98. validator: (String value) {
  99. return Validators.validateNotNullOrEmpty(value, "Tài khoản");
  100. },
  101. onSaved: (newValue) {},
  102. );
  103. }
  104. Widget _fullNameField() {
  105. return TextFormField(
  106. keyboardType: TextInputType.text,
  107. decoration: InputDecoration(labelText: "Họ và tên"),
  108. controller: _fullNameController,
  109. validator: (String value) {
  110. return Validators.validateNotNullOrEmpty(value, "Họ và tên");
  111. },
  112. onSaved: (newValue) {
  113. _account.fullName = newValue;
  114. },
  115. );
  116. }
  117. Widget _emailField() {
  118. return TextFormField(
  119. keyboardType: TextInputType.emailAddress,
  120. decoration: InputDecoration(labelText: "Email"),
  121. controller: _emailController,
  122. validator: (String value) {
  123. return Validators.validateEmail(value);
  124. },
  125. onSaved: (newValue) {
  126. _account.email = newValue;
  127. },
  128. );
  129. }
  130. Widget _addressField() {
  131. return TextFormField(
  132. keyboardType: TextInputType.text,
  133. decoration: InputDecoration(labelText: "Địa chỉ"),
  134. controller: _addressController,
  135. onSaved: (newValue) {
  136. _account.address = newValue;
  137. },
  138. );
  139. }
  140. Widget _btnChangePassword() {
  141. return FlatButton(
  142. padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0),
  143. onPressed: () {
  144. Navigator.push(
  145. context,
  146. MaterialPageRoute(builder: (context) => ChangePasswordScreen()),
  147. );
  148. },
  149. child: Container(
  150. padding:
  151. EdgeInsets.only(top: 15.0, right: 0.0, bottom: 10.5, left: 0.0),
  152. decoration: BoxDecoration(
  153. border:
  154. Border(bottom: BorderSide(width: 0.5, color: Colors.grey)),
  155. ),
  156. child: Row(
  157. children: [
  158. Expanded(
  159. child: Text(
  160. "Cập nhật mật khẩu".toUpperCase(),
  161. style: TextStyle(
  162. fontSize: 14.0,
  163. color: Colors.black,
  164. fontWeight: FontWeight.bold),
  165. )),
  166. Icon(Icons.arrow_forward_ios),
  167. ],
  168. )));
  169. }
  170. Widget _textPackageInfo() {
  171. return Container(
  172. width: double.infinity,
  173. alignment: Alignment.centerRight,
  174. child: Text(
  175. "version:${_packageInfo.version}.${_packageInfo.buildNumber}",
  176. style: TextStyle(color: COLOR_CONST.GRAY1_70)));
  177. }
  178. @override
  179. Widget build(BuildContext context) => KeyboardDismisser(
  180. child: Scaffold(
  181. appBar: AppBar(
  182. centerTitle: true,
  183. title: Text(
  184. "Thông tin cá nhân",
  185. textAlign: TextAlign.center,
  186. ),
  187. actions: <Widget>[
  188. IconButton(
  189. icon: Icon(Icons.done),
  190. onPressed: () {
  191. FocusScopeNode currentFocus = FocusScope.of(context);
  192. if (!currentFocus.hasPrimaryFocus) {
  193. currentFocus.unfocus();
  194. }
  195. _validateInputs();
  196. })
  197. ],
  198. ),
  199. key: _scaffoldKey,
  200. body: _buildContent()));
  201. Widget _buildContent() {
  202. return StreamBuilder(
  203. stream: getAccountBloc.actions,
  204. builder: (context, AsyncSnapshot<dynamic> snapshot) {
  205. if (snapshot.hasData) {
  206. return Form(
  207. key: _formKey,
  208. autovalidate: _autoValidate,
  209. child: SingleChildScrollView(
  210. padding: EdgeInsets.all(8.0),
  211. child: Column(
  212. children: <Widget>[
  213. _userNameField(),
  214. SizedBox(
  215. height: 8.0,
  216. ),
  217. _fullNameField(),
  218. SizedBox(
  219. height: 8.0,
  220. ),
  221. _emailField(),
  222. SizedBox(
  223. height: 16.0,
  224. ),
  225. _btnChangePassword(),
  226. SizedBox(
  227. height: 8,
  228. ),
  229. _textPackageInfo()
  230. ],
  231. ),
  232. ));
  233. } else {
  234. return Center(
  235. child: CircularProgressIndicator(),
  236. );
  237. }
  238. });
  239. }
  240. }