Android Flutter实现兴趣标签选择功能
作者:岛上码农 发布时间:2021-07-05 14:29:17
前言
我们在首次使用内容类 App 的时候,不少都会让我们选择个人偏好。这种通常是通过标签来实现,比如列举出一系列的技术栈,然后让我们选择。通过这些标签选择可以预先知道用户的偏好信息,从而可以选择感兴趣的内容进行推送,这样会让用户快速看到想看的内容。我们本篇就来看看 Flutter 如何实现兴趣标签的选择,这可以通过 InputChip
来轻松实现。
InputChip
InputChip
类是一个简单的小组件,它的内容区左侧有一个 avatar
子组件,右侧是一个 label
组件。然后支持删除和标记选中,因此非常适合做兴趣标签的选择。下面是未选中和选中的两个状态,选中的时候会在左侧的 avatar
区域打个勾表示选中。这个组件相比我们自己去写一个类似的组件来说会简化很多。而且,多个InputChip
组件可以作为Wrap
组件的子组件,实现多个 InputChip
时自动等间距排布和超出宽度自动换行,这也恰恰是做兴趣标签所需要的。
我们来看一下 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
:点击事件回调;backgroundColor
和selectedColor
:默认背景色和选中后背景色。
通过这些属性我们就可以构建基础的兴趣标签,比如下面的代码,这里的 item 是标签的数据实体对象,有三个属性,分别是标签名称 name
,标签默认背景色color
和选中状态 selected
。 当标签选中后我们将 InputChip
的avatar
设置为 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(),
),
最终我们实现的效果如下图所示。
来源:https://juejin.cn/post/7163059109665701902


猜你喜欢
- private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAd
- 前言面向切面(AOP)Aspect Oriented Programming是一种编程范式,与语言无关,是一种程序设计思想,它也是sprin
- 面对android studio Run 一次项目要等好几分钟的痛点,不得不研究一下android studio 的单元测试。其实我的目的很
- 说明本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回
- 会话是识别用户,跟踪用户访问行为的一个手段,通过cookie(存在客户端)或session(存在服务端)来判断本次请求是那个客户端发送过来;
- 1.例题题目描述迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。给定起点坐标
- java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和
- 1. 简介zookeeper是一个开源的分布式协调服务, 提供分布式数据一致性解决方案,分布式应用程序可以实现数据统一配置管理、统一命名服务
- Settings -> Editor -> General -> Use soft wraps in editor&nbs
- 1、准备工作首先需要有一个用于旋转的图片需要考虑如何开始、结束、加速、减速2、加速减速原理本次的动画采用RotateAnimation,初始
- 场景日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的
- 一、日志1、配置日志级别日志记录器(Logger)的行为是分等级的。如下表所示:分为:OFF、FATAL、ERROR、WARN、INFO、D
- 模糊查询Spring Data Jpa的使用可以减少开发者对sql语句的编写,甚至完全不需要编写sql语句。但是,开发过程中总会遇到各种复杂
- 前言在Java System#exit 无法退出程序的问题一文末尾提到优雅停机的一种实现方案,要借助Shutdown Hook进行实现,本文
- 这其实是去年校招时我遇到的一道阿里巴巴的笔试题(承认有点久远了-。-),嗯,如果我没记错的话,当时是作为Java方向的一道选做大题。当然题意
- 通过自定义view实现仿iOS实现滑动两端的点选择时间的效果效果图自定义的view代码public class Ring_Slide2 ex
- 算数运算操作符重载在kotlin中我定义一个类data class Point(val x: Int, val y: Int)然后实例化两个
- 最近在做项目时,需要进行音频文件的即时播放,并且要求同时播放多条语音,之前C#程序中语音播放一直使用System.Media类库的Sound
- 在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高、延迟时
- 还是有一些小问题....懒得改了,但大体思路还是清晰的,首先定义一个运算符栈,一个数栈。关于优先级,两个括号(,)优先级最低,其次是+、-,