verify_code_dialog.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import 'package:cs_resources/generated/assets.dart';
  2. import 'package:cs_resources/generated/l10n.dart';
  3. import 'package:cs_resources/theme/app_colors_theme.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  6. import 'package:widgets/ext/ex_widget.dart';
  7. import 'package:widgets/my_load_image.dart';
  8. import '../my_text_field.dart';
  9. import '../my_text_view.dart';
  10. import 'dart:ui';
  11. import 'package:flutter/cupertino.dart';
  12. import 'package:flutter/widgets.dart';
  13. import 'package:widgets/widget_export.dart';
  14. import 'package:flutter_hooks/flutter_hooks.dart';
  15. import 'package:hooks_riverpod/hooks_riverpod.dart';
  16. /*
  17. * 验证码校验弹窗,输入四位数的验证才能发送短信
  18. */
  19. class VerifyCodeDialog extends HookConsumerWidget {
  20. void Function(String key, String code) confirmAction;
  21. VerifyCodeDialog({
  22. required this.confirmAction,
  23. });
  24. @override
  25. Widget build(BuildContext context, WidgetRef ref) {
  26. // 使用 useState 来持久化 TextEditingController 和 FocusNode
  27. final textEditingController = useTextEditingController();
  28. final focusNode = useFocusNode();
  29. useEffect(() {
  30. //赋值State的值
  31. Future.microtask(() {});
  32. return () {
  33. // 释放控制器资源
  34. textEditingController.dispose();
  35. focusNode.dispose();
  36. };
  37. }, []);
  38. return Column(
  39. crossAxisAlignment: CrossAxisAlignment.center,
  40. mainAxisAlignment: MainAxisAlignment.center,
  41. children: [
  42. //Title (如果使用 Container 为最外层容器则默认为 match_parent 的效果,除非我们限制宽度和最大高度最小高度)
  43. Container(
  44. width: double.infinity,
  45. height: 55,
  46. decoration: BoxDecoration(
  47. color: context.appColors.btnBgDefault,
  48. borderRadius: const BorderRadius.only(
  49. topRight: Radius.circular(15),
  50. topLeft: Radius.circular(15),
  51. ),
  52. ),
  53. child: Row(
  54. children: [
  55. const SizedBox(width: 45),
  56. MyTextView(
  57. S.current.captcha,
  58. fontSize: 18,
  59. textAlign: TextAlign.center,
  60. isFontMedium: true,
  61. textColor: Colors.white,
  62. ).expanded(),
  63. const MyAssetImage(
  64. Assets.baseServiceDialogDeleteIcon,
  65. width: 25,
  66. height: 25.5,
  67. ).onTap(() {
  68. onCancel();
  69. }, padding: 10)
  70. ],
  71. ),
  72. ),
  73. Container(
  74. width: double.infinity,
  75. padding: const EdgeInsets.only(top: 40),
  76. decoration: BoxDecoration(
  77. color: context.appColors.whiteSecondBG,
  78. borderRadius: const BorderRadius.only(
  79. bottomLeft: Radius.circular(15),
  80. bottomRight: Radius.circular(15),
  81. ),
  82. ),
  83. child: Column(
  84. children: [
  85. //图片与输入框
  86. Row(
  87. mainAxisSize: MainAxisSize.max,
  88. children: [
  89. IgnoreKeyboardDismiss(
  90. child: MyTextField(
  91. 'code',
  92. "",
  93. enabled: true,
  94. fillCornerRadius: 1,
  95. padding: const EdgeInsets.symmetric(horizontal: 10),
  96. fillBackgroundColor: context.appColors.authFiledBG,
  97. border: InputBorder.none,
  98. showDivider: false,
  99. hintText: S.current.enter_captcha,
  100. hintStyle: TextStyle(
  101. color: context.appColors.authFiledHint,
  102. fontSize: 16,
  103. fontWeight: FontWeight.w500,
  104. ),
  105. controller: textEditingController,
  106. focusNode: focusNode,
  107. style: TextStyle(
  108. color: context.appColors.authFiledText,
  109. fontSize: 16,
  110. fontWeight: FontWeight.w500,
  111. ),
  112. height: 48,
  113. cursorWidth: 1.5,
  114. cursorColor: context.appColors.authFiledText,
  115. margin: const EdgeInsets.only(right: 5),
  116. onSubmit: (formKey, value) {
  117. focusNode.unfocus();
  118. onCancel();
  119. confirmAction.call("key", textEditingController.text.toString());
  120. },
  121. ),
  122. ).expanded(),
  123. //图片验证码
  124. MyLoadImage(
  125. 'https://img0.baidu.com/it/u=3528227727,3536117093&fm=253&fmt=auto&app=138&f=JPEG?w=395&h=200',
  126. width: 100,
  127. height: 45,
  128. fit: BoxFit.fill,
  129. onClick: () {
  130. //刷新验证码
  131. },
  132. ),
  133. ],
  134. ).marginOnly(left: 15, right: 15),
  135. //按钮获取验证码
  136. Row(
  137. children: [
  138. InkWell(
  139. onTap: () async {
  140. focusNode.unfocus();
  141. onCancel();
  142. confirmAction.call("key", textEditingController.text.toString());
  143. },
  144. child: MyTextView(
  145. S.current.get_code,
  146. fontSize: 16,
  147. paddingTop: 13,
  148. paddingBottom: 13,
  149. isFontMedium: true,
  150. textAlign: TextAlign.center,
  151. textColor: Colors.white,
  152. backgroundColor: context.appColors.btnBgDefault,
  153. cornerRadius: 7,
  154. ),
  155. ).expanded(),
  156. ],
  157. ).marginOnly(bottom: 30, top: 28, left: 15, right: 15),
  158. ],
  159. ),
  160. ),
  161. ],
  162. ).constrained(width: 300)
  163. //跟随软键盘滚动,适配居中于剩余的空间
  164. .padding(bottom: MediaQuery.of(context).viewInsets.bottom);
  165. }
  166. //取消弹框
  167. void onCancel() async {
  168. SmartDialog.dismiss();
  169. }
  170. }