二次封装TextField以及进行防抖处理

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);
      },
    );
  }
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值