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字段中这意味 ...
随机推荐
- [Google Guava] 6-字符串处理:分割,连接,填充
原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...
- jQuery.extend([deep], target, object1, [objectN])
jQuery.extend([deep], target, object1, [objectN]) 概述 用一个或多个其他对象来扩展一个对象,返回被扩展的对象.直线电机 如果不指定target,则给j ...
- AbstractWrapper ,EntityWrapper, QueryWrapper, UpdateWrappe
https://blog.csdn.net/qq_42112846/article/details/88086035 https://blog.csdn.net/m0_37034294/article ...
- python 关键参数和默认值
def hello_key(greeting='hello', name='world'): print('%s, %s' % (greeting, name)) hello_key() hello_ ...
- learning express step(六)
code: use application middleware var express = require('express'); var app = express(); app.use(func ...
- prometheus简单监控Linux,mysql,nginx
prometheus安装 下载安装 #官网下载 解压即可使用 https://prometheus.io/download/ #docker 方式安装 sudo docker run -n prome ...
- pandas入门之Series
一.创建Series 参数 - Series (Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组.轴标签统称为索引. - data 参数 - index ...
- [题解] [SDOI2017] 序列计数
题面 题解 和 SDOI2015 序列统计 比较像 这个无非就是把乘改成了加, NTT 改成了 MTT 再加上了一个小小的容斥 : 拿所有方案减去不合法方案即可 Code #include <a ...
- flask 设置配置文件的方式
from flask import Flask from flask import current_app """ 配置参数设置与读取 """ ...
- JS合并多个数组去重算法
var arr1 = ['a','b']; var arr2 = ['a','c','d']; var arr3 = [1,'d',undefined,true,null]; //合并两个数组,去重 ...