169 lines
4.9 KiB
Dart
169 lines
4.9 KiB
Dart
// 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<String>? 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<inputText> createState() => _inputTextState();
|
||
}
|
||
|
||
// ignore: camel_case_types
|
||
class _inputTextState extends State<inputText> {
|
||
//控制默认文本
|
||
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<String> 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<DropDown> createState() => _DropDownState();
|
||
}
|
||
|
||
class _DropDownState extends State<DropDown> {
|
||
List<String> 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<String>(
|
||
value: dropdownValue,
|
||
style: TextStyle(fontSize: widget.fontSize, color: Colors.black),
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
dropdownValue = newValue!;
|
||
});
|
||
widget.onValueChanged(newValue);
|
||
},
|
||
items: optionList.map<DropdownMenuItem<String>>((String value) {
|
||
return DropdownMenuItem<String>(
|
||
value: value,
|
||
child: Text(value),
|
||
);
|
||
}).toList(),
|
||
));
|
||
}
|
||
}
|