我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Flutter怎么实现自定义搜索框AppBar

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Flutter怎么实现自定义搜索框AppBar

这篇文章主要讲解了“Flutter怎么实现自定义搜索框AppBar”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter怎么实现自定义搜索框AppBar”吧!

介绍

开发中,页面头部为搜索样式的设计非常常见,为了可以像系统AppBar那样使用,这篇文章记录下在Flutter中自定义一个通用的搜索框AppBar记录。

功能点: 搜索框、返回键、清除搜索内容功能、键盘处理。

效果图

Flutter怎么实现自定义搜索框AppBar

实现步骤

首先我们先来看下AppBar的源码,实现了PreferredSizeWidget类,我们可以知道这个类主要是控制AppBar的高度的,Scaffold脚手架里的AppBar的参数类型就是PreferredSizeWidget类型。

class AppBar extends StatefulWidget implements PreferredSizeWidget{...preferredSize = _PreferredAppBarSize(toolbarHeight, bottom?.preferredSize.height),.../// {@template flutter.material.appbar.toolbarHeight}/// Defines the height of the toolbar component of an [AppBar].////// By default, the value of `toolbarHeight` is [kToolbarHeight]./// {@endtemplate}final double? toolbarHeight;.../// The height of the toolbar component of the [AppBar].const double kToolbarHeight = 56.0;}abstract class PreferredSizeWidget implements Widget {  // 设置在不受约束下希望的大小  // 设置高度:Size.fromHeight(myAppBarHeight)  Size get preferredSize;}

为了方便扩展,可以在Scaffold里使用,我们需要创建AppBarSearch类继承有状态StatefulWidget类并实现PreferredSizeWidget类,实现preferredSize方法,并设置高度。

class AppBarSearch extends StatefulWidget implements PreferredSizeWidget {@overrideSize get preferredSize => Size.fromHeight(height);}

因为ScaffoldAppBar实现了状态栏的适配,核心见下方源码:

//获取状态栏高度MediaQuery.of(context).padding.top;

Flutter怎么实现自定义搜索框AppBar

这里我们直接返回AppBar,并进行改造。(当然这里也可以不返回AppBar我们自己处理状态栏的高度也行)。

思路: AppBar title字段自定义输入框,主要通过文本框监听实现清除搜索内容和显示清除按钮的功能,通过输入框是否有焦点监听进行刷新布局,通过定义回调函数的方式来进行搜索内容的监听。

// 输入框控制_controller = widget.controller ?? TextEditingController();// 焦点控制_focusNode = widget.focusNode ?? FocusNode();// 焦点获取失去监听_focusNode?.addListener(() => setState(() {}));// 文本输入监听_controller?.addListener(() => setState(() {}));

键盘搜素监听:

只需设置TextField的这两个属性即可。

textInputAction: TextInputAction.search,onSubmitted: widget.onSearch, //输入框完成触发

键盘弹出收起处理:

在iOS中键盘的处理是需要我们自己来进行处理的,我们需要的功能是点击搜索框之外的地方失去焦点从而关闭键盘,这里我使用了处理键盘的一个插件:flutter_keyboard_visibility: ^5.1.0,在我们需要处理焦点事件页面根布局使用KeyboardDismissOnTap外部包裹即可,这个插件还可以主动控制键盘的弹出和收起,有兴趣的小伙伴可以了解下。

return KeyboardDismissOnTap(    child: Material();

完整源码

/// 搜索AppBarclass AppBarSearch extends StatefulWidget implements PreferredSizeWidget {  AppBarSearch({    Key? key,    this.borderRadius = 10,    this.autoFocus = false,    this.focusNode,    this.controller,    this.height = 40,    this.value,    this.leading,    this.backgroundColor,    this.suffix,    this.actions = const [],    this.hintText,    this.onTap,    this.onClear,    this.onCancel,    this.onChanged,    this.onSearch,    this.onRightTap,  }) : super(key: key);  final double? borderRadius;  final bool? autoFocus;  final FocusNode? focusNode;  final TextEditingController? controller;  // 输入框高度 默认40  final double height;  // 默认值  final String? value;  // 最前面的组件  final Widget? leading;  // 背景色  final Color? backgroundColor;  // 搜索框内部后缀组件  final Widget? suffix;  // 搜索框右侧组件  final List<Widget> actions;  // 输入框提示文字  final String? hintText;  // 输入框点击回调  final VoidCallback? onTap;  // 清除输入框内容回调  final VoidCallback? onClear;  // 清除输入框内容并取消输入  final VoidCallback? onCancel;  // 输入框内容改变  final ValueChanged<String>? onChanged;  // 点击键盘搜索  final ValueChanged<String>? onSearch;  // 点击右边widget  final VoidCallback? onRightTap;  @override  _AppBarSearchState createState() => _AppBarSearchState();  @override  Size get preferredSize => Size.fromHeight(height);}class _AppBarSearchState extends State<AppBarSearch> {  TextEditingController? _controller;  FocusNode? _focusNode;  bool get isFocus => _focusNode?.hasFocus ?? false; //是否获取焦点  bool get isTextEmpty => _controller?.text.isEmpty ?? false; //输入框是否为空  bool get isActionEmpty => widget.actions.isEmpty; // 右边布局是否为空  bool isShowCancel = false;  @override  void initState() {    _controller = widget.controller ?? TextEditingController();    _focusNode = widget.focusNode ?? FocusNode();    if (widget.value != null) _controller?.text = widget.value ?? "";    // 焦点获取失去监听    _focusNode?.addListener(() => setState(() {}));    // 文本输入监听    _controller?.addListener(() {      setState(() {});    });    super.initState();  }  // 清除输入框内容  void _onClearInput() {    setState(() {      _controller?.clear();    });    widget.onClear?.call();  }  // 取消输入框编辑失去焦点  void _onCancelInput() {    setState(() {      _controller?.clear();      _focusNode?.unfocus(); //失去焦点    });    // 执行onCancel    widget.onCancel?.call();  }  Widget _suffix() {    if (!isTextEmpty) {      return InkWell(        onTap: _onClearInput,        child: SizedBox(          width: widget.height,          height: widget.height,          child: Icon(Icons.cancel, size: 22, color: Color(0xFF999999)),        ),      );    }    return widget.suffix ?? SizedBox();  }  List<Widget> _actions() {    List<Widget> list = [];    if (isFocus || !isTextEmpty) {      list.add(InkWell(        onTap: widget.onRightTap ?? _onCancelInput,        child: Container(          constraints: BoxConstraints(minWidth: 48.w),          alignment: Alignment.center,          child: MyText(            '搜索',            fontColor: MyColors.color_666666,            fontSize: 14.sp,          ),        ),      ));    } else if (!isActionEmpty) {      list.addAll(widget.actions);    }    return list;  }  @override  Widget build(BuildContext context) {    return AppBar(      backgroundColor: widget.backgroundColor,      //阴影z轴      elevation: 0,      // 标题与其他控件的间隔      titleSpacing: 0,      leadingWidth: 40.w,      leading: widget.leading ??          InkWell(            child: Icon(              Icons.arrow_back_ios_outlined,              color: MyColors.color_666666,              size: 16.w,            ),            onTap: () {              Routes.finish(context);            },          ),      title: Container(          margin: EdgeInsetsDirectional.only(end: 10.w),          height: widget.height,          decoration: BoxDecoration(            color: Color(0xFFF2F2F2),            borderRadius: BorderRadius.circular(widget.borderRadius ?? 0),          ),          child: Container(            child: Row(              children: [                SizedBox(                  width: widget.height,                  height: widget.height,                  child:                      Icon(Icons.search, size: 20.w, color: Color(0xFF999999)),                ),                Expanded(                  // 权重                  flex: 1,                  child: TextField(                    autofocus: widget.autoFocus ?? false,                    // 是否自动获取焦点                    focusNode: _focusNode,                    // 焦点控制                    controller: _controller,                    // 与输入框交互控制器                    //装饰                    decoration: InputDecoration(                      isDense: true,                      border: InputBorder.none,                      hintText: widget.hintText ?? '请输入关键字',                      hintStyle: TextStyle(                          fontSize: 14.sp, color: MyColors.color_666666),                    ),                    style: TextStyle(                      fontSize: 14.sp,                      color: MyColors.color_333333,                    ),                    // 键盘动作右下角图标                    textInputAction: TextInputAction.search,                    onTap: widget.onTap,                    // 输入框内容改变回调                    onChanged: widget.onChanged,                    onSubmitted: widget.onSearch, //输入框完成触发                  ),                ),                _suffix(),              ],            ),          )),      actions: _actions(),    );  }  @override  void dispose() {    _controller?.dispose();    _focusNode?.dispose();    super.dispose();  }}

感谢各位的阅读,以上就是“Flutter怎么实现自定义搜索框AppBar”的内容了,经过本文的学习后,相信大家对Flutter怎么实现自定义搜索框AppBar这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Flutter怎么实现自定义搜索框AppBar

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Flutter怎么实现自定义搜索框AppBar

这篇文章主要讲解了“Flutter怎么实现自定义搜索框AppBar”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter怎么实现自定义搜索框AppBar”吧!介绍开发中,页面头部为搜索
2023-06-30

Flutter怎么实现自定义下拉选择框

这篇“Flutter怎么实现自定义下拉选择框”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter怎么实现自定义下拉选
2023-06-30

Flutter怎么实现自定义themes

这篇“Flutter怎么实现自定义themes”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Flutter怎么实现自定义th
2023-07-05

怎么用c++ qt自定义搜索编辑框

今天小编给大家分享一下怎么用c++ qt自定义搜索编辑框的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现效果如下:实现方法
2023-06-29

自定义搜索功能Android实现

先看看效果图:源码下载:自定义搜索功能 代码: SearchActivity.javapackage com.bzu.gxs.search.activity; import android.app.Activity; import andr
2022-06-06

Flutter实现自定义筛选框的方法

本篇内容主要讲解“Flutter实现自定义筛选框的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Flutter实现自定义筛选框的方法”吧!目录一、首先自定义筛选框的按钮视图,布局很简单,一个
2023-06-20

Android自定义View软键盘实现搜索

1. xml文件中加入自定义 搜索view2022-06-06

iOS 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能

注:CSDN的代码块有点捞,如果浏览器窗口较窄,一行代码占了两行的位置,后面的代码就看不到了,大家可以把浏览器窗口拉大一点 UI小姐姐设计的搜索框经常是五花八门,系统的搜索框经常不能满足我们的需求,需要我们特别定制一个。但是UITextFi
2022-06-01

avue如何实现自定义搜索栏及清空搜索事件

这篇文章主要介绍“avue如何实现自定义搜索栏及清空搜索事件”,在日常操作中,相信很多人在avue如何实现自定义搜索栏及清空搜索事件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”avue如何实现自定义搜索栏及
2023-06-25

java怎么实现搜索框搜索功能

要实现搜索框搜索功能,可以按照以下步骤进行:1. 在前端页面上创建一个搜索框,如一个文本框和一个按钮。2. 在后端创建一个处理搜索请求的接口。可以使用Java的Servlet或者Spring MVC框架来创建接口。3. 在后端接口中获取前端
2023-09-26

Android顶部搜索框怎么实现

要实现Android顶部搜索框,可以使用Toolbar和SearchView组件。首先,在你的布局文件中添加一个Toolbar组件作为顶部导航栏:然后,在你的Activity中找到Toolbar并设置为ActionBar:Toolbar
2023-10-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录