第二百五十四回

文章目录

  • 1. 概念介绍
  • 2. 思路与方法
    • 2.1 实现思路
    • 2.2 实现方法
  • 3. 代码与效果
    • 3.1 示例代码
    • 3.2 运行效果
  • 4. 内容总结

我们在上一章回中介绍了"如何给图片添加阴影"相关的内容,本章回中将介绍自定义Radio组件.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

我们在前面章回中介绍过Radio组件相关的知识,本章回中介绍的Radio和官方提供的Radio在功能上相同,只是官方提供的Radio不支持修改外观,所以我们准备重新
定义Radio组件。本章回中将详细介绍自定义Radio组件的思路和方法。

2. 思路与方法

2.1 实现思路

最开始想继承Radio组件,然后在此基础上修改外观,后来发来这个思路行不通,因为Radio组件没有提供child属性,即使继承后也无法修改它的内容。因此我们准备
通过组合其它组件来实现自定义Radio组件。Radio上的文本通过Text组件实现,是否被选择的状态通过checkBox组件实现。把这两个组件通过Row组合成一行就是一
个Radio组件。当然了,如果想添加图片的话可以在Row中添加Image组件。有了外观后还需要实现单选功能,就是说多个Radio放在一起使用时有且只有一个Radio能
被选择。我们通过索引id和组件id来实现这个功能,如果这两个id相等,那么当前Radio处于被选择状态,反之处于末选择状态。索引值是固定的,通常不能修改,因此
我们提供一个修改组件id的方法,在点击Radio时通过该方法来修改组id.

2.2 实现方法

自定义Radio的思路介绍完了,不过有看官说感觉有点抽象,接下来我们将介绍详细的实现方法:

  • 创建一个StatefulWidget组件,该组件表示单个Radio;
  • 在StatefulWidget组件的参数中添加两个必选参数当作索引id和组id;
  • 提供一个修改参数的方法,把该方法放到StatefulWidget组件的参数中,相当于向外开放;
  • 在StatefulWidget组件中添加Text和CheckBox组件,并且通过Row把它们组合在一起;
  • 在Row组件外层添加Listener组件,也可以换成手势组件,主要用来响应点击事件;
  • 当点击事件发生时调用修改参数的方法,并且把当前Radio的索引id通过方法的参数传递到外面;
  • 再StatefulWidget组件外实现修改组id的方法,主要是把组件id修改成当前Radio的索引id;
  • 在StatefulWidget组件中判断组id和索引id是否相同,如果相同,把CheckBox修改为选择状态;
    上面介绍的实现方法中比较难理解的单选功能,该功能的核心在于在单个Radio中响应点击事件,同时把修改组id的方法向外开放,在单个Radio组件修改组id时刷新所
    有Radio组件的状态,这时被选择的组件会因为组id和索引id相等显示被选择状态,其它Radio组件则因为组id和索引id不相等显示末选择状态。

3. 代码与效果

3.1 示例代码


typedef ItemSelected<T> = void Function(T value);
///单个Radio组件
class MutexWidget extends StatefulWidget {MutexWidget({super.key,required this.groupValue, required this.index,required this.itemSelected,});///索引id和组id,以及修改组id的方法都写成组件的属性int groupValue;int index;ItemSelected<int> itemSelected;State<MutexWidget> createState() => _MutexWidgetState();
}class _MutexWidgetState extends State<MutexWidget> {bool isWidgetSelected = false;Widget build(BuildContext context) {///如果这两个id相等,那么当前Radio处于被选择状态,反之处于末选择状if (widget.index == widget.groupValue) {isWidgetSelected = true;} else {isWidgetSelected = false;}///组件的外观在这里,可以自定义return Listener(onPointerDown: (event) {if (widget.index == widget.groupValue) {isWidgetSelected = true;} else {isWidgetSelected = false;}widget.itemSelected(widget.index);},child: Container(decoration: BoxDecoration(color: Colors.black12,borderRadius: BorderRadius.circular(30),),child: Row(mainAxisSize: MainAxisSize.min,mainAxisAlignment: MainAxisAlignment.spaceAround,children: [Text("Item ${widget.index}"),Checkbox(activeColor: Colors.blue,side: const BorderSide(width: 3, color: Colors.grey,),shape: const CircleBorder(),value: isWidgetSelected,onChanged: (value) {},)],),),);}
}///使用多个组件,主要是实现修改组id的方法,同时使用setState方法刷新所有组件的状态
child: ListView(children: [MutexWidget(groupValue: groupId, index:1, itemSelected: (v){setState(() {groupId = v;});}),const SizedBox(height: 16,),MutexWidget(groupValue: groupId, index:2, itemSelected: (v){setState(() {groupId = v;});}),const SizedBox(height: 16,),MutexWidget(groupValue: groupId, index:3, itemSelected: (v){setState(() {groupId = v;});}),const SizedBox(height: 16,),MutexWidget(groupValue: groupId, index:4, itemSelected: (v){setState(() {groupId = v;});}),const SizedBox(height: 16,),MutexWidget(groupValue: groupId, index:5, itemSelected: (v){setState(() {groupId = v;});}),const SizedBox(height: 16,),],
),

上面的示例代码中包含两个部分,一部分是单个Radio组件的代码,另外一部分是使用多个Radio组件的代码,代码完全按照上一小节中的实现方法来编写,并且在关键
位置添加了注释,这样有助于大家理解代码。

3.2 运行效果

编译并且运行上面小节中的代码,可以得到下面的运行效图。图中显了个五个Radio组件,它们形成一组Radio,这组Radio中有且只有一个Radio能被选择,也就是我
们常用的单选功能。此外,单个Radio组件的布局,内容,以及颜色等风格可以依据需要自行修改。

4. 内容总结

最后,我们对本章回中的内容做一个全面的总结:

  • 官方提供的Radio组件无法修改外观,我们可以通过自定义Radio来实现;
  • 自定义Radio组件的外观通过使用Row组件组合Text组件和CheckBox组件实现;
  • 自定义Radio组件的难点在于实现单选功能,它需要在Radio组件内部和外部一起实现;
  • 自定义Radio组件的内容,布局和颜色等风格可以自行设计与实现,实现方法可以参考示例代码中Row部分的代码;
    看官们,与"自定义Radio组件"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/333397.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LiveGBS流媒体平台GB/T28181功能-操作日志如何配置保留天数过滤记录的日志根据操作名称过滤记录日志

LiveGBS功能操作日志菜单如何配置保留天数过滤记录的日志根据操作名称过滤记录日志 1、操作日志2、配置保留天数3、配置不记录操作日志3.1、不记录所有3.2、不记录指定操作名称 4、相关问题4.1、级联操作日志筛选 5、搭建GB28181视频直播平台 1、操作日志 LiveGBS操作日志菜单…

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计 基本配置一、序列1.1、序列使用1.1.1、设置字段为主键&#xff0c;数据类型默认整型1.1.2、自定义序列&#xff0c;数据类型自定义 1.2、序列延申1.2.1、理论1.2.2、测试1.2.3、小结 二、函数2.1、SQL直接创建2.1.1…

Git命令+github仓库克隆

Git github Git常用命令 开始 git init #创建仓库 git status #查看仓库的状态 git status -s #简单的查看仓库的状态 git ls-files #查看暂存区的内容 git reflog #查看操作的历史记录 暂存区 git add git add <file&g…

NSIS 生成安装包如何导入文件夹的问题

在制作自己的小工具的时候&#xff0c;需将自己的程序生成一个安装包 这里是需要的文件目录config &#xff0c;和主文件的文件目录dist 进行脚本编写的时候&#xff0c;需要加上这一句&#xff0c;使打包的软件中包含config文件夹。 Section "MainSection" SEC01Se…

oracle 19c容器数据库数据加载和传输-----SQL*Loader(一)

目录 数据加载 &#xff08;一&#xff09;控制文件加载 1.创建用户执行sqlldr 2.创建文本文件和控制文件 3.查看表数据 4.查看log文件 &#xff08;二&#xff09;快捷方式加载 1.system用户执行 2.查看表数据 3.查看log文件 外部表 数据加载和传输的工具&#xff1…

typora好看的颜色主题包

typora好看的颜色主题包 一、base.user.css二、orangeheart.css三、插入文件 一、base.user.css h1, h2, h3, h4, strong {font-weight: 600; }#write {counter-reset: h2; }h1 {counter-reset: h2; }h2 {counter-reset: h3; }h3 {counter-reset: h4; }h4 {counter-reset: h5; …

【Java 设计模式】设计原则

文章目录 ✨单一职责原则&#xff08;SRP&#xff09;✨开放/封闭原则&#xff08;OCP&#xff09;✨里氏替换原则&#xff08;LSP&#xff09;✨依赖倒置原则&#xff08;DIP&#xff09;✨接口隔离原则&#xff08;ISP&#xff09;✨合成/聚合复用原则&#xff08;CARP&#…

Spring学习 基于注解的AOP控制事务

8.1.拷贝上一章代码 8.2.applicationContext.xml <!-- 开启spring对注解事务的支持 --> <tx:annotation-driven transaction-manager"transactionManager"/> 8.3.service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) publi…

sentinel入门,转载的,不记得在哪复制的了

sentinel 基本概念 开发的原因&#xff0c;需要对吞吐量&#xff08;TPS&#xff09;、QPS、并发数、响应时间&#xff08;RT&#xff09;几个概念做下了解&#xff0c;查自百度百科&#xff0c;记录如下&#xff1a; 响应时间(RT)   响应时间是指系统对请求作出响应的时间。…

049.Python包和模块_虚拟环境超详细讲解

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

Developer Tools for Game Creator 1

插件包含: 持久世界时间管理系统 单击以生成对象或预设 游戏内调试控制台 游戏内事件控制台 控制台管理控制 命令模板脚本 游戏内屏幕截图 低分辨率和高分辨率图像 缩略图生成 移动支持 使用Game Creator Action或拖放来激活和控制组件,无需编码。 通过此资产,您可以获得: …

C++实现简单贪吃蛇游戏

文章目录 1 开发历程2 开发思路3 使用介绍4 源文件代码5 游戏截图6 小结 1 开发历程 游戏使用C语言开发&#xff0c;是博主某个下午心血来潮的结果&#xff0c;后面又花了点时间加了计分&#xff0c;记录历史得分的功能。 2 开发思路 其实贪吃蛇主要难在蛇身的移动上&#x…