flutter搜索功能实现

2020-07-01   阅读:7090   分类: 前端    标签: Flutter

搜索功能在每个app里面必不可少,也是常见的功能,以下是个案例。

效果图展示:

1.jpg

2.jpg

说明:本功能实现,点击搜索框跳转至搜索页面,搜索联想功能

import 'package:flutter/material.dart';
import 'detail_page.dart';
 
class HomePage extends StatefulWidget{
  _TvPageState createState() => _TvPageState();
}
 
class _TvPageState extends State<HomePage> with AutomaticKeepAliveClientMixin{
  @override
  void initState(){
    super.initState();
  }
  @override
  Widget build(BuildContext context){
//    super.build(context);
    return Scaffold(
      backgroundColor: Color.fromRGBO(244, 245, 245, 1),
      appBar: AppBar(
 
        title: Container(
          child:InkWell(
            onTap: (){
              showSearch(context: context, delegate: CustomSearchDelegate()); //实现点击跳转至搜索页面
            },
            child: Row(
              children: <Widget>[
                Container(
                  child: Text(
                    '广州',
                    style: TextStyle(fontSize: 14),
                  ),
                ),
                Container(
                  width: ScreenUtil().setWidth(50),
                  child: Icon(
                      Icons.expand_more,
                      color: Colors.white,
                      size:20
                  ),
                ),
                Container(
                    width: ScreenUtil().setWidth(515),
                    decoration: BoxDecoration(
                      color: Colors.white,
                      borderRadius: BorderRadius.all(Radius.circular(50.0)),
                    ),
                    height: 30,
                    child: Row(
                      children: <Widget>[
                        Container(
                            width: ScreenUtil().setWidth(60),
                            child:
                            Icon(
                                Icons.search,
                                color: Colors.grey,
                                size:20
                            )
                        ),
                        Container(
                          width: ScreenUtil().setWidth(400),
                          child:
                          Text(
                            '影视名称/主演',
                            style: TextStyle(color: Colors.black,fontSize: 16),
                          ),
                        ),
                        Container(
                          width: ScreenUtil().setWidth(50),
                          child: Icon(
                              Icons.mic,
                              color: Colors.grey,
                              size:20
                          ),
                        )
 
                      ],
                    )
                ),
              ],
            ),
          ),
        )
      ),
    );
  }
 
//搜索
class CustomSearchDelegate extends SearchDelegate {
  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
        tooltip: 'Clear',
        icon: const Icon(Icons.clear),
        onPressed: () {
          query = '';
          showSuggestions(context);
        },
      )
    ];
  }
 
  @override
  String get searchFieldLabel => "影视名称/主演";
  Widget buildLeading(BuildContext context) {
    return IconButton(
      tooltip: 'Back',
      icon: AnimatedIcon(
        icon: AnimatedIcons.menu_arrow,
        progress: transitionAnimation,
      ),
      onPressed: () {
        this.close(context, null);
      },
    );
  }
 
  @override
  TextInputType get keyboardType => TextInputType.text;  //设置输入框输入内容类型
 
  @override
  Widget buildResults(BuildContext context) {
//    if (int.parse(query) >= 100) {
//      return Center(child: Text('请输入小于 100 的数字'));
//    }
    var map = Map();
    map["query"] = query;
    return Scaffold(
        body: FutureBuilder(
            future: request('gsearchs',formData: map),
            builder: (context,AsyncSnapshot snapshot) {
              if(snapshot.connectionState ==ConnectionState.done){
                if(snapshot.hasData){
                  var data = json.decode(snapshot.data.toString());
                  return ListView.builder(
                      itemCount: List.of(data["data"]).length,
                      itemBuilder: (BuildContext context, int index) {
                        return InkWell(
                          onTap: (){
                            Navigator.of(context).push(
                                MaterialPageRoute(builder: (context)=>DetailPage(
                                    eachVodId: List.of(data["data"])[index]['id'],
                                    eachVodName:List.of(data["data"])[index]['vod_name'],
                                    p:1
                                ))
                            );
                          },
                          child:ListTile(title: Text(List.of(data["data"])[index]['vod_name'])),
                        );
 
                      }
                  );
                }else{
                  return Center(child: CircularProgressIndicator());
                }
 
              }else{
                return Center(child: CircularProgressIndicator());
              }
 
            })
    );
  }
 
  @override
  Widget buildSuggestions(BuildContext context) {
    var map = Map();
    map["query"] = query;
    return Scaffold(
        body: FutureBuilder(
            future: request('gsearchs',formData: map),
            builder: (context, snapshot) {
              if(snapshot.connectionState ==ConnectionState.done){
                if(snapshot.hasData){
                  var data = json.decode(snapshot.data.toString());
                  return ListView.builder(
                      itemCount: List.of(data["data"]).length,
                      itemBuilder: (BuildContext context, int index) {
                        return InkWell(
                          onTap: (){
                            Navigator.of(context).push(
                                MaterialPageRoute(builder: (context)=>DetailPage(
                                    eachVodId: List.of(data["data"])[index]['id'],
                                    eachVodName:List.of(data["data"])[index]['vod_name'],
                                    p:1
 
                                ))
                            );
                          },
                          child:ListTile(title: Text(List.of(data["data"])[index]['vod_name'])),
                        );
 
                      }
                  );
                }else{
                  return Center(child: CircularProgressIndicator());
                }
 
              }else{
                return Center(child: CircularProgressIndicator());
              }
 
            })
    );
 
  }
 
}


【腾讯云】2核2G云服务器新老同享99元/年续费同价,8888元代金券限时抢

‘简忆博客’微信公众号 扫码关注‘简忆博客’微信公众号,获取最新文章动态
转载:请说明文章出处“来源简忆博客”。 http://www.tpxhm.com/fdetail/357.html

×
觉得文章有用就打赏一下文章作者
微信扫一扫打赏 微信扫一扫打赏
支付宝扫一扫打赏 支付宝扫一扫打赏

上一篇: flutter页面间跳转和销毁方法

下一篇: flutter常见命令整理收藏

文章评论(0)

登录
简忆博客壁纸一
简忆博客壁纸二
简忆博客壁纸三
简忆博客壁纸四
简忆博客壁纸五
简忆博客壁纸六
简忆博客壁纸七
简忆博客壁纸八
头像

简忆博客
勤于学习,乐于分享

置顶推荐

代码版本管理工具Git常用命令操作

代码版本管理工具Git常用命令操作

html前端按钮效果

html前端按钮效果

swiper插件的使用

swiper插件的使用

管理服务器常见的几个命令

管理服务器常见的几个命令

【腾讯云】2核2G云服务器新老同享99元/年续费同价,8888元代金券限时抢

标签云

TP8 PgSQL Highlight SqlServer 字节跳动 企业微信 uView MongoDB 微擎 wepy ES6 游戏 uni-app WordPress canvas FaceBook SEM 云存储 刷机 Flutter vscode Docker RabbitMQ SVN composer 插件 路由器 TP6 OneThink Vue swoole Redis 帝国cms CodeIgniter 虚拟机 方法技巧 防护 软件下载 JavaScript AI go语言 Android JAVA Git Layui React 区块链 Laravel Mysql node.js html linux window ECharts GITHUB bootstrap UEditor SEO 模板 服务器 微信开发 ECSHOP style 正则 PhpStorm 轮播插件 sublime text 工具 layui.js Python 操作系统 PhotoShop jQuery TP5 ThinkPHP AJAX PHP API office 微信小程序 织梦cms

浏览排行

1 Facebook账号注册流程,手把手教你注册脸书账号 2 phpstorm 2019.2.1最新版激活码及破解教程更新至2021 3 oppo a57手机miui_V8.5.4.0刷机包下载及刷机教程 4 抖音发布视频作品定位设置成其他位置方法 5 npm ERR! missing script: serve 报错解决方法 6 解决Photoshop 打开报错找不到 VCRUNTIME140_1.dll问题 7 解决Vue报错Module not found: Error: Can't resolve 'less-loader' in 'C:\Users\Hm\Desktop\vue\vue_shop'问题 8 解决微信公众号分享给好友,朋友圈报错errMsg: "onMenuShareAppMessage:fail, the permission value is offline verifying" 9 解决win10分屏设置主显示器后图标不在主显示器问题 10 解决Linux 宝塔装完了提示“请先安装Web服务器!” 11 解决Centos7执行安装命令显示您需要 root 权限执行此命令 12 xftp 6破解版下载
【腾讯云】2核2G云服务器新老同享99元/年续费同价,8888元代金券限时抢

最近热文

1 PHPStorm2020.1永久激活及下载,更新至2023 2 PostgreSQL数据库,pg数据库的一些操作命令 3 解决laravel-admin 登录无限重定向问题 4 PHP结合安卓APP,监听支付宝收款,实现个人支付宝支付接口 5 ThinkPHP6自带分页定制,自定义分页类 6 Word2010如何从指定页设置页码 6 《真还传》,6亿债务已还超4亿 预计1年多之内就能还清 7 网易跟贴正在整改 暂不支持发贴 8 国务院今天发布2021节假日安排,元旦3天,春节7天,劳动节5天 9 快手视频去水印方法,如何去除快手视频水印

打赏本站

如果你觉得本站很棒,可以通过扫码支付打赏哦!
微信扫码:你说多少就多少~
微信扫码
支付宝扫码:你说多少就多少~
支付宝扫码

友情链接

冯奎博客 陌路寒暄 淘优惠 简忆工具箱 vipbic 图鸟社区 c32's blog 武林新纪元
×

聚圣源北辙南辕演员表《斗破苍穹》唐山男宝宝起名羊汤馆起个名字武胜路花鸟市场生命数字小孩起名网免费取名宋氏御香排骨加盟费起名数理数1到81的解释属龙开店起名大全公司保安起名字公司起名怎么起根据论语起名字女孩曦字起名罪域演员表高铁订票陈博男孩起名女装起名好听的名字随机 起名起四个字的名字好吗巴黎圣母院读后感管件公司起名免费东北大米起名瘦金书2018新生儿起名打分王岚宝宝算命起名宝宝起名宝典起名渗透定价古文起名字男孩淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化