Flutter 实现简单搜索功能
先建立一个主文件,继承StatelessWidget,然后在home属性中加入SearchBarDemo,这是一个自定义的Widget,主要代码都在这个文件中。
import 'package:flutter/material.dart';
import 'search_bar_demo.dart'; void main() =>runApp(MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title:'Flutter Demo',
theme: ThemeData.light(),
home: SearchBarDemo()
);
}
}
然后是搜索页面,里面包含数据及搜索功能。
工作中这些数据是后台传递给我们,或者写成配置文件的,这里我们就以List的方式代替了。我们在这个文件中定义了两个List:
const searchList = [
'jiejie-大长腿',
'jiejie-水蛇腰',
'gege-帅气欧巴',
'gege-小鲜肉'
]; const recentSuggest = [
'推荐-1',
'推荐-2',
];
点击搜索按钮
class SearchBarDemo extends StatefulWidget {
_SearchBarDemoState createState() => _SearchBarDemoState();
}
class _SearchBarDemoState extends State<SearchBarDemo> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SearchBarDemo'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
onPressed: (){
showSearch(context: context,delegate: SearchBarDelegate());
},
)
],
),
);
}
}
在点击图标时执行SearchBarDelegate 类,这个类继承与SearchDelegate类,继承后要重写里边的四个方法。
重写buildActions方法:
buildActions方法时搜索条右侧的按钮执行方法,我们在这里方法里放入一个clear图标。 当点击图片时,清空搜索的内容。
buildLeading 方法重写
这个时搜索栏左侧的图标和功能的编写,这里我们才用AnimatedIcon,然后在点击时关闭整个搜索页面。
buildResults方法重写
buildResults方法,是搜到到内容后的展现,因为我们的数据都是模拟的,所以我这里就使用最简单的Container+Card组件进行演示了。
buildSuggestions方法重写
这个方法主要的作用就是设置推荐,就是我们输入一个字,然后自动为我们推送相关的搜索结果。
class SearchBarDelegate extends SearchDelegate<String>{
//清空按钮
@override
List<Widget>buildActions(BuildContext context){
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () => query = "", //搜索值为空
)
];
}
//返回上级按钮
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow, progress: transitionAnimation
),
onPressed: () => close(context, null) //点击时关闭整个搜索页面
);
}
//搜到到内容后的展现
@override
Widget buildResults(BuildContext context){
return Container(
width: 100.0,
height:100.0,
child: Card(
color:Colors.redAccent,
child: Center(
child: Text(query),
),
),
);
}
//设置推荐
@override
Widget buildSuggestions(BuildContext context){
final suggestionsList= query.isEmpty
? recentSuggest
: searchList.where((input)=> input.startsWith(query)).toList();
return ListView.builder(
itemCount:suggestionsList.length,
itemBuilder: (context,index) => ListTile(
title: RichText( //富文本
text: TextSpan(
text: suggestionsList[index].substring(,query.length),
style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),
children: [
TextSpan(
text: suggestionsList[index].substring(query.length),
style: TextStyle(color: Colors.grey)
)
]
),
),
),
);
}
}
完整的search_bar_demo.dart文件代码如下:
import 'package:flutter/material.dart'; const searchList = [
'jiejie-大长腿',
'jiejie-水蛇腰',
'gege-帅气欧巴',
'gege-小鲜肉'
]; const recentSuggest = [
'推荐-1',
'推荐-2',
]; class SearchBarDemo extends StatefulWidget { _SearchBarDemoState createState() => _SearchBarDemoState();
} class _SearchBarDemoState extends State<SearchBarDemo> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SearchBarDemo'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
onPressed: (){
showSearch(context: context,delegate: SearchBarDelegate());
},
)
],
), );
}
} class SearchBarDelegate extends SearchDelegate<String>{
//清空按钮
@override
List<Widget>buildActions(BuildContext context){
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () => query = "", //搜索值为空
)
];
}
//返回上级按钮
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow, progress: transitionAnimation
),
onPressed: () => close(context, null) //点击时关闭整个搜索页面
);
}
//搜到到内容后的展现
@override
Widget buildResults(BuildContext context){
return Container(
width: 100.0,
height:100.0,
child: Card(
color:Colors.redAccent,
child: Center(
child: Text(query),
),
),
);
}
//设置推荐
@override
Widget buildSuggestions(BuildContext context){
final suggestionsList= query.isEmpty
? recentSuggest
: searchList.where((input)=> input.startsWith(query)).toList(); return ListView.builder(
itemCount:suggestionsList.length,
itemBuilder: (context,index) => ListTile(
title: RichText( //富文本
text: TextSpan(
text: suggestionsList[index].substring(,query.length),
style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold),
children: [
TextSpan(
text: suggestionsList[index].substring(query.length),
style: TextStyle(color: Colors.grey)
)
]
),
),
),
);
} }
Flutter 实现简单搜索功能的更多相关文章
- asp.net mvc 简单搜索功能
View中代码: <input type="text" class="searchText" id="searchText"/> ...
- PHP 实现简单搜索功能
方案:问答搜索 1. 搜索结果列表,高亮显示搜索关键词内容 2. 用户输入内容,点击搜索 2.1 获取用户的搜索内容: 2.2 调用分词服务,获取对搜索内容的分词: ...
- ElasticSearch(五):简单的ElasticSearch搜索功能
这里主要是一些简单的ElasticSearch的搜索功能,复杂的搜索,比如过滤,聚合等以后单独在写 1. 搜索全部 GET book/_search 直接搜索全部,下面是对搜索结果的详细介绍:默认情况 ...
- jQuery实现简单前端搜索功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Vue下简单分页及搜索功能
最近利用Vue和element ui仿写了个小页面,记一哈分页和搜索功能的简单实现. 首页 emmmm..... 搜索框输入..... 搜索完成 数据是直接写在这里面的: cardPhoto:[ ...
- jquery实现简单的搜索功能
管理系统中需要实现导航列表的搜索功能,写了一个简单的小栗子: <!DOCTYPE html> <html lang="en"> <head> & ...
- 简单三步-实现dede站内搜索功能
第一步:找到对应的搜索模板的代码 我们都知道,dede有自带的搜索功能,我们只要找到对应的模板,然后把我们想要的代码拿出来就行了.具体如下: 首先进入templets-->default--&g ...
- 【老孟Flutter】Flutter 2的新功能
老孟导读:昨天期待已久的 Flutter 2.0 终于发布了, Flutter Web和Null安全性趋于稳定,Flutter桌面安全性逐渐转向Beta版! 原文链接:https://medium.c ...
- ElasticSearch 5学习(4)——简单搜索笔记
空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...
随机推荐
- vue-cli webpack打包后index.html引入文件没有引号
参考地址:https://blog.csdn.net/i_coffer/article/details/81005733 在对vue-cli项目打包后出现index.html引入的css和js没有引号 ...
- Nginx中ngx_http_proxy_module模块
该模块允许将请求传递给另⼀一台服务器器指令:1 ,proxy_pass设置代理理服务器器的协议和地址以及应映射位置的可选 URI .作为协议,可以指定“ http 或 https .可以将地址指定为域 ...
- WeakReference 弱引用
弱引用是使用WeakReference类创建的.因为对象可能在任意时刻被回收,所以在引用该对象前必须确认它存在. class MainEntryPoint { static void Main() { ...
- Laravel API Errors and Exceptions: How to Return Responses
Laravel API Errors and Exceptions: How to Return Responses February 13, 2019 API-based projects are ...
- ** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
https://blog.csdn.net/qq_15071263/article/details/78459087 1. 警告解读 ** WARNING ** : Your ApplicationC ...
- web文件夹上传
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- 洛谷 P2251 质量检测(st表)
P2251 质量检测 题目提供者ws_ly 标签 难度 普及/提高- 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的 ...
- 「51Nod 1601」完全图的最小生成树计数 「Trie」
题意 给定\(n\)个带权点,第\(i\)个点的权值为\(w_i\),任意两点间都有边,边权为两端点权的异或值,求最小生成树边权和,以及方案数\(\bmod 10^9 + 7\) \(n \leq 1 ...
- AI 期刊会议
本文目的为寻找以下方向最新的发展方向和资料,比如期刊会议. AI包括以下方向:计算机视觉(CV).语言(NLP)和语音 A:计算机视觉(CV) B:语言(NLP) 1. 会议 ACL.EMNLP.NA ...
- iOS Jenkins 自动化打包构建
前言 在测试app项目过程中,通常都是需要开发打测试包给到测试,但是无论是iOS还是Android的打包过程都是相当漫长的,频繁的回归测试需要频繁的打包,对于开发同学影响还是蛮大的.因此在这种情况下, ...