forget_password_page.dart 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
  3. import 'package:lszlgl/base/base_state.dart';
  4. import 'package:lszlgl/config/borders.dart';
  5. import 'package:lszlgl/main.dart';
  6. import 'package:lszlgl/network/my_api.dart';
  7. import 'package:lszlgl/utils/string_utils.dart';
  8. import 'package:lszlgl/widget/button.dart';
  9. import 'package:lszlgl/widget/countdown_button_widget.dart';
  10. class ForgetPasswordPage extends StatefulWidget {
  11. const ForgetPasswordPage({super.key});
  12. @override
  13. State<ForgetPasswordPage> createState() => _ForgetPasswordPageState();
  14. }
  15. class _ForgetPasswordPageState extends BaseState<ForgetPasswordPage> {
  16. late GlobalKey<FormState> textFormKey;
  17. late TextEditingController phoneCtrl;
  18. late TextEditingController msgCtrl;
  19. late TextEditingController pwdCtrl;
  20. @override
  21. void initState() {
  22. super.initState();
  23. textFormKey = GlobalKey<FormState>();
  24. phoneCtrl = TextEditingController();
  25. msgCtrl = TextEditingController();
  26. pwdCtrl = TextEditingController();
  27. }
  28. /// 重置密码
  29. void resetPwd() async{
  30. MyNavigator.showLoading(msg: '密码设置中...');
  31. try{
  32. var res = await MyApi.get().resetPassword({
  33. 'username': phoneCtrl.text,
  34. 'password': pwdCtrl.text,
  35. 'code':msgCtrl.text,
  36. });
  37. if(res.data ?? false){
  38. MyNavigator.showToast('密码设置成功');
  39. MyNavigator.pop();
  40. }
  41. }catch(e){
  42. logger.e(e);
  43. }
  44. MyNavigator.dismissLoading();
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. return myScaffold(
  49. child: KeyboardDismissOnTap(
  50. dismissOnCapturedTaps: true,
  51. child: Column(
  52. children: [
  53. myAppBar(title: '忘记密码'),
  54. Expanded(
  55. child: Container(
  56. color: Colors.white,
  57. child: SingleChildScrollView(
  58. padding: const EdgeInsets.fromLTRB(22, 40, 22, 20),
  59. child: Form(
  60. key: textFormKey,
  61. child: Column(
  62. children: [
  63. TextFormField(
  64. controller: phoneCtrl,
  65. keyboardType: TextInputType.number,
  66. decoration: const InputDecoration(
  67. hintText: '手机号',
  68. contentPadding: EdgeInsets.symmetric(horizontal: 20,vertical: 6),
  69. border: Borders.borderA,
  70. enabledBorder: Borders.borderB,
  71. ),
  72. validator: (val){
  73. return StringUtils.isPhoneNum(val) ? null : '请输入手机号';
  74. },
  75. ),
  76. const SizedBox(height: 16),
  77. TextFormField(
  78. controller: msgCtrl,
  79. keyboardType: TextInputType.number,
  80. decoration: InputDecoration(
  81. hintText: '验证码',
  82. contentPadding: const EdgeInsets.symmetric(horizontal: 20,vertical: 6),
  83. border: Borders.borderA,
  84. enabledBorder: Borders.borderB,
  85. suffixIconConstraints: const BoxConstraints(maxHeight: 26),
  86. suffixIcon: Padding(
  87. padding: const EdgeInsets.only(right: 20),
  88. child: CountdownButtonWidget(
  89. phoneController: phoneCtrl,
  90. ),
  91. ),
  92. ),
  93. validator: (value){
  94. return value!.trim().isEmpty ? '请输入验证码' : null;
  95. },
  96. ),
  97. const SizedBox(height: 16),
  98. TextFormField(
  99. controller: pwdCtrl,
  100. obscureText: true,
  101. decoration: const InputDecoration(
  102. hintText: '新密码',
  103. contentPadding: EdgeInsets.symmetric(horizontal: 20,vertical: 6),
  104. border: Borders.borderA,
  105. enabledBorder: Borders.borderB,
  106. ),
  107. validator: (val){
  108. if(val!.length < 8){
  109. return '密码长度要大于8位';
  110. }
  111. var regex = RegExp(r'\d');
  112. if (!regex.hasMatch(val)) {
  113. return '密码要包含数字';
  114. }
  115. regex = RegExp(r'[a-zA-Z]');
  116. if (!regex.hasMatch(val)) {
  117. return '密码要包含大写字母或小写字母';
  118. }
  119. regex = RegExp(r'[!\"#$%&()*+,-./:;<=>?@\]\[^_`{|}~]');
  120. if (!regex.hasMatch(val)) {
  121. return '密码要包含特殊字符';
  122. }
  123. return null;
  124. },
  125. ),
  126. const SizedBox(height: 16),
  127. TextFormField(
  128. obscureText: true,
  129. decoration: const InputDecoration(
  130. hintText: '再次输入新密码',
  131. contentPadding: EdgeInsets.symmetric(horizontal: 20,vertical: 6),
  132. border: Borders.borderA,
  133. enabledBorder: Borders.borderB,
  134. ),
  135. validator: (val){
  136. if(val!.trim().isEmpty){
  137. return '请再次输入新密码';
  138. }
  139. if(val != pwdCtrl.text){
  140. return '两次输入密码不一致';
  141. }
  142. return null;
  143. },
  144. ),
  145. const SizedBox(height: 20),
  146. const Text(
  147. '*密码长度大于8位,包含数字、字母和特殊字符。',
  148. style: TextStyle(color: Colors.black54),
  149. ),
  150. const SizedBox(height: 36),
  151. MyButton(
  152. '确定',
  153. gradient: const LinearGradient(colors: [Color(0xFF3BD2E5), Color(0xFF247AF8)]),
  154. minHeight: 40,
  155. onTap: () {
  156. if (textFormKey.currentState!.validate()) {
  157. resetPwd();
  158. }
  159. },
  160. ),
  161. ],
  162. ),
  163. ),
  164. ),
  165. )),
  166. ],
  167. )));
  168. }
  169. }