第二百五十四回

文章目录

  • 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.mzph.cn/news/607971.shtml

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

相关文章

JAVA:解析Event事件机制与应用举例

1、简述 Java事件机制是一种基于观察者模式的设计模式&#xff0c;用于处理对象之间的松耦合通信。本篇技术博客将深入探讨Java事件机制的原理&#xff0c;并通过实际应用举例展示如何在项目中灵活利用该机制。 2、基本原理 Java事件机制基于观察者模式&#xff0c;包含以下…

【AI视野·今日NLP 自然语言处理论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 1 Jan 2024 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Principled Gradient-based Markov Chain Monte Carlo for Text Generation Authors Li Du, Afra Amini, Lucas…

npm i sass -D的含义

命令 npm i sass -D 是一个在Node.js项目中使用npm&#xff08;Node Package Manager&#xff09;安装Sass预处理器的命令。这个命令的各个部分含义如下&#xff1a; npm: 这是Node Package Manager的缩写&#xff0c;一个用于Node.js的包管理和分发工具&#xff0c;允许开发者…

手把手教你学会接口自动化系列二-编写一个get接口

之前我们写了登录接口,对于登录的接口是post请求。 详见: 手把手教你学会接口自动化系列一-浅浅地尝试编写登录接口的自动化代码-CSDN博客 我们都知道接口最常用的两种类型是get和post类型,为了让知识完整性,我这节课演示下接口自动化如何请求get类型的接口,因为get类型…

职场必备技能2自动化办公excel操作

目录 一、介绍excel 二、应用场景&#xff1a;----可以完成什么操作 生活中遇见的场景 三、下载 四、excel模块 3.1、xlrd 语法&#xff1a; 案例&#xff1a; 算2020年与2021收入差距是多少 3.2、openpyxl 语法 案例1&#xff1a;计算一年的工资--12个月 案例2&…

探讨JS混淆技术及其加密解密实例

引言 在当前计算机科学领域中&#xff0c;保护软件代码的安全性和隐私性变得愈发重要。为了防止黑客攻击和恶意软件分析&#xff0c;开发人员采用各种技术来混淆和加密其代码&#xff0c;其中包括JS混淆技术。本文将介绍JS混淆技术的原理和应用&#xff0c;并提供一些相关的加密…

十、HTML 样式- CSS

CSS (Cascading Style Sheets) 用于渲染HTML元素标签的样式。 一、实例 1、HTML使用样式 本例演示如何使用添加到 <head> 部分的样式信息对 HTML 进行格式化。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTM…

用sql计算两个日期的间隔天数 ,去除周末

快递行业&#xff0c;经常需要计算2个节点的时效&#xff0c;有的计算自然日&#xff0c;有时候需要计算去掉周末的时效&#xff0c;计算自然日很简单&#xff0c;用函数datediff 就可以了&#xff0c;计算工作日时效&#xff0c;我的实现方法如下&#xff0c;借助了一个日期维…

多线程-生产者消费者模型

一、基本信息 1、场景介绍&#xff1a;厨师和吃货的例子&#xff0c;吃货吃桌子上的面条&#xff0c;吃完让厨师做&#xff0c;厨师做完面条放桌子上&#xff0c;让吃货吃&#xff0c;厨师如果发现桌子上有面条&#xff0c;就不做&#xff0c;吃货发现桌子上没有面条就不吃。 …

校招行测,认知能力测验,④破解数量关系测试题

数量关系&#xff0c;值得是数量计算、对比和分析&#xff0c;每种题型都有一定的规律性&#xff0c;如果善于终结也是容易掌握的&#xff0c;当然&#xff0c;只有见多&#xff0c;才能识广&#xff0c;最好的方式就是&#xff0c;锻炼&#xff0c;刷题&#xff0c;就算是临时…

QT应用篇:QT解析与生成XML文件的四种方式

四种常见的解析 XML 的方式(DOM、SAX、以及基于 Qt 的 XmlStreamReader)各有自己的优缺点,适合不同的应用场景。 DOM 适合小型且结构简单的 XML 文件,需要频繁修改和操作整个文档结构的情况。SAX 适合大型 XML 文件,以及只需读取不需要修改的情况。基于 Qt 的 XmlStreamRe…

12V 全桥驱动芯片GC9008——可替代TMI8118,应用于摄像机、消费类产品上

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为提供高性价比的方案。它能提供 0.1A 的持续输出电流。可以工作在 4.5~15V 的电源电压上。 具有 PWM&#xff08;IN1/IN2&#xff09;输入接口,与行业标准器件兼容.是 SOP8封装&#xff0c;GC9008D是DIP封装芯片特点 ● H 桥电机驱…

使用 CompletableFuture 分批处理任务

一、无返回值任务函数 // 数据分批 List<List<StatisticsDTO>> batches Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<Void>> futures new ArrayList<>(batches.size());// 数据处理 for (int i 0; i < batches…

【linux】更改infiniband卡在Debian系统的网络接口名

在Debian或任何其他基于Linux的系统中&#xff0c;网络接口的名称由udev系统管理。通过创建udev规则&#xff0c;可以修改网络接口名称。以下是更改InfiniBand卡接口名称的一般步骤&#xff1a; 1. 找到网络接口的属性&#xff0c;以编写匹配的udev规则 可以使用udevadm命令查…

4.6 BOUNDARY CHECKS

我们现在扩展了tile矩阵乘法内核&#xff0c;以处理具有任意宽度的矩阵。扩展必须允许内核正确处理宽度不是tile宽度倍数的矩阵。通过更改图4.14中的示例至33 M、N和P矩阵&#xff0c;图4.18创建了矩阵的宽度为3&#xff0c;不是tile宽度&#xff08;2&#xff09;的倍数。图4.…

Spring事务控制

1.事务介绍 1.1什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不进行执…

window mysql5.7 搭建主从同步环境

window 搭建mysql5.7数据库 主从同步 主节点 配置文件my3308.cnf [mysql] # 设置mysql客户端默认字符集 default-character-setutf8mb4[mysqld] server-id8 #server-uuidbc701be9-ac71-11ee-9e35-b06ebf511956 log-binD:\mysql_5.7.19\mysql-5.7.19-winx64\mysql-bin binlog-…

性能分析与调优: Linux 内存观测工具

目录 一、实验 1.环境 2.vmstat 3.PSI 4.swapon 5.sar 6.slabtop 7.numstat 8.ps 9.top 10.pmap 11.perf 12.bpftrace 二、问题 1.接口读写报错 2.slabtop如何安装 3.numactl如何安装 4.numad启动服务与关闭NUMA 5. perf如何安装 6. kernel-lt-doc与kern…

Vue3+Vite打包跨平台(七牛、阿里OSS)上传部署前端项目

1、业务场景 阅读之前&#xff0c;想了解一下各位观众老爷们&#xff0c;你们公司的项目是怎么部署的&#xff1a; 1.本地打包手动上传服务器&#xff1b; 2.本地打包自动上传服务器&#xff1b; 3.代码仓库流水线自动构建&#xff1b; 4.其他…&#xff1b; 我们用的第3种部…

前端中什么是DOM对象

DOM&#xff08;文档对象模型&#xff09;是一种编程接口&#xff0c;用于HTML和XML文档。它提供了一种将文档结构表示为树结构的方式&#xff0c;这使得程序和脚本能够动态地访问和更新文档的内容、结构和样式。 在前端开发中&#xff0c;DOM是非常重要的概念。当浏览器加载网…