1.效果展示
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTsejVFZ-1636550525807)(../pic/1636546107297.gif)]](https://img-blog.csdnimg.cn/946c045606714519b515937a4740a2a6.gif)
需要实现的功能:
- 自定义一个
SearchBar , 它在主页和搜索页会呈现不同的状态显示。 - 在搜索框中无输入的时候显示一个语音小图标,有输入的时候显示一个清除图标。
- 在 HomePage 首页中,用一个 Stack 将
appBar 叠加在内容区的上方,通过监听 NotificationListener 的滚动来改变 appBar 的背景色。 - 在搜索界面中
SearchPage 中,实现了一个快搜的功能,并且高亮 搜索的关键字 ,通过 ListView 来展示搜索的结果。
学习到的知识点:
- 自定义搜索框
Widget ,在不同的界面展示不同的效果。 - 实现快搜功能,根据输入的
keyword 及时查询接口展示。 - 关键字高亮处理
TextSpan 的使用。 - 常用输入控件
TextField 的使用,监听输入结果进行快搜过滤。
2.关键代码说明
1.搜索接口数据请求:
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:flutter_trip2/model/search_model.dart';
const SEARCH_URL =
'https://m.ctrip.com/restapi/h5api/searchapp/search?source=mobileweb&action=autocomplete&contentType=json&keyword=';
class SearchDao {
static Future<SearchModel> fetch(String keyword) async {
Response response = await Dio().get(SEARCH_URL + keyword);
if (response.statusCode == 200) {
SearchModel model = SearchModel.fromJson(response.data);
model.keyword = keyword;
return model;
} else {
throw Exception('Failed to load search');
}
}
}
2.自定义 SearchBar :
在 HomePage 中,通过滑动页面改变 appBar 的背景透明度: ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jrBPcAxo-1636550525809)(../pic/image-20211110204312186.png)]](https://img-blog.csdnimg.cn/e31a2b2b47bc4a0da770bd6d962b1398.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kkQLEBs-1636550525810)(../pic/image-20211110204240795.png)]](https://img-blog.csdnimg.cn/f809da758eeb4ab59c9440c6543a54f3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-goJkCZgj-1636550525811)(../pic/image-20211110211723569.png)]](https://img-blog.csdnimg.cn/ba68c21fba2c44228b267376bc403c9b.png)
1.关键代码如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUy9DUA1-1636550525812)(../pic/image-20211110205612800.png)]](https://img-blog.csdnimg.cn/b46afd53419e44b0890e4ed3631ebeb0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_19,color_FFFFFF,t_70,g_se,x_16) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DQocORVJ-1636550525813)(../pic/image-20211110205736204.png)]](https://img-blog.csdnimg.cn/c51ab3fc87744ef293ea71b3b01efc91.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
2.searchBar 的实现:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v3xmeQFm-1636550525814)(../pic/image-20211110205912525.png)]](https://img-blog.csdnimg.cn/e1d3d5dba06f4bd8b3216d7214eccc8d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
3.完整代码
SearchBar完整代码GitHub地址
3.searchPage 页面实现:
1.根据输入的内容进行快搜
将搜索的关键字保存,当请求成功后做一个比对,相同才进行渲染。 ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YqRgNSVn-1636550525814)(../pic/image-20211110210112297.png)]](https://img-blog.csdnimg.cn/e835d116ae9a40c09545b946e3e3b99e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
2.搜索的内容展示
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b46RdLZo-1636550525815)(../pic/image-20211110210324589.png)]](https://img-blog.csdnimg.cn/cadc15ea890741be9498346361dd45a7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
内容展示区由一个 ListView 来承载。每个 Item 布局 左边是一个分类的图标展示。右侧是一个 Title 的标题 和一个 SubTitle 的分类。并对关键搜索的关键词进行高亮展示。
1.高亮展示,首先将关键词在搜索结果中切出来,然后对结果进行拼接。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7168rkYp-1636550525815)(../pic/image-20211110210901181.png)]](https://img-blog.csdnimg.cn/bcfe5923fafb4e04b93394c565f5e76f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
2.定义 Title 样式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eaJtIxVL-1636550525816)(../pic/image-20211110211046145.png)]](https://img-blog.csdnimg.cn/d2f8fe31a12449cbb5022014da7a40da.png) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDgImVmX-1636550525816)(../pic/image-20211110210926337.png)]](https://img-blog.csdnimg.cn/5ee54f6b7bc640daa8f676767a799db8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
3.定义副标题样式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8otJdLk-1636550525817)(../pic/image-20211110211100137.png)]](https://img-blog.csdnimg.cn/2dd4030b2ece402196936e391671b58b.png) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbM52atQ-1636550525818)(../pic/image-20211110210948000.png)]](https://img-blog.csdnimg.cn/b777c496d0b04a49b43707ce7f3a6673.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
4.根据每个 Item 的类型匹配对应的图标
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PU17Jc0I-1636550525818)(../pic/image-20211110211221937.png)]](https://img-blog.csdnimg.cn/5dcc428616004a53aa567133a29868a2.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
在 assets 目录下存有对应的类型图标文件,我们通过 AssetImage 去加载对应的图片,记得在 pubspec.yaml 中导入它 ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s2IWlG26-1636550525819)(../pic/image-20211110211423257.png)]](https://img-blog.csdnimg.cn/e40fe5eb58d94a96804d34f6a95692ac.png) ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tujJ6gTk-1636550525819)(../pic/image-20211110211323851.png)]](https://img-blog.csdnimg.cn/b6404e309d4640fe84d612986d779277.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_10,color_FFFFFF,t_70,g_se,x_16)
3.完整代码地址
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rG41oHIM-1636550525820)(../pic/image-20211110211621456.png)]](https://img-blog.csdnimg.cn/b844e2b57492484283cd7b5d9a07159f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_13,color_FFFFFF,t_70,g_se,x_16) SearchPage 完整代码
3.搜索框的实现涉及到的代码
通过Git提交记录可以看到每次的修改点。 ![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y88b3rQv-1636550525820)(../pic/image-20211110212106156.png)]](https://img-blog.csdnimg.cn/2a48f8fc2e284581b9d0b555e43c213d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5YyX6Lev5ZCR5LiA,size_20,color_FFFFFF,t_70,g_se,x_16)
|