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

news2024/10/7 4:30:00

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

防抖就是防止抖动,避免事件的重复触发。
如果某一事件被连续快速地触发多次,只会执行最后那一次。适合输入框输入后自动搜索回调

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 基础之QDataTime

Qt 基础之QDataTime 引言一、获取(设定)日期和时间二、时间戳三、时间计算 (重载运算符) 引言 QDataTime是Qt框架中用于处理日期和时间的类。它提供了操作和格式化日期、时间和日期时间组合的功能。QDataTime可以用于存储和检索日期和时间、比较日期和时间、对日期和时间执行算…

C语言字符串操作函数详解①strlen函数的讲解与三种模拟实现方法(建议三连收藏)

目录 ​编辑 前言 1.strlen函数介绍 2.模拟实现strlen 2.1计数器做法 2.2不创建临时变量&#xff0c;通过递归的方法 2.3利用两个指针相减 3.结语 前言 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量…

DC-磁盘配额(23国赛真题)

2023全国职业院校技能大赛网络系统管理赛项–模块B&#xff1a;服务部署&#xff08;WindowServer2022&#xff09; 文章目录 DC-磁盘配额题目配置步骤验证查看DC2驱动器C:\的磁盘配额&#xff0c;限制磁盘空间&#xff0c;警告等级等配置 DC-磁盘配额 题目 在DC2驱动器C:\上…

C#: form 添加窗体最小化事件,添加系统托盘图标,点击后可以打开、最小软件窗口

说明&#xff1a; 1.实现窗体在最小化后触发一个事件&#xff0c;可以去实现需要的功能。 2.最小化后软件图标出现在系统右下角的托盘串口。 3.点击托盘口的图标可以实现软件弹出窗口和最小化的切换。 1.参考办法 以下是判断C#窗体最小化到状态栏的状态的方法&#xff1a;…

机器学习 低代码 ML:PyCaret 的使用

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Spark SQL的高级用法

一. 快速生成多行的序列 需求:请生成一列数据, 内容为 1 , 2 , 3 , 4 ,5 -- 快速生成多行的序列 -- 方式一 select explode(split("1,2,3,4,5",",")); --方式二 /*序列函数sequence(start,stop,step):生成指定返回的列表数据[start,stop]必须传入,step步…

充电桩项目实战:搞定多数据源!

你好&#xff0c;我是田哥 最近&#xff0c;我在对充电桩项目进行微服务升级中&#xff0c;既然是项目升级&#xff0c;难免会遇到各种各样的问题。比如&#xff1a;分布式事务问题、多数据源问题、分布式锁问题等。 项目技术栈&#xff1a; SpringSpring BootSpring Cloud Ali…

实战教程:使用Spring Boot和Vue.js开发社区团购管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(1)

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

linux安装mongodb数据库启动报错? 都是冰红茶滴水儿

先展示报错信息 网上一大推说是关闭不正确导致的,然后给出的解决方法是 ./mongod -f mongodb.conf --repair吊用没有,还是报错: about to fork child process, waiting until server is ready for connections. forked process: 302226 ERROR: child process failed, exited…

资深Android逆袭、华为鸿蒙为安卓程序员开辟了一条新道路

本文章主要从以下5个方面来展开聊聊这个话题&#xff1a; 1.什么是鸿蒙 2.鸿蒙系统发展时间线 3.鸿蒙是套壳Android吗&#xff1f; 4.鸿蒙的生态&#xff08;用户以及开发者&#xff09; 5.一些建议 1月18日&#xff0c;在鸿蒙生态千帆启航仪式上&#xff0c;华为宣布了继鸿蒙4…

【原创】VMware创建子网,并使用软路由获得访问互联网的能力,并通过静态路由让上层网络访问位于虚拟机的子网

前言 一看标题就很离谱&#xff0c;确实内容也有点复杂&#xff0c;我的初衷是为后面搞软路由做准备&#xff0c;先通过VMware进行可行性验证&#xff0c;确定方案是否可行&#xff0c;再做下一步的计划。结论当然可以的&#xff0c;能通能访问&#xff0c;强的不行。 网络拓…

jdk17新特性—— 密封类(Sealed Classes)

目录 一、密封类(Sealed Classes)的概述1.1、概述1.2、特性1.3、注意事项 二、密封类(Sealed Classes)代码示例2.1、密封类(Sealed Classes)代码结构示例2.2、密封类(Sealed Classes)代码示例 三、密封类(Sealed Classes)接口代码示例3.1、密封类(Sealed Classes)接口代码结构示…

项目解决方案:4G/5G看交通数字化视频服务平台技术方案

目 录 1.总体描述 2.系统结构图 3.系统功能 3.1 信息交互 3.2 语音对讲 3.3 实时码流转换 3.4 流媒体集群和扩容 3.5 负载均衡 3.6 流媒体分发 3.7 流媒体点播 4.系统标准 4.1 流媒体传输 4.2 视频格式 4.3 质量标准 5.设备清单 1.总体描述 视频监控平…

LabVIEW潜油电泵数据采集系统

LabVIEW潜油电泵数据采集系统 介绍一个基于LabVIEW的潜油电泵数据采集系统。该系统目的是通过高效的数据采集和处理&#xff0c;提高潜油电泵的性能监控和故障诊断能力。 系统由硬件和软件两部分组成。硬件部分主要包括数据采集卡、传感器和电泵等&#xff0c;而软件部分则是…

STM32实时时钟(RTC)的配置和使用方法详解

实时时钟&#xff08;RTC&#xff09;是STM32系列微控制器上的一个重要模块&#xff0c;用于提供准确的时间和日期信息。在本文中&#xff0c;我们将详细介绍STM32实时时钟的配置和使用方法。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢…

如何恢复已删除的照片?

在这篇综合文章中发现恢复丢失照片的有效且免费的方法。无论您使用的是智能手机、iPhone、Windows 计算机、Mac、SD 卡还是数码相机&#xff0c;我们都提供有关如何恢复已删除照片的分步说明。此外&#xff0c;学习一些有价值的技巧&#xff0c;以防止将来意外删除照片。 意外…

scienceplots绘图浅尝

前言 科研写作中&#xff0c;黑压压的文字里面如果能有一些优美的图片无疑会给论文增色不少&#xff0c;绘图的工具有很多&#xff0c;常用的有Excel、Python、Matlab等&#xff0c;Matlab在绘图方面相较于Python有一种更加原生的科研风&#xff0c;而且可视化编辑图例、坐标轴…

【数据结构与算法】之哈希表系列-20240130

这里写目录标题 一、383. 赎金信二、387. 字符串中的第一个唯一字符三、389. 找不同四、409. 最长回文串五、448. 找到所有数组中消失的数字六、594. 最长和谐子序列 一、383. 赎金信 简单 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不…

三分钟教你入门规则引擎Drools

Drools是一款基于Java语言的开源的规则引擎&#xff0c;可以将复杂且多变的规则从硬编码中解放出来&#xff0c;以规则脚本的形式存放在文件或者特定的存储介质中(eg:数据库表)&#xff0c;使得业务规则的变更不需要修正项目代码&#xff0c;重启服务器就可以在线上环境立即生效…