| | |
| | | ///SOS雷达扫描View |
| | | class VerificationBox extends StatefulWidget { |
| | | final int length; |
| | | final double width; |
| | | final VerificationBoxController controller; |
| | | |
| | | VerificationBox(this.length, this.controller); |
| | | VerificationBox(this.length, this.controller, {required this.width}); |
| | | |
| | | @override |
| | | _VerificationBoxState createState() => _VerificationBoxState(); |
| | |
| | | |
| | | class _VerificationBoxState extends State<VerificationBox> |
| | | with WidgetsBindingObserver { |
| | | TextEditingController _controller = TextEditingController(); |
| | | final TextEditingController _controller = TextEditingController(); |
| | | String content = ""; |
| | | final FocusNode _focusNode = FocusNode(); |
| | | bool isKeyboardActived = false; |
| | |
| | | @override |
| | | void initState() { |
| | | super.initState(); |
| | | WidgetsBinding.instance!.addObserver(this); |
| | | widget.controller.controller = _controller; |
| | | |
| | | _controller.addListener(() { |
| | | setState(() { |
| | | print("listener:"); |
| | |
| | | } |
| | | }); |
| | | }); |
| | | WidgetsBinding.instance!.addObserver(this); |
| | | |
| | | } |
| | | |
| | | @override |
| | | void dispose() { |
| | | super.dispose(); |
| | | WidgetsBinding.instance!.removeObserver(this); |
| | | isKeyboardActived = false; |
| | | _focusNode.unfocus(); |
| | | } |
| | | |
| | | @override |
| | | void didChangeMetrics() { |
| | | print("didChangeMetrics isKeyboardActived:$isKeyboardActived"); |
| | | super.didChangeMetrics(); |
| | | WidgetsBinding.instance!.addPostFrameCallback((_) { |
| | | // 当前是安卓系统并且在焦点聚焦的情况下 |
| | |
| | | Widget build(BuildContext context) { |
| | | return GestureDetector( |
| | | onTap: () { |
| | | print("点击事件,输入框获取焦点:${_focusNode.hasFocus}"); |
| | | FocusScope.of(context).requestFocus(_focusNode); |
| | | }, |
| | | child: Stack( |
| | |
| | | RegExp("[a-zA-Z]|[0-9]")), |
| | | LengthLimitingTextInputFormatter(widget.length), |
| | | ], |
| | | style: TextStyle(fontSize: 1, color: Colors.transparent), |
| | | decoration: InputDecoration( |
| | | style: const TextStyle(fontSize: 1, color: Colors.transparent), |
| | | decoration: const InputDecoration( |
| | | border: InputBorder.none, |
| | | focusedBorder: InputBorder.none, |
| | | focusColor: Colors.transparent), |
| | |
| | | focusNode: _focusNode, |
| | | autofocus: false, |
| | | controller: _controller)), |
| | | Row( |
| | | mainAxisAlignment: MainAxisAlignment.spaceBetween, |
| | | children: getItems(), |
| | | ) |
| | | SizedBox( |
| | | width: widget.width, |
| | | child: Row( |
| | | mainAxisAlignment: MainAxisAlignment.spaceBetween, |
| | | children: getItems(), |
| | | )) |
| | | ], |
| | | )); |
| | | } |
| | |
| | | } |
| | | |
| | | Widget getItem(int index) { |
| | | double width = (widget.width - 10 * widget.length - 1) / widget.length; |
| | | |
| | | //TODO 传入宽度计算 |
| | | return Container( |
| | | alignment: Alignment.center, |
| | | width: 36, |
| | | height: 45, |
| | | width: width, |
| | | height: width * 1.25, |
| | | decoration: BoxDecoration( |
| | | color: const Color(0xFFEFEFEF), |
| | | borderRadius: BorderRadius.circular(13)), |
| | |
| | | class VerificationBoxController { |
| | | VerificationBoxController(); |
| | | |
| | | TextEditingController? _controller = null; |
| | | TextEditingController? _controller; |
| | | |
| | | set controller(TextEditingController? controller) { |
| | | this._controller = controller; |
| | | _controller = controller; |
| | | } |
| | | |
| | | String get text => (_controller == null ? "" : _controller!.text); |