博客地址:

https://jspang.com/post/flutterDemo.html#toc-1b4

视频地址:https://www.bilibili.com/video/av39709290/?p=11

定义类searchBarDelegate

继承SearhDelegate 并复写里面的方法

需要复写里面的四个方法。我们定义类:searchBarDelegate

重写第一个方法 buildActions

重写的第一个方法:buildActions 就是搜索的时候右边的差号。里面接收 一个上下文。一般我们返回一个IconButton

query就是我们搜索的参数。我们设置为空。

点击事件,一点击的时候就把搜索内容设置为空

第二个方法buildLeading

复写第二个方法:就是最左侧我们返回的箭头

下图中的build单词拼错了后续已经改正过来

重写第三个方法:buildResults

再重写我们的搜索结果:buildResults

我们返回Container容器。child里面放Card组件,为了让搜索结果好看一点

为了Card卡片变得好看一些,我们给它一个亮红色

重写第四个方法buildSuggestions

再重写最重要的一个方法:

用户一边搜索一般提示用户的内容;

这里我们采用三元运算符的方式

效果展示

最终代码

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()
);
}
}

main.dart

import 'package:flutter/material.dart';
import 'asset.dart'; class SearchBarDemo extends StatefulWidget {
@override
_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),//关闭context上下文
);
}
@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 build)
{
final suggestionList=query.isEmpty
? recentSuggest
:searchList.where((input)=> input.startsWith(query)).toList();
//这里发返回动态列表
return ListView.builder(
itemCount: suggestionList.length,
itemBuilder: (contex,index)=> ListTile(
title: RichText(//这里使用富文本
text: TextSpan(
text: suggestionList[index].substring(,query.length),//截取搜索的关键的长度
style: TextStyle(//截取的字给他一个黑色字体样式,并加粗
color: Colors.black,fontWeight: FontWeight.bold
),
children: [
TextSpan(
text: suggestionList[index].substring(query.length),
style: TextStyle(color: Colors.grey)
)
]
),
),
),
);
}
}

search_bar_demo.dart

const searchList=[
"jiejie-大长腿",
"jiejie-水蛇腰",
"gege-帅气欧巴",
"gege-小鲜肉",
];
//默认的数组
const recentSuggest=[
"推荐-1",
"推荐-2"
];

asset.dart

20个Flutter实例视频教程-第11节: 一个不简单的搜索条-2的更多相关文章

  1. 20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1

    20个Flutter实例视频教程-第10节: 一个不简单的搜索条-1 视频地址: https://www.bilibili.com/video/av39709290/?p=10 博客地址: https ...

  2. 20个Flutter实例视频教程-第13节: 展开闭合案例

    20个Flutter实例视频教程-第13节: 展开闭合案例 视频地址: https://www.bilibili.com/video/av39709290/?p=13 博客地址: https://js ...

  3. 20个Flutter实例视频教程-第03节: 不规则底部工具栏制作-1

    第03节: 不规则底部工具栏制作-1 博客地址: https://jspang.com/post/flutterDemo.html#toc-973 视频地址: https://www.bilibili ...

  4. 20个Flutter实例视频教程-第05节: 酷炫的路由动画-1

    视屏地址: https://www.bilibili.com/video/av39709290/?p=5 博客地址: https://jspang.com/post/flutterDemo.html# ...

  5. 20个Flutter实例视频教程-第02节: 底部导航栏制作-2

    视频地址: https://www.bilibili.com/video/av39709290?p=2 博客地址: https://jspang.com/post/flutterDemo.html#t ...

  6. 20个Flutter实例视频教程-第04节: 不规则底部工具栏制作-2

    视频地址: https://www.bilibili.com/video/av39709290/?p=4 博客地址: https://jspang.com/post/flutterDemo.html# ...

  7. 20个Flutter实例视频教程-第06节: 酷炫的路由动画-2

    博客地址: https://jspang.com/post/flutterDemo.html#toc-94f 视频地址: https://jspang.com/post/flutterDemo.htm ...

  8. 20个Flutter实例视频教程-第07节: 毛玻璃效果制作

    视频地址: https://www.bilibili.com/video/av39709290/?p=7 博客地址: https://jspang.com/post/flutterDemo.html# ...

  9. 20个Flutter实例视频教程-第08节: 保持页面状态

    博客地址: https://jspang.com/post/flutterDemo.html#toc-bb9 视频地址: https://www.bilibili.com/video/av397092 ...

随机推荐

  1. NYOJ 905 卡片游戏

    卡片游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描写叙述 小明近期宅在家里无聊.于是他发明了一种有趣的游戏.游戏道具是N张叠在一起的卡片,每张卡片上都有一个数字,数字 ...

  2. 记录一次在 VirtualBox的添加共享windows文件后,发现没有共享文件的事

    在VirtualBox设置完桥接添加ip后,在设备中添加共享windows文件,“e:\work ”,发现共享目录没有文件.使用了各种reboot之后,还是没有发现共享文件夹,重新设置还是不行,用mo ...

  3. Erlang二进制模式匹配

    Erlang的模式匹配用来处理二进制数据可谓是得心应手.不仅直观,而且超乎想象的简单.在C++中,处理二进制数据首先要管理缓冲区.然后再按字节进行操作,如果要处理的数据不是按字节对齐,则需要进行位移等 ...

  4. EasyIPCamera通过RTSP协议接入海康、大华等摄像机,摒弃私有SDK接入弊端

    本文转自博客:http://blog.csdn.net/xinlanbobo/article/details/53156742 近期工作中需要开发一套视频监控系统,实现WEB端.手机APP端预览局域网 ...

  5. final、finally、三个关键字的区别

    一 final 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以 ...

  6. java手写单例模式

    1 懒汉模式 public class Singleton { private Singleton singleton = null; private Singleton() { } public S ...

  7. Windows服务器从Linux服务器上以FTP形式获取图片

    Windows服务器上运行一个获取图片的程序,获取图片采用的是FTP方式: 准备条件: Linux服务器上创建一个FTP的用户:ftppic 这个账号要有权限才可以,然后编写Windows端代码: p ...

  8. 盒子的display属性

    <body> <div style="display:inline">Box-1</div> <div style="displ ...

  9. HDU1133 Buy the Ticket —— 卡特兰数

    题目链接:https://vjudge.net/problem/HDU-1133 Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Me ...

  10. 一个selenium笔试题——去哪网首页获取符合要求的url并保存

    今天在群里看到这样一个笔试题:请使用任何熟悉的面向对象编程语言,编写代码,获取http://www.qyer.com页面中,所有</a>标签"href"属性值包含英文单 ...