Android Flutter实现兴趣标签选择功能

作者:岛上码农 时间:2021-07-05 14:29:17 

前言

我们在首次使用内容类 App 的时候,不少都会让我们选择个人偏好。这种通常是通过标签来实现,比如列举出一系列的技术栈,然后让我们选择。通过这些标签选择可以预先知道用户的偏好信息,从而可以选择感兴趣的内容进行推送,这样会让用户快速看到想看的内容。我们本篇就来看看 Flutter 如何实现兴趣标签的选择,这可以通过 InputChip 来轻松实现。

InputChip

InputChip 类是一个简单的小组件,它的内容区左侧有一个 avatar 子组件,右侧是一个 label 组件。然后支持删除和标记选中,因此非常适合做兴趣标签的选择。下面是未选中和选中的两个状态,选中的时候会在左侧的 avatar 区域打个勾表示选中。这个组件相比我们自己去写一个类似的组件来说会简化很多。而且,多个InputChip 组件可以作为Wrap 组件的子组件,实现多个 InputChip 时自动等间距排布和超出宽度自动换行,这也恰恰是做兴趣标签所需要的。

Android Flutter实现兴趣标签选择功能

我们来看一下 InputChip 构造方法和主要属性。

const InputChip({
 Key? key,
 this.avatar,
 required this.label,
 this.labelStyle,
 this.labelPadding,
 this.selected = false,
 this.isEnabled = true,
 this.onSelected,
 this.deleteIcon,
 this.onDeleted,
 this.deleteIconColor,
 this.deleteButtonTooltipMessage,
 this.onPressed,
 this.pressElevation,
 this.disabledColor,
 this.selectedColor,
 this.tooltip,
 this.side,
 this.shape,
 this.clipBehavior = Clip.none,
 this.focusNode,
 this.autofocus = false,
 this.backgroundColor,
 this.padding,
 this.visualDensity,
 this.materialTapTargetSize,
 this.elevation,
 this.shadowColor,
 this.selectedShadowColor,
 this.showCheckmark,
 this.checkmarkColor,
 this.avatarBorder = const CircleBorder(),
 @Deprecated(
   'Migrate to deleteButtonTooltipMessage. '
   'This feature was deprecated after v2.10.0-0.3.pre.'
 )
 this.useDeleteButtonTooltip = true,
})

属性很多,但是实际用的是下面这几个:

  • avatar:左侧的子组件,通常可以用使用圆形(如CircularAvatar)组件,注意高度是不可改的,随整个 InputChip 的高度决定;

  • label:右侧的标签组件,通常是一个文本组件,支持单行或多行文本,该组件决定了 InputChip 的高度;

  • labelPadding:标签的内边距;

  • selected:选中状态,如果是选中状态则会在左侧有个打勾的标记;

  • isEnabled:是否启用,默认是启用状态,如果禁用则选中事件的回调(onSelected)和点击事件回调(onPressed)都无法使用,但是删除是可以用的。

  • onSelected:选中状态改变时的回调函数。

  • deleteIcon:删除图标,默认是 Icons.cancel 图标。

  • onDeleted:删除事件回调。

  • onPressed:点击事件回调;

  • backgroundColorselectedColor:默认背景色和选中后背景色。

通过这些属性我们就可以构建基础的兴趣标签,比如下面的代码,这里的 item 是标签的数据实体对象,有三个属性,分别是标签名称 name,标签默认背景色color 和选中状态 selected。 当标签选中后我们将 InputChipavatar设置为 null,从而不显示 avatar

InputChip(
   labelPadding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
   backgroundColor: item.color,
   selectedColor: Colors.red[400],
   selected: item.selected,
   onSelected: (isSelected) {
     setState(() {
       item.selected = isSelected;
     });
   },
   avatar: item.selected
       ? null
       : CircleAvatar(
           backgroundColor: Colors.lightBlue,
           child: Text(
             item.name.substring(0, 1),
             style: const TextStyle(color: Colors.white),
           ),
         ),
   label: Text(
     item.name,
   ),
 )

兴趣标签选择实现

兴趣标签通常会有多个,这时候需要逐个等间距排开,超出宽度后换行。这个可以通过 Wrap 组件和 InputChip 组件实现。代码非常简单,就是将一组 InputChip 组件作为 Wrap 组件的 children 参数,然后设置 Wrap 中子组件的间距即可。

Wrap(
 spacing: 10.0,
 children: _techList
     .map(
       (item) => InputChip(
         labelPadding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
         backgroundColor: item.color,
         selectedColor: Colors.red[400],
         selected: item.selected,
         onSelected: (isSelected) {
           setState(() {
             item.selected = isSelected;
           });
         },
         avatar: item.selected
             ? null
             : CircleAvatar(
                 backgroundColor: Colors.lightBlue,
                 child: Text(
                   item.name.substring(0, 1),
                   style: const TextStyle(color: Colors.white),
                 ),
               ),
         label: Text(
           item.name,
         ),
       ),
     )
     .toList(),
),

最终我们实现的效果如下图所示。

Android Flutter实现兴趣标签选择功能

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

标签:Android,Flutter,标签,选择
0
投稿

猜你喜欢

  • 21天学习android开发教程之MediaPlayer

    2021-08-03 22:10:57
  • 深入解析JVM对dll文件和对类的装载过程

    2023-06-14 23:23:33
  • Android一行代码实现圆形头像

    2022-02-23 02:00:25
  • Java 读写锁源码分析

    2021-08-31 01:48:54
  • C#使用Redis的基本操作

    2023-12-03 11:03:51
  • Java运行时数据区域(内存划分)的深入讲解

    2023-03-16 02:36:50
  • Spring Boot 集成Redisson实现分布式锁详细案例

    2023-06-10 05:09:17
  • Java语法关于泛型与类型擦除的分析

    2023-12-22 06:15:22
  • C#使用is、as关键字以及显式强转实现引用类型转换

    2023-01-29 16:15:27
  • 浅谈Android面向切面编程(AOP)

    2022-04-03 15:14:41
  • java递归实现拼装多个api的结果操作方法

    2023-11-24 23:44:35
  • Java中final与继承操作实例分析

    2023-09-14 08:56:02
  • 为何Java8需要引入新的日期与时间库

    2023-12-16 06:02:23
  • Spring Boot使用AOP实现REST接口简易灵活的安全认证的方法

    2023-04-10 04:38:44
  • WPF实现控件拖动的示例代码

    2023-04-01 09:36:15
  • c# 断点续传的实现

    2023-07-01 22:41:02
  • SpringBoot集成Tomcat服务架构配置

    2022-06-30 09:10:11
  • Android Activity之间的数据传递方法总结

    2023-05-26 03:43:21
  • android RecyclerView实现条目Item拖拽排序与滑动删除

    2023-03-20 20:50:36
  • Java实现快速排序算法的完整示例

    2022-10-15 11:57:40
  • asp之家 软件编程 m.aspxhome.com