import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../config/config.dart';
class _VibrationThrottlingUtil {
static Timer? _debounceTimer;
/// 防抖 (传入所要防抖的方法/回调与延迟时间)
static void debounce(Function func, [int delay = 500]) {
if (_debounceTimer != null) {
_debounceTimer?.cancel();
}
_debounceTimer = Timer(Duration(milliseconds: delay), () {
func.call();
_debounceTimer = null;
});
}
}
class CustomTextInput extends StatefulWidget {
const CustomTextInput({
super.key,
this.controller,
this.onSubmitted,
this.maxLines,
this.maxLength,
this.hintText,
this.fontSize,
this.focusNode,
this.inputFormatters,
this.readOnly = false,
});
final bool readOnly;
final int? maxLines;
final int? maxLength;
final String? hintText;
final double? fontSize;
final FocusNode? focusNode;
final Function(String)? onSubmitted;
final TextEditingController? controller;
/// 限制输入
final List<TextInputFormatter>? inputFormatters;
@override
State<CustomTextInput> createState() => _CustomTextInputState();
}
class _CustomTextInputState extends State<CustomTextInput> {
@override
void initState() {
super.initState();
// 获取焦点
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
widget.focusNode?.requestFocus();
});
}
@override
Widget build(BuildContext context) {
return TextField(
readOnly: widget.readOnly,
// 自动获取焦点
focusNode: widget.focusNode,
maxLines: widget.maxLines,
maxLength: widget.maxLength,
controller: widget.controller,
decoration: InputDecoration(
hintText: widget.hintText,
border: InputBorder.none,
contentPadding: EdgeInsets.zero,
isDense: true,
),
inputFormatters: widget.inputFormatters,
style: TextStyle(
fontSize: widget.fontSize ?? textSizeConfig.primaryTextSize),
strutStyle: StrutStyle(
fontSize: widget.fontSize ?? textSizeConfig.primaryTextSize,
leading: 0,
height: 1.1,
// 1.1更居中
forceStrutHeight: true, // 关键属性 强制改为文字高度
),
onTapOutside: (event) {
FocusScopeNode currentFocus = FocusScope.of(context);
currentFocus.focusedChild?.unfocus();
},
onChanged: (value) {
_VibrationThrottlingUtil.debounce(
() => widget.onSubmitted?.call(value), 1000);
},
onSubmitted: (value) {
widget.onSubmitted?.call(value);
},
);
}
}
02-15
944