Flutter系列(八)搜索框详解

news2025/1/20 3:39:40

底部导航+顶部导航+图片列表的完整代码

Flutter系列(四)底部导航+顶部导航+图文列表完整代码_摸金青年v的博客-CSDN博客

目录

一、前言

二、搜索框实现方案

三、完整工程代码

1. 自定义的搜索框组件SearchAppBar   search.dart   

2. 搜索详情页 searchDetail.dart  

3. 在首页index.dart中,使用搜索框 SearchAppBar


一、前言

        本文实现当前主流app的搜索框:点击搜索框右侧滑动出搜索页,搜索页中有关键词,样式如图所示,图1是嵌入搜索框的首页,图2是点击搜索框后的搜索页

                                     

 二、搜索框实现方案

            1)搜索框:使用Container组件构建一个灰色圆角框,框内嵌入搜索图标Icon+文本编辑TextField,文本编辑这里设为禁用readOnly: true,真正的搜索在搜索页输入

           2) 搜索页:是一个普通页面,同样嵌入一个搜索框这里是可以编辑的,还有搜索历史的关键词

           3)页面切换:使用了动画特效,搜索页从右侧滑出(大部分的app都是这样的效果)

三、完整工程代码

 1. 自定义的搜索框组件SearchAppBar   search.dart   

import 'package:flutter/material.dart';
import 'package:flutter_play/searchDetail.dart';

/*搜索页*/
class SearchAppBar extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 32,  //搜索框高度
      decoration: BoxDecoration(
        color: const Color(0xFFF2F2F2),  // 搜索框背景色-灰色
        borderRadius: BorderRadius.circular(16), // 设置搜索框圆角
      ),
      child: Row(
        children: [
          const SizedBox(
            width: 32,
            height: 24,
            child: Icon(Icons.search, size: 16, color: Color(0xFF999999)),  //搜索框图标
          ),
          TextField(
            readOnly: true,  //只读不可编辑,点击搜索框直接跳转搜索页
            decoration: const InputDecoration(
              hintText: '人工智能',  //搜索提示词
              hintStyle: TextStyle(fontSize: 12, color: Color(0xFF999999)),  //搜索框文字样式
            ),
            onTap: () {
              Navigator.of(context).push(_createRoute());  //点击搜索框,路由到搜索页(动画效果: 右侧滑出)
            }, //onTap
          ),
        ],
      ),
    );
  }

  //页面切换动画特效-右侧滑出
  Route _createRoute() {
    return PageRouteBuilder(
      pageBuilder: (context, animation, secondaryAnimation) => SearchDetail(),  //右侧弹出搜索详情页
      transitionsBuilder: (context, animation, secondaryAnimation, child) {
        var begin = const Offset(1.0, 0.0);  //页面进入的起点坐标
        var end = Offset.zero;    //页面进入的终点坐标
        const curve = Curves.ease; 
        var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); //
        return SlideTransition(
          position: animation.drive(tween), 
          child: child,
        );
      },
    );
  }

}

2. 搜索详情页 searchDetail.dart  

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';

/*搜索详情页*/
class SearchDetail extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          backgroundColor: const Color(0xFFFBFBFB),  // 搜索框背景色
          automaticallyImplyLeading: false,  //隐藏左侧默认返回按钮
          title: Container(
            height: 32,
            decoration: BoxDecoration(
              color: const Color(0xFFF2F2F2),  // 搜索框背景色
              borderRadius: BorderRadius.circular(16), // 设置搜索框圆角
            ),
            child: Row(
              children: const [
                SizedBox(
                  width: 32,
                  height: 24,
                  child: Icon(Icons.search, size: 16, color: Color(0xFF999999)),  //搜索框图标
                ),
                TextField(
                  decoration: InputDecoration(
                    hintText: '人工智能',
                    hintStyle: TextStyle(fontSize: 12, color: Color(0xFF999999)),  //搜索框文字
                  ),
                ),
              ],
            ),
          ),
          actions: [
            Padding(
              padding: const EdgeInsets.fromLTRB(0, 8, 6, 0), //间距左,上,右,下
              child: cancelText(context),  // 取消,回退上一页
            )
          ],
      ),
      body: Column(
            crossAxisAlignment:  CrossAxisAlignment.start, //文字左对齐
            children:  [
              const Padding(
                padding: EdgeInsets.fromLTRB(10, 10, 0, 10),
                child: Text('搜索历史', style: TextStyle(fontWeight: FontWeight.w600)) //字体加粗
              ),
              Wrap(
                  spacing: 10, // 搜索关键词的间距
                  runSpacing: 10, // 搜索关键词的间距
                  children: KeyWords()  // 关键词列表
              )
            ]
      )
    );
  }

  // 取消-富文本点击方式实现
  Text cancelText(BuildContext context){
    return Text.rich(
        TextSpan(
            text: '取消',
            style: const TextStyle(height: 2, color: Colors.blue, fontSize: 14, fontWeight: FontWeight.w600),
            recognizer: TapGestureRecognizer()
              ..onTap = () {
                Navigator.pop(context);
              },
        )
    );
  }

  // 关键词列表
  List<Widget> KeyWords() => List.generate(9, (index) {
     return Container(
         padding: const EdgeInsets.all(6),
         decoration: BoxDecoration(
           color: const Color(0xFFF2F2F2),  // 搜索框背景色
           borderRadius: BorderRadius.circular(4), // 设置搜索框圆角
         ),
         child: Text("关键词 $index",
           style: const TextStyle(color: Color(0xFF999999), fontSize: 14, height: 1, fontWeight: FontWeight.w300)
         )
     );
  });

}

3. 在首页index.dart中,使用搜索框 SearchAppBar

import 'package:flutter/material.dart';
import 'package:flutter_play/recommend.dart';
import 'package:flutter_play/search.dart';

/*首页
* 顶部搜索框 SearchAppBar
* 顶部导航栏 TabBar
* 导航栏嵌入推荐页:RecommendPage 是图文列表 ListView
* */
class IndexPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: const Color(0xFFFBFBFB), //顶部背景色
          title: SearchAppBar(),  // 顶部搜素框(自定义组件)
          bottom: const TabBar(
            labelColor: Colors.blue,  //选中时颜色
            unselectedLabelColor: Colors.black26, //未选中时颜色
            tabs: [
              Tab(text: '推荐'),
              Tab(text: '资讯'),
              Tab(text: '科技'),
            ],
          ),
        ),
        body: TabBarView(
          children: [
            RecommendPage(),  // 推荐页
            const Icon(Icons.directions_transit),
            const Icon(Icons.directions_bike),
          ],
        ),
      ),
    );
  }
}

工程中的底部导航+顶部导航+图文列表完整代码,在系列文章第四篇

Flutter系列(四)底部导航+顶部导航+图文列表完整代码_摸金青年v的博客-CSDN博客

END...

 

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

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

相关文章

Java岗五面阿里,终拿offer,原来面试官总喜欢问这些问题

一面 一面就做了一道算法题&#xff0c;要求两小时内完成&#xff0c;给了长度为N的有重复元素的数组&#xff0c;要求输出第10大的数。典型的TopK问题&#xff0c;快排算法搞定。 算法题要注意的是合法性校验、边界条件以及异常的处理。另外&#xff0c;如果要写测试用例&am…

v1.5宝可梦综合耐久最大化计算器

版本更新v1.5 链接&#xff1a;https://pan.baidu.com/s/1JseHNYnAqIuSpg5f3k6Hbw?pwd01gy 提取码&#xff1a;01gy 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 更新说明 1.增加了特性威吓、灾祸之鼎、灾祸之简 使用说明 1.种族值&#xff1a;查百科获取…

Jmeter5.1.1报错:java.net.BindException: Address already in use: connect

Jmeter5.1.1报错&#xff1a;java.net.BindException: Address already in use: connect 原因&#xff1a;从网上找到资料&#xff1a;端口占用 Windows提供给TCP/IP链接的端口为 1024-5000&#xff0c;并且要四分钟来循环回收它们&#xff0c;就导致我们在短时间内跑大量的请…

【数据库】学习数据库该了解的基本知识

前言 在学习数据库之前&#xff0c;我们先要明确&#xff0c;sql是编程语言&#xff1b;Oracle&#xff0c;Mysql&#xff0c;SQL Server这些是数据库软件&#xff0c;sql这个语言是运行在数据库软件上的&#xff08;就像Java运行在jvm上一样&#xff09; 1、常见的关系型数据库…

HAProxy的安装、详细配置与实际应用(MyCAT、RabbitMQ示例)

HAProxy的安装、配置与实际应用 HAProxyHAProxy概述下载编译安装配置启动验证配置RabbitMQ的HAProxy示例 HAProxy HAProxy概述 HAProxy&#xff08;High Availability Proxy&#xff09;是一款自由、快速、可靠的TCP/HTTP负载均衡软件&#xff0c;其最常见的用途是将客户端请求…

使用signapk工具给apk系统签名

使用signapk给apk系统签名&#xff1a; 1、准备signapk.jar文件 查找路径&#xff1a; .\out\host\linux-x86\framework\signapk.jar 2、platform.x509.pem 和 platform.pk8 查找路径&#xff1a; .\vendor\prima\customer\certificatekey\prima 3、重点&#xff1a;将sdk…

Mac的PATH环境变量及相关文件加载顺序详细解释

系统级变量 /etc/profile /etc/paths 用户级变量(前3个按照从前往后的顺序读取&#xff0c;如果~/.bash_profile文件存在&#xff0c;则后面的几个文件就会被忽略不读了&#xff0c;如果~/.bash_profile文件不存在&#xff0c;才会以此类推读取后面的文件。~/.bashrc没有上述…

数据结构 | 排序 - 总结

排序的方式 排序的稳定性 什么是排序的稳定性&#xff1f; 不改变相同数据的相对顺序 排序的稳定性有什么意义&#xff1f; 假定一个场景&#xff1a; 一组成绩&#xff1a;100&#xff0c;88&#xff0c;98&#xff0c;98&#xff0c;78&#xff0c;100&#xff08;按交卷顺序…

【数据结构】队列(循环队列和链队列)详细讲解各种操作

&#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 图片来源网络&#xff0c;如果侵权&#xff0c;请联系我 目录 ⭐队…

爱智EdgerOS之深入解析离线下载任务

一、需求分析 在日常使用计算机的过程中&#xff0c;看到喜欢的资源不可避免地想把它下载到我们的设备上保存下来&#xff0c;比如图片&#xff0c;音视频资源&#xff0c;文档资源等&#xff0c;基于这种应用场景&#xff0c;现在来看看在爱智设备上可以如何实现呢&#xff1…

日撸 Java 三百行day33

文章目录 说明day33 图的广度优先遍历1.思路2.多个连通分量2 代码实现 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampled…

82.qt qml-2D粒子系统、粒子方向、粒子项(一)

由于粒子系统相关的类比较多, 所以本章参考自QmlBook in chinese的粒子章节配合学习: 由于QmlBook in chinese翻译过来的文字有些比较难理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 1.介绍 粒子模拟的核心是粒子系统(Partic…

ResNet残差网络

ResNet 目的 Resnet网络是为了解决深度网络中的退化问题&#xff0c;即网络层数越深时&#xff0c;在数据集上表现的性能却越差。 原理 ResNet的单元结构如下&#xff1a; 类似动态规划的选择性继承&#xff0c;同时会在训练过程中逐渐增大&#xff08;/缩小&#xff09;该…

数字图像基础【7】应用线性回归最小二乘法(矩阵版本)求解几何变换(仿射、透视)

这一章主要讲图像几何变换模型&#xff0c;可能很多同学会想几何变换还不简单嚒&#xff1f;平移缩放旋转。在传统的或者说在同一维度上的基础变换确实是这三个&#xff0c;但是今天学习的是2d图像转投到3d拼接的基础变换过程。总共包含五个变换——平移、刚性、相似、仿射、透…

尚融宝10-Excel数据批量导入

目录 一、数据字典 &#xff08;一&#xff09;、什么是数据字典 &#xff08;二&#xff09;、数据字典的设计 二、Excel数据批量导入 &#xff08;一&#xff09;后端接口 1、添加依赖 2、创建Excel实体类 3、创建监听器 4、Mapper层批量插入 5、Service层创建监听…

2023年,想要靠做软件测试获得高薪,我还有机会吗?

时间过得很快&#xff0c;一眨眼&#xff0c;马上就要进入2023年了&#xff0c;到了年底&#xff0c;最近后台不免又出现了经常被同学问道这几个问题&#xff1a;2023年还能转行软件测试吗&#xff1f;零基础转行可行吗&#xff1f; 本期小编就“2023年&#xff0c;入行软件测…

一文解决nltk安装问题ModuleNotFoundError: No module named ‘nltk‘,保姆级教程

目录 问题一&#xff1a;No module named ‘nltk‘ 问题二&#xff1a;Please use the NLTK Downloader to obtain the resource 下载科学上网工具 问题三&#xff1a;套娃报错 如果会科学上网&#xff0c;可以直接看问题三 问题一&#xff1a;No module named ‘nltk‘ Mo…

【微服务笔记16】微服务组件之Gateway服务网关基础环境搭建

这篇文章&#xff0c;主要介绍微服务组件之Gateway服务网关基础环境搭建。 目录 一、Gateway服务网关 1.1、什么是Gateway 1.2、Gateway基础环境搭建 &#xff08;1&#xff09;基础环境介绍 &#xff08;2&#xff09;引入依赖 &#xff08;3&#xff09;添加路由配置信…

软件测试工程师的进阶之旅

很多人对测试工程师都有一些刻板印象&#xff0c;比如觉得测试“入门门槛低&#xff0c;没有技术含量”、“对公司不重要”、“操作简单工作枯燥”“一百个开发&#xff0c;一个测试”等等。 会产生这种负面评论&#xff0c;是因为很多人对测试的了解&#xff0c;还停留在几年…

Lesson12 udptcp协议

netstat命令->查看网络状态 n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字l 仅列出有在 Listen (监听) 的服務状态p 显示建立相关链接的程序名t (tcp)仅显示tcp相关选项u (udp)仅显示udp相关选项a (all)显示所有选项&#xff0c;默认不显示LISTEN相关 pidof命令-&…