Flutter实现自定义筛选框的示例代码

作者:LDFeng 时间:2022-08-13 21:52:40 

目录
  • 一、首先自定义筛选框的按钮视图,布局很简单,一个listView就可以搞定。

  • 二、定义筛选数据展示列表视图。

一、首先自定义筛选框的按钮视图,布局很简单,一个listView就可以搞定。

1、在数据model中添加了一个selectedModel属性,用来记录当前已选择的筛选项(目前仅支持单选)。
2、当按钮数量小于3个时,按钮最大宽度为屏幕宽度的1/3;小于屏幕宽度时,则为屏幕宽度/按钮数量。

具体代码如下:


var text = model.selectedFilterModel != null
       ? model.selectedFilterModel.dictValue
       : model.name ?? "";
   return Container(
       padding: EdgeInsets.symmetric(horizontal: 20),
       constraints: BoxConstraints(
           maxWidth: MediaQuery.of(context).size.width /
               (widget.dataList.length > 3 ? 3 : widget.dataList.length),
           maxHeight: widget.viewHeight),
       color: Colors.white,
       child: InkWell(
           child: Row(
             mainAxisAlignment: MainAxisAlignment.center,
             children: [
               Text(
                 text,
                 maxLines: 1,
                 overflow: TextOverflow.ellipsis,
                 style: TextStyle(
                     fontSize: widget.textSize,
                     color: model.isSelected
                         ? widget.textSelectColor
                         : widget.textColor),
               ),
               SizedBox(
                 width: 4,
               ),
               model.isSelected == true
                   ? Icon(Icons.keyboard_arrow_down,
                       color: widget.textSelectColor)
                   : Icon(Icons.keyboard_arrow_up, color: widget.textColor),
             ],
           ),
           onTap: () {
             setState(() {
               if (_selectModel != null && _selectModel != model) {
                 _selectModel.isSelected = false;
               }
               model.isSelected = !model.isSelected;
               _selectModel = model;
             });
           }));

二、定义筛选数据展示列表视图。

首先在剩余视图上定义一个背景黑色透明的遮罩层,然后在这层Container上展示listView,listView展示的数据为筛选的具体数据内容。Visibility控制整体视图是否可见,具体代码如下:


     visible:
         Provider.of<FilterModelProvider>(context).isShowFilterOptionsView ??
             false,
     child: GestureDetector(
       onTap: () {
         Provider.of<FilterModelProvider>(context, listen: false)
             .hideFilterOptionsView();
       },
       child: Container(
         color: Colors.black54,
         child: Container(
           margin: EdgeInsets.only(
               bottom: SizeFit.screenHeight -
                   widget.filterButtonViewHeight -
                   SizeFit.appBarHeight -
                   listViewHeight +
                   animation.value),
           color: Colors.white,
           child: ListView.builder(
               padding: EdgeInsets.zero,
               itemCount: _dataList.length,
               itemBuilder: (BuildContext context, int index) {
                 return InkWell(
                   child: Container(
                     height: widget.listHeight,
                     child: Column(
                       mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                       // crossAxisAlignment: CrossAxisAlignment.center,
                       children: [
                         Text(
                           _dataList[index].dictValue,
                           overflow: TextOverflow.ellipsis,
                           maxLines: 1,
                           style: TextStyle(
                               fontSize: 16,
                               color: Colors.black87,
                               fontWeight: FontWeight.normal),
                         ),
                         Divider(
                           height: 1,
                           indent: 1,
                         )
                       ],
                     ),
                   ),
                   onTap: () {
                     Provider.of<FilterModelProvider>(context, listen: false)
                         .selectFilterOption(_dataList[index]);
                   },
                 );
               }),
         ),
       ),
     ),
   );

来源:https://juejin.cn/post/6983971330064384037

标签:Flutter,筛选框
0
投稿

猜你喜欢

  • c#图像截取实例

    2022-02-21 07:49:58
  • C#中的==运算符

    2022-08-19 21:50:56
  • C#中内联函数的用法介绍

    2023-04-18 18:29:18
  • Android开发 旋转屏幕导致Activity重建解决方法

    2022-03-02 06:00:23
  • Java基于socket实现简易聊天室实例

    2021-10-30 00:24:56
  • Java实现经典游戏打砖块游戏的示例代码

    2021-06-25 13:30:16
  • C# 分支与循环介绍

    2022-10-26 13:50:02
  • 深入浅析hbase的优点

    2021-08-06 19:27:58
  • Java分布式锁的概念与实现方式详解

    2022-07-11 19:33:57
  • springboot2.0整合dubbo的示例代码

    2021-11-30 06:07:11
  • 解读@RabbitListener起作用的原理

    2021-08-04 12:58:59
  • Spring boot集成Kafka消息中间件代码实例

    2022-11-06 21:53:48
  • C#不提升自己程序的权限实现操作注册表

    2023-01-24 18:51:31
  • java fastdfs客户端使用实例代码

    2022-11-19 05:35:59
  • C#简单实现显示中文格式星期几的方法

    2021-09-08 12:27:05
  • Spring-Bean创建对象的步骤方式详解

    2023-04-12 22:00:47
  • springmvc path请求映射到bean 方法的流程

    2021-10-25 04:42:58
  • JAVA基于SnakeYAML实现解析与序列化YAML

    2023-11-26 06:14:44
  • Android 无障碍服务 performAction 调用过程分析

    2023-05-03 12:06:17
  • Android项目中gradle的执行流程

    2022-04-08 19:08:15
  • asp之家 软件编程 m.aspxhome.com