import 'package:cs_resources/generated/assets.dart'; import 'package:cs_resources/generated/l10n.dart'; import 'package:cs_resources/theme/app_colors_theme.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:widgets/ext/ex_widget.dart'; import 'package:widgets/my_load_image.dart'; import '../my_text_field.dart'; import '../my_text_view.dart'; import 'dart:ui'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; import 'package:widgets/widget_export.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; /* * 验证码校验弹窗,输入四位数的验证才能发送短信 */ class VerifyCodeDialog extends HookConsumerWidget { void Function(String key, String code) confirmAction; VerifyCodeDialog({ required this.confirmAction, }); @override Widget build(BuildContext context, WidgetRef ref) { // 使用 useState 来持久化 TextEditingController 和 FocusNode final textEditingController = useTextEditingController(); final focusNode = useFocusNode(); useEffect(() { //赋值State的值 Future.microtask(() {}); return () { // 释放控制器资源 textEditingController.dispose(); focusNode.dispose(); }; }, []); return Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ //Title (如果使用 Container 为最外层容器则默认为 match_parent 的效果,除非我们限制宽度和最大高度最小高度) Container( width: double.infinity, height: 55, decoration: BoxDecoration( color: context.appColors.btnBgDefault, borderRadius: const BorderRadius.only( topRight: Radius.circular(15), topLeft: Radius.circular(15), ), ), child: Row( children: [ const SizedBox(width: 45), MyTextView( S.current.captcha, fontSize: 18, textAlign: TextAlign.center, isFontMedium: true, textColor: Colors.white, ).expanded(), const MyAssetImage( Assets.baseServiceDialogDeleteIcon, width: 25, height: 25.5, ).onTap(() { onCancel(); }, padding: 10) ], ), ), Container( width: double.infinity, padding: const EdgeInsets.only(top: 40), decoration: BoxDecoration( color: context.appColors.whiteSecondBG, borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(15), bottomRight: Radius.circular(15), ), ), child: Column( children: [ //图片与输入框 Row( mainAxisSize: MainAxisSize.max, children: [ IgnoreKeyboardDismiss( child: MyTextField( 'code', "", enabled: true, fillCornerRadius: 1, padding: const EdgeInsets.symmetric(horizontal: 10), fillBackgroundColor: context.appColors.authFiledBG, border: InputBorder.none, showDivider: false, hintText: S.current.enter_captcha, hintStyle: TextStyle( color: context.appColors.authFiledHint, fontSize: 16, fontWeight: FontWeight.w500, ), controller: textEditingController, focusNode: focusNode, style: TextStyle( color: context.appColors.authFiledText, fontSize: 16, fontWeight: FontWeight.w500, ), height: 48, cursorWidth: 1.5, cursorColor: context.appColors.authFiledText, margin: const EdgeInsets.only(right: 5), onSubmit: (formKey, value) { focusNode.unfocus(); onCancel(); confirmAction.call("key", textEditingController.text.toString()); }, ), ).expanded(), //图片验证码 MyLoadImage( 'https://img0.baidu.com/it/u=3528227727,3536117093&fm=253&fmt=auto&app=138&f=JPEG?w=395&h=200', width: 100, height: 45, fit: BoxFit.fill, onClick: () { //刷新验证码 }, ), ], ).marginOnly(left: 15, right: 15), //按钮获取验证码 Row( children: [ InkWell( onTap: () async { focusNode.unfocus(); onCancel(); confirmAction.call("key", textEditingController.text.toString()); }, child: MyTextView( S.current.get_code, fontSize: 16, paddingTop: 13, paddingBottom: 13, isFontMedium: true, textAlign: TextAlign.center, textColor: Colors.white, backgroundColor: context.appColors.btnBgDefault, cornerRadius: 7, ), ).expanded(), ], ).marginOnly(bottom: 30, top: 28, left: 15, right: 15), ], ), ), ], ).constrained(width: 300) //跟随软键盘滚动,适配居中于剩余的空间 .padding(bottom: MediaQuery.of(context).viewInsets.bottom); } //取消弹框 void onCancel() async { SmartDialog.dismiss(); } }