// ignore_for_file: must_be_immutable import 'package:flutter/material.dart'; import 'device_type.dart'; // ignore: camel_case_types, class inputText extends StatefulWidget { //内容 String value; //跟在后面的单位,默认为空 String? endValue; //控制焦点 FocusNode? focusNode; //控制长度 double inputLength; //控制键盘类型,默认为数字0,其他参数都是字符串 int keyboardType; //回调数据变化后返回新值 double fontsize; double inputHeight; final ValueChanged? onChanged; final Function()? onTap; inputText( {super.key, required this.value, required this.focusNode, required this.onChanged, this.endValue = "", this.inputLength = 200, this.keyboardType = 0, this.fontsize = 20, this.inputHeight = 40, this.onTap}); @override State createState() => _inputTextState(); } // ignore: camel_case_types class _inputTextState extends State { //控制默认文本 TextEditingController? _controller; //传入的值,作为显示的初始值 String _inputTextContext = ""; //字体 late double _fontSize; // late double _inputHeight; Color _fontcolor = Colors.black; @override void initState() { super.initState(); _inputTextContext = widget.value; _controller = TextEditingController(text: _inputTextContext); _fontSize = widget.fontsize; // _inputHeight = widget.inputHeight; } @override Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; _fontcolor = isDarkMode ? Colors.white : Colors.black; final deviceType = getDeviceType(context); double dynamicWidth = deviceType == DeviceType.mobile ? 0 : 50; return Row( children: [ Container( margin: const EdgeInsets.only(bottom: 5), width: widget.endValue != "" ? widget.inputLength + dynamicWidth - 5 : widget.inputLength + dynamicWidth, height: widget.inputHeight, child: TextField( keyboardType: widget.keyboardType == 0 ? TextInputType.number : TextInputType.text, clipBehavior: Clip.hardEdge, focusNode: widget.focusNode, controller: _controller, style: TextStyle(fontSize: _fontSize, color: _fontcolor), onChanged: (value) { setState(() { _inputTextContext = value; }); // 调用回调函数,通知外部数据变化 if (widget.onChanged != null) { widget.onChanged!(value); } }, decoration: InputDecoration( contentPadding: const EdgeInsets.only(left: 10), hintText: _inputTextContext, border: const OutlineInputBorder( borderSide: BorderSide(width: 1, color: Colors.black))), onTap: widget.onTap, ), ), Container( padding: const EdgeInsets.only(left: 10), child: Transform.translate( offset: const Offset(-35.0, 0.0), child: Text( "${widget.endValue}", style: TextStyle(fontSize: _fontSize, color: _fontcolor), ), ), ) ], ); } } class DropDown extends StatefulWidget { List optionList = []; double listLength; double fontSize; double listHeight; final void Function(String?) onValueChanged; DropDown( {super.key, required this.optionList, this.listLength = 200, this.fontSize = 20, this.listHeight = 50, required this.onValueChanged}); @override State createState() => _DropDownState(); } class _DropDownState extends State { List optionList = []; String? dropdownValue; @override void initState() { super.initState(); optionList = widget.optionList; // dropdownValue = widget.optionList.isNotEmpty ? widget.optionList[0] : null; dropdownValue = optionList[0]; // widget.onValueChanged(optionList[0]); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onValueChanged(dropdownValue); }); } @override Widget build(BuildContext context) { return SizedBox( height: widget.listHeight, width: widget.listLength, child: DropdownButton( value: dropdownValue, style: TextStyle(fontSize: widget.fontSize, color: Colors.black), onChanged: (String? newValue) { setState(() { dropdownValue = newValue!; }); widget.onValueChanged(newValue); }, items: optionList.map>((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), )); } }