第二百五十四回

文章目录

  • 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组件"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

7个Pandas绘图函数助力数据可视化

大家好&#xff0c;在使用Pandas分析数据时&#xff0c;会使用Pandas函数来过滤和转换列&#xff0c;连接多个数据帧中的数据等操作。但是&#xff0c;生成图表将数据在数据帧中可视化&#xff0c;通常比仅仅查看数字更有帮助。 Pandas具有几个绘图函数&#xff0c;可以使用它…

Java面向对象综合练习(拼图小游戏),用java图形化界面实现拼图小游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面&#xff0c;写一个项目&#xff0c;知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello&#xff0c;各位同学大家好。今天&#xff0c;我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…

【机器学习】循环神经网络(三)

四、序列预测问题 循环神经网络实现的序列到序列的映射&#xff08;Recurrent Neural Network based Sequence-to-Sequence Mapping&#xff09;是一种使用循环神经网络来将一个序列数据映射到另一个序列数据的方法&#xff0c;它可以用于机器翻译、文本摘要、对话生成等任务。…

多国管理中心多语言区块链源码一元夺宝程序仿趣步奕跑/原生计步器/原生人脸识别

前后台分开的&#xff0c;后台是TP3.2的框架了&#xff0c;应该是比较老的程序了。 目前把整体UI 改版黄色系风格&#xff0c;集成了一元夺宝程序&#xff0c;用户数据同步趣步&#xff0c;效果看起来很棒&#xff0c;另外加入股票走势图&#xff08;K线图&#xff09;&#xf…

使用即时设计绘制原型设计方便吗?和Axure RP相比怎么样?

对于原型设计&#xff0c;APP 和 Web 都是一样的&#xff0c;因为产品原型是用来确定需求的工具。我们使用这种工具的目的是为了快速迭代&#xff0c;从而深入挖掘和筛选产品的需求。 绘制原型&#xff0c;最重要的原则是&#xff1a;快速、清晰&#xff01; Axure 工具的优缺…

“单项突出”的赢双科技IPO加速,比亚迪是最强助力?

近日&#xff0c;新能源汽车核心部件供应商赢双科技首次递表科创板&#xff0c;其凭借旋转变压器产品就坐稳了新能源车企主要供应商的地位&#xff0c;从核心业务及业绩情况来看&#xff0c;赢双科技不愧为“单项冠军”。 据悉&#xff0c;赢双科技本次IPO拟募资8.47亿元&…

css中有哪些方式可以隐藏页面元素?区别?

面试官&#xff1a;css中&#xff0c;有哪些方式可以隐藏页面元素&#xff1f;区别? 一、前言 在平常的样式排版中&#xff0c;我们经常遇到将某个模块隐藏的场景 通过css隐藏元素的方法有很多种&#xff0c;它们看起来实现的效果是一致的 但实际上每一种方法都有一丝轻微的…

短视频矩阵系统+无人直播源码+视频批量分发----开发实践

核心技术 1. AI自动直播&#xff1a; 智能系统通过丰富可定制的文案库&#xff0c; 拥有有料有趣的灵魂。不仅能自动语音讲解内容&#xff0c;还可以在直播中和用户灵活互动。直播中可将团购商品同话术自动上下架。 2. AI剪辑 可一键智能批量成片&#xff0c;也可跟着模板剪…

XDOJ78.机器人

标题 机器人 类别 综合 时间限制 1S 内存限制 256Kb 问题描述 机器人按照给定的指令在网格中移动&#xff0c;指令有以下四种&#xff1a; N 向北&#xff08;上&#xff09;移动 S 向南&#xff08;下&#xff09;移动 E 向东&#xff08;右&#xff09;移动 W 向西&…

国标GB28181视频监控EasyCVR平台:视频集中录制存储/云端录像功能及操作介绍

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时还具备权限管理、设…

linux centos 账户管理命令

在CentOS或其他基于Linux的系统上&#xff0c;账户管理涉及到用户的创建、修改、删除以及密码的管理等任务。 linux Centos账户管理命令 1 创建用户&#xff1a; useradd username 这将创建一个新用户&#xff0c;但默认不会创建家目录。如果想要创建家目录&#xff0c;可以…

19、Kubernetes核心技术 - 资源限制

目录 一、概述 二、Kubernetes 中的资源单位 2.1、CPU资源单位 2.2、内存资源单位 三、Pod资源限制 四、namespace资源限制 4.1、为命名空间配置内存和 CPU 配额 4.2、为命名空间配置默认的内存请求和限制 4.3、为命名空间配置默认的CPU请求和限制 五、超过容器限制的…

FreeRTOS概述

什么是FreeRTOSFreeRTOS官网地址 FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS)&#xff0c;与世界领先的芯片公司合作开发&#xff0c;现在每 170 秒下载一次。MIT 通过 FreeRTOS 开源许可免费分发&#xff0c;包括一个内核和一组不断丰富的 IoT 库&…

muduo网络库剖析——日志Log类

muduo网络库剖析——日志Log类 前情从muduo到my_muduo 概要日志日志级别 框架与细节成员函数 源码 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中的精华…

【Leetcode】240. 搜索二维矩阵 II

一、题目 1、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1: 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21…

新火种AI|小冰摊牌了!大模型已获国内备案,克隆人发布箭在弦上...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年国内AI圈的第一个重磅消息已然来袭。 1月4日&#xff0c;小冰公司宣布&#xff0c;已于去年12月成功获得“小冰大模型”的国内备案。结合此前公司在日本研发的Rinna大模型&#xff0c;小冰方面称&#xff0c;公司已实现不同…

视频会员付费系统源码 影视视频模版源码 模板PC+WAP苹果CMS影视模板源码

快猫视频会员付费视频系统/x站视频模板/苹果CMS影视模板/可打包成双端APP 适用程序&#xff1a;苹果cmsv10 兼容性和面向场景&#xff1a; 1、Windows 平台&#xff1a; IIS/Apache PHP&#xff08;5.6&#xff09; MySQL&#xff08;5.5&#xff09; 2、Linux/Unix 平台…

深度学习|4.7 参数和超参数

4.7 参数和超参数 超参数是指需要用户提前设置好的参数&#xff0c;这些超参数最终会影响到参数的数值&#xff08;相当于参数是动态调整得到的&#xff09; 学习率的选取 最优学习率应该能使得代价函数趋于一个较低的常数。

SpringBoot Import提示Cannot resolve symbol

背景 项目开发过程中经常在IDEA中出现Cannot resolve symbol&#xff0c;但是依赖确定已经通过maven或者gradle依赖了 常见原因 IDEA 存在缓存 File -> Invalidate Caches/Restart jar包的scope不正常&#xff0c;如果只是runtime则无法import&#xff0c;需要调整为com…

ssm使用web工程的相关知识

不使用框架创建web的两种方式&#xff08;这里是idea2022.3.2版&#xff09; 第一种&#xff1a;项目右键点击&#xff1a;add Framwork support选择框架进行创建。 操作步骤&#xff1a; 使用这种方式创建可能会存在的问题&#xff1a; 如果你创建web框架前&#xff1a;在…