flutter 搜索框实现,键盘搜索按钮,清空,防抖

复制代码
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:sy_project/config/app_colors.dart';
import 'package:sy_project/core/assets.dart';

/// 搜索textview
class CustomSearchBarInput extends StatefulWidget {
  // 回调函数
  final Function(String) onSubmitted;
  final String hintLabel;

  const CustomSearchBarInput(
      {required this.hintLabel, required this.onSubmitted, super.key});

  @override
  State<CustomSearchBarInput> createState() => _CustomSearchBarInputState();
}

class _CustomSearchBarInputState extends State<CustomSearchBarInput> {
  // 焦点对象
  // FocusNode _focusNode = FocusNode();
  // 文本的值
  String searchVal = '';
  //用于清空输入框
  TextEditingController _controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    //  获取焦点
    // WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
    //   _focusNode.requestFocus();
    // });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // color: AppColors.baseColor,
      // margin: EdgeInsets.all(ScreenHelper.pageHorizontalPadding()),
      height: 35.h,
      alignment: Alignment.centerLeft,
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(20.h),
      ),
      child: TextField(
        textInputAction: TextInputAction.search,
        controller: _controller,
        textAlignVertical: TextAlignVertical.center,
        // //自动获取焦点
        // focusNode: _focusNode,
        autofocus: false,
        onTapOutside: (event){
          FocusScopeNode currentFocus = FocusScope.of(context);
          currentFocus.focusedChild?.unfocus();
        },
        decoration: InputDecoration(
            // contentPadding和border的设置是为了让TextField内容实现上下居中
            contentPadding: const EdgeInsets.all(0),
            hintText: widget.hintLabel,
            hintStyle: const TextStyle(color: AppColors.customColor_999),
            //取消下划线
            border: const OutlineInputBorder(borderSide: BorderSide.none),
            icon: Padding(
              padding: EdgeInsets.only(left: 10.w, right: 0),
              child: SvgPicture.asset(
                Assets.images.iconSearch,
                width: 12.w,
                height: 12.w,
              ),
            ),
            // icon: Padding(
            //     padding: const EdgeInsets.only(left: 0, top: 0),
            //     child: Icon(
            //       Icons.search,
            //       size: 18,
            //       color: Theme.of(context).primaryColor,
            //     )),
            //  关闭按钮,有值时才显示
            suffixIcon: searchVal.isNotEmpty
                ? IconButton(
                    icon: Icon(
                      Icons.close,
                      size: 15.w,
                    ),
                    onPressed: () {
                      //   清空内容
                      setState(() {
                        searchVal = '';
                        _controller.clear();
                      });
                    },
                  )
                : null),
        onChanged: (value) {
          setState(() {
            searchVal = value;
            // 防止抖动  搜索
            // VibrationThrottlingUtil.debounce(
            //     () => widget.onSubmitted(value), 1000);
          });
        },
        onSubmitted: (value) {
          widget.onSubmitted(value);
        },
      ),
    );
  }
}

防抖就是防止抖动,避免事件的重复触发。

如果某一事件被连续快速地触发多次,只会执行最后那一次。适合输入框输入后自动搜索回调

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;
    });
  }
相关推荐
jay神13 分钟前
基于YOLOv8的交通标志识别Web系统
前端·人工智能·深度学习·yolo·机器学习·毕业设计
CAD老兵18 分钟前
一张 HTML 走天下:CAD-Viewer 首创的「离线 CAD 看图」
前端·javascript·github
程序员榴莲28 分钟前
Python 中的 @property:像访问属性一样调用方法
开发语言·前端·python
yingyima33 分钟前
Linux定时任务:crontab vs systemd timer,到底谁更适合你的业务?
前端
有味道的男人1 小时前
1688 跨境 API:多语言、跨境代采、独立站商品同步方案
java·服务器·前端
大师兄66681 小时前
HarmonyOS 服务卡片开发之JS 卡片开发
javascript·华为·harmonyos·harmonyos6·formkit
索西引擎1 小时前
【实战】Changesets:Monorepo 版本管理与变更日志的实践
前端
Highcharts.js1 小时前
AI向量知识谱系图表创建示例代码|Highcharts网络图表(networkgraph)搭建案例
开发语言·前端·javascript·网络·信息可视化·编辑器·highcharts
阿正的梦工坊2 小时前
React:构建用户界面的JavaScript库
javascript·react.js·ui
行走的陀螺仪2 小时前
[特殊字符] JavaScript 设计模式完全指南:从入门到精通(含20种模式)
开发语言·javascript·设计模式