我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎样利用Flutter仿写微信搜索页效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎样利用Flutter仿写微信搜索页效果

小编今天带大家了解怎样利用Flutter仿写微信搜索页效果,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎样利用Flutter仿写微信搜索页效果”的知识吧。

    效果图

    怎样利用Flutter仿写微信搜索页效果

    如上图所示,我们用 Flutter 来仿写搜索页面,这里聊天首页点击搜索栏会跳转到搜索页,搜索页面包含顶部搜索框跟底部 ListView,在搜索框内我们输入搜索词会检索聊天列表模型中 name 属性中包含搜索词的模型,并在底部列表中展示,且搜索词高亮显示。下面我们分别来介绍下这些功能的实现。

    顶部搜索栏

    怎样利用Flutter仿写微信搜索页效果

    class SearchBar extends StatefulWidget {  final ValueChanged<String>? onChanged;  const SearchBar({this.onChanged});  @override  _SearchBarState createState() => _SearchBarState();}class _SearchBarState extends State<SearchBar> {  final TextEditingController _editingController = TextEditingController();  bool _showClose = false;  void _onChange(text) {    if (null != widget.onChanged) {      widget.onChanged!(text);    }    setState(() {      _showClose = ((text as String).length > 0);    });  }  @override  Widget build(BuildContext context) {    return Container(      height: 84,      color: CahtThemColor,      child: Column(        children: [          SizedBox(height: 40,), //上半部分留空          Container(            height: 44,            child: Row(              children: [                Container(                  width: screenWidth(context) - 50,                  height: 34,                  margin: EdgeInsets.only(left: 5, right: 10),                  padding: EdgeInsets.only(left: 5, right: 5),                  decoration: BoxDecoration(                    color: Colors.white,                    borderRadius: BorderRadius.circular(6.0),                  ),                  child: Row(                    children: [                      Image(image: AssetImage('images/放大镜b.png'), width: 20, color: Colors.grey,), //放大镜                      Expanded(child: TextField(                        controller: _editingController,                        onChanged: _onChange,                        autofocus: true,                        cursorColor: Colors.green,                        style: TextStyle(                          fontSize: 16.0,                          color: Colors.black87,                          fontWeight: FontWeight.w400,                        ),                        decoration: InputDecoration(                          contentPadding: EdgeInsets.only(left: 5, right: 5, bottom: 12,),                          border: InputBorder.none,                          hintText: '搜索',                          hintStyle: TextStyle(                            fontSize: 16.0,                            color: Colors.grey,                            fontWeight: FontWeight.w400,                          ),                        ),                      ),),                      if (_showClose) GestureDetector(                        onTap: () {                          //清空搜索框                          _editingController.clear();                          setState(() {                            _onChange('');                          });                        },                        child: Icon(                          Icons.cancel,                          color: Colors.grey,                          size: 20,                        ),                      ),                    ],                    mainAxisAlignment: MainAxisAlignment.spaceBetween,                  ),                ), //左边白色背景                GestureDetector (                  onTap: () {                    Navigator.pop(context);                  },                  child: Text('取消'),                ), //右边取消按钮              ],            ),          ), //搜索条部分        ],      ),    );  }}

    针对搜索页的整体布局我们可以分为顶部的搜索栏跟底部的搜索列表两部分,针对搜索栏我们单独定义了一个 SearchBar 的类来实现,底部搜索列表我们用 Expanded 部件进行了包装。

    SearchBar 实现细节

    针对 SearchBar 我们这里整体高度设置为了 84,这里最好高度定义为一个变量,根据机型来设置。针对搜索栏我们分为上下两部分,顶部留白及内容部分,顶部留白用 SizedBox 部件实现,底部内容用 Row 部件来实现,分为左边搜索框及右边取消按钮。

    左边搜索框实现

    搜索框整体部分我们用 Container 部件来实现,可以设置宽、高及圆角属性。child 属性我们也是用 Row 部件来实现,分为左边搜索图标、中间 TextField 及右边 关闭按钮。

    TextField 实现细节

    TextField 部件有两个比较重要的属性,onChangedcontrolleronChanged 我们传入了一个外部方法 _onChange,可以监听输入框文字的变化,当有文字时展示关闭按钮,没有文字时隐藏关闭按钮。controller 我们传入了一个外部定义的属性 _editingController,可以用来控制 TextField 的编辑。

    关闭按钮的实现

    关闭按钮我们根据 _showClose 来判断是否展示,且通过 GestureDetector 部件进行包装,点击的时候清空输入框及调用 _onChange 方法,参数传入空字符串,_onChange 方法中字符串为空的时候就会隐藏关闭按钮。

    右边取消按钮实现

    取消按钮点击的时候就是返回到上一个页面。

    内容的检索

    我们监听到文字输入框的变化后,就需要进行内容的检索,并且在底部列表中进行展示。

    内容的传递

    class SearchCell extends StatelessWidget {  final List<ChatModel>? datas;  const SearchCell({this.datas});}
    class SearchPage extends StatefulWidget {  final List<ChatModel>? datas;  const SearchPage({this.datas});}

    这里我们是基于聊天页面列表数据模型进行检索,找到名称中包含搜索词的模型进行展示。所以我们在 SearchCell 中定义了 datas 属性,并且在 SearchPage 中也定义了 datas 属性,分别在初始化的时候进行传递,这样我们在搜索页面就可以拿到了聊天列表的模型数据。

    内容的检索

    //满足查找条件的数据数组  List<ChatModel> _models = [];  //正在搜索的内容  String _searchStr = '';  // 搜索数据查找  void _searchData(String text) {    //每次搜索前先清空    _models.clear();    _searchStr = text;    if (text.length < 1) {      setState(() {});      return;    }    for (int i = 0; i < datas.length; i++) {      String name = widget.datas?[i].name as String;      if(name.contains(text)) {        _models.add(widget.datas?[i] as ChatModel);      }    }    setState(() {});  }

    我们把检索逻辑都抽取到了 _searchData 方法中,输入内容变化的时候调用 _searchData 方法。这里我们定义了一个 _models 数组,专门存放检索数据,我们遍历 datas,把检索到的模型添加到 _models 中。

    搜索列表实现

    TextStyle _normalStyle = TextStyle(    fontSize: 16,    color: Colors.black,  );  TextStyle _hightlightedStyle = TextStyle(    fontSize: 16,    color: Colors.green,  );  Widget _searchTitle(String name) {    List<TextSpan> textSpans = [];    List<String> searchStrs = name.split(_searchStr);    for (int i = 0; i < searchStrs.length; i++) {      String str = searchStrs[i];      if (str == '' && i < searchStrs.length - 1) {        textSpans.add(TextSpan(text: _searchStr, style: _hightlightedStyle));      } else {        textSpans.add(TextSpan(text: str, style: _normalStyle));        if (i < searchStrs.length - 1) {          textSpans.add(TextSpan(text: _searchStr, style: _hightlightedStyle));        }      }    }    return RichText(text: TextSpan(children: textSpans));  }

    搜索列表的 cell 就是复用聊天列表的 cell,但是需要变化的是搜索内容的高亮显示,所以 ListTile 部件的 title 属性我们用 RichText 来实现,实现内容这里抽取到了 _searchTitle 方法中。name.split(_searchStr) 会返回一个根据搜索词 _searchStr 进行分割的数组,但是当字符串的开头或者结尾有跟 _searchStr 相同的字符的时候在 searchStrs 数组中的元素就是空字符串,所以我们就需要进行特别判 str == ''。我们循环遍历 searchStrs 数组来创建 TextSpan 部件,并且根据内容是否跟搜索内容一样来分别指定样式 _normalStyle 与 _hightlightedStyle。

    感谢大家的阅读,以上就是“怎样利用Flutter仿写微信搜索页效果”的全部内容了,学会的朋友赶紧操作起来吧。相信编程网小编一定会给大家带来更优质的文章。谢谢大家对编程网网站的支持!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    怎样利用Flutter仿写微信搜索页效果

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    怎样利用Flutter仿写微信搜索页效果

    小编今天带大家了解怎样利用Flutter仿写微信搜索页效果,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎样利用Flutter仿写微
    2023-06-29

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录