flutter 专题 七十一 Flutter 自定义单选控件

在Flutter 应用开发中,经常会遇到各种单选效果,虽然官方提供了Radio组件,但是并不能满足我们实际的开发需求,所以往往还需要自定义控件才能满足平时的开发需求。下面就平时开发中用到的单选进行介绍:

自定义SegmentBar

对于分段组件大家肯定不会陌生,主要是实现多个分段,实现单选功能,效果如下图。

话不多说,直接上代码:

class SegmentBarView extends StatefulWidget {List<String> datas;Function(String) onSelected;int defaultIndex=0;SegmentBarView({@required this.datas, this.onSelected,this.defaultIndex});@override_SegmentBarViewState createState() => _SegmentBarViewState();
}class _SegmentBarViewState extends State<SegmentBarView> {List<String> sdkLists;String selectItem;@overridevoid initState() {super.initState();sdkLists = widget.datas;selectItem=sdkLists[widget.defaultIndex];}@overrideWidget build(BuildContext context) {return SingleChildScrollView(scrollDirection: Axis.horizontal,child: Container(padding: EdgeInsets.only(left: 10, right: 10),child: Row(children: _buildSegments(sdkLists),),),);}_buildSegments(List list) {if(list == null) {return Container();}List<Widget> items = List();list.forEach((item){if(item != null) {items.add(Container(padding: EdgeInsets.only(top: 8,bottom: 8),child: _buildItem(item),));}});return items;}_buildItem(String item) {if(selectItem == item) {return Container(height: 34,child: RaisedButton(shape:  RoundedRectangleBorder(
//            borderRadius: BorderRadius.circular(15)),color: Color(0xFF00A6DE),onPressed: (){},child: Text(item,style: TextStyle(color: Colors.white),),),);}else {return Container(height: 34,child: OutlineButton(borderSide: BorderSide(color: Color(0xFFcccccc),width: 0.5),onPressed: (){updateGroupValue(item);},child: Text(item),),);}}updateGroupValue(String item) {if(item == selectItem) {return;}else {selectItem = item;widget.onSelected(selectItem);setState(() {});}}}

使用的时候,只需要按照构造函数传入对应的参数即可。

自定义Radio

当然,开发中还可以遇到下面这种带圆角的按钮,效果如下。

对于这种效果怎么做呢,最简单的就是硬编码,用两个按钮,然后点击的时候去切换,代码如下:

//只能支持两个按钮单选
class RadioGroupWidget extends StatefulWidget {List<String> datas ;Function(String) onSelected;double radioWidth=80;double radioHeight=28;RadioGroupWidget({@required this.datas,@required this.onSelected,this.radioWidth, this.radioHeight,});@overrideState<StatefulWidget> createState() {return RadioGroupState();}
}class RadioGroupState extends State<RadioGroupWidget> {var chooseStr;int choosed=1;Color choosedBgColor=Colors.blue;Color choosedCornerColor=Colors.blue;Color choosedTxtColor=Colors.white;Color defaultBgColor=Colors.white;Color defaultCornerColor=Colors.grey;Color defaultTxtColor=Colors.grey;@overridevoid initState() {super.initState();chooseStr=widget.datas[0];}@overrideWidget build(BuildContext context) {return Row(children: [GestureDetector(onTap: (){choosed=1;chooseStr=widget.datas[0];setState(() {});widget.onSelected(chooseStr);},child: Container(height: widget.radioHeight,width: widget.radioWidth,decoration: BoxDecoration(color: choosed==1?choosedBgColor:defaultBgColor,borderRadius: BorderRadius.only(topLeft: Radius.circular(15),bottomLeft: Radius.circular(15)),border:  Border.all(width: 1, color: choosed==1?choosedCornerColor:defaultCornerColor),),child: Center(child: Text(widget.datas[0],style: TextStyle(color: choosed==1?choosedTxtColor:defaultTxtColor,fontSize: 12))),)),GestureDetector(onTap: (){choosed=2;chooseStr=widget.datas[1];setState(() {});widget.onSelected(chooseStr);},child: Container(height: widget.radioHeight,width: widget.radioWidth,decoration: BoxDecoration(color: choosed==2?choosedBgColor:defaultBgColor,borderRadius: BorderRadius.only(topRight: Radius.circular(15),bottomRight: Radius.circular(15)),border:  Border.all(width: 1, color: choosed==2?choosedCornerColor:defaultCornerColor),),child: Center(child: Text(widget.datas[1],style: TextStyle(color: choosed==2?choosedTxtColor:defaultTxtColor,fontSize: 12))),))],);}}

实际使用时,传入参数即可。

List<String> lineRadios = ['实时流水', '累计流水'];
RadioGroupWidget(radioWidth:80,radioHeight:28,datas: lineRadios, onSelected: (value){print('_buildChartTitle value: '+value.toString());},)

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

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

相关文章

在Cesium中使用ThreeJs材质(不是场景融合哦)

在Cesium中使用ThreeJs材质(不是场景融合哦&#xff09;_哔哩哔哩_bilibili

浅谈Thread类及常见方法与线程的状态(多线程编程篇2)

目录 前言 1.Thread类及常见方法 Thread类中常见的属性 1. getId() 2. getName() 3. getState() 4. getPriority() 5. isDaemon() 6. isAlive() 7. isInterrupted() 2.Thread类中常见的方法 Thread.interrupt() (中断线程) Thread.start()(启动线程) 1. 覆写 run…

Elasticsearch:人工智能时代的公共部门数据治理

作者&#xff1a;来自 Elastic Darren Meiss 人工智能&#xff08;AI&#xff09;和生成式人工智能&#xff08;GenAI&#xff09;正在迅速改变公共部门&#xff0c;从理论探讨走向实际应用。正确的数据准备、管理和治理将在 GenAI 的成功实施中发挥关键作用。 我们最近举办了…

使用事件监听器来处理并发环境中RabbitMQ的同步响应问题

RabbitListener 是 Spring AMQP 提供的核心注解&#xff0c;用于简化 RabbitMQ 消息监听器的创建。以下是对 RabbitListener(queues "balloonWords.queue") 的详细解析&#xff1a; 一、基础功能 队列监听 通过 queues 属性指定监听的队列名称&#xff08;如 "…

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下&#xff0c;数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型&#xff0c;数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…

自动驾驶04:点云预处理03

点云组帧 感知算法人员在完成点云的运动畸变补偿后&#xff0c;会发现一个问题&#xff1a;激光雷达发送的点云数据包中的点云数量其实非常少&#xff0c;完全无法用来进行后续感知和定位层面的处理工作。 此时&#xff0c;感知算法人员就需要对这些数据包进行点云组帧的处理…

Servlet注解与使用模板方法设计模式优化oa项目

一、Servlet注解&#xff0c;简化配置 分析oa项目中的web.xml文件 现在只是一个单标的CRUD&#xff0c;没有复杂的业务逻辑&#xff0c;很简单的一丢丢功能。web.xml文件中就有如此多的配置信息。如果采用这种方式&#xff0c;对于一个大的项目来说&#xff0c;这样的话web.xml…

污水处理厂人员定位方案-UWB免布线高精度定位

1. 方案概述 本方案采用免布线UWB基站与北斗卫星定位融合技术&#xff0c;结合UWBGNSS双模定位工卡&#xff0c;实现污水处理厂室内外人员高精度定位&#xff08;亚米级&#xff09;。系统通过低功耗4G传输数据&#xff0c;支持实时位置监控、电子围栏、聚集预警、轨迹回放等功…

【C++初阶】第12课—list

文章目录 1. list的构造2. list迭代器的常见接口2.1 list遍历的迭代器接口2.2 list修改数据的迭代器接口2.3 list排序、逆序、合并相关操作的成员函数 3. 模拟实现list3.1 模拟实现list的构造3.2 模拟实现list的尾插3.3 模拟实现迭代器iterator3.4 模拟实现list的插入删除3.5 模…

Java进阶

Java进阶 注解什么是注解&#xff1f;内置注解元注解自定义注解 对象克隆&#xff08;对象复制&#xff09;如何实现克隆&#xff1f;浅克隆深克隆 设计模式统一建模语言&#xff08;UML&#xff09;类接口类之间的关系 面向对象设计原则1. 单一职责2. 开闭原则3. 里氏替换原则…

AB包介绍及导出工具实现+AB包资源简单加载

Resource原理 项目中建立Resources目录&#xff0c;资源导入内部 生成项目包 资源文件存储路径 结论&#xff1a;存储在Resources下的资源&#xff0c;最终会存储在游戏的主体包中&#xff0c;发送给用户&#xff0c;手机系统上&#xff0c;如果需要做资源的更新&#xff0c;是…

全包圆玛奇朵样板间亮相,极简咖啡风引领家装新潮流

在追求品质生活的当下&#xff0c;家居装修风格的选择成为了许多消费者关注的焦点。近日&#xff0c;全包圆家居装饰有限公司精心打造的玛奇朵样板间正式对外开放&#xff0c;以其独特的咖啡色系极简风格&#xff0c;为家装市场带来了一股清新的潮流。玛奇朵样板间不仅展示了全…

算法基础——模拟

目录 1 多项式输出 2.蛇形方阵 3.字符串的展开 模拟&#xff0c;顾名思义&#xff0c;就是题⽬让你做什么你就做什么&#xff0c;考察的是将思路转化成代码的代码能⼒。这类题⼀般较为简单&#xff0c;属于竞赛⾥⾯的签到题&#xff08;但是&#xff0c;万事⽆绝对&#xff…

Java---类与对象

类与对象 前言&#xff1a;一、面向对象二、类的定义1.类的定义格式2.访问修饰限定符 三、类的实例化四、this引用1.this引用2.this引用的原因 五、对象的构造和初始化1.初始化对象2.构造方法(1).构造方法的概念&#xff1a;(2).特性&#xff1a;(3).this调用:3.就地初始化4.默…

【巧文书高效编标工具】技术解决方案

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 巧文书高效编标工具**是一款基于自然语言处理&#xff08;NLP&#xff09;与自动化技术的智能编标解决方案&#xff0c;旨在提升标书编制效率、降低人工错误率。通过结合规则引擎、模板化生成和AI辅助校对&#xff0c…

1.基于TCP的简单套接字服务器实现

目录 1. TCP通信流程 2. 服务器端的通信流程 2.1 创建用于监听的套接字 2.2 绑定本地IP地址和端口 2.3 设置监听 2.4 等待接受客户端的连接请求 2.5 与客户端进行通信 2.6 客户端连接服务器 3.代码实现 client.cpp server.cpp 运行方式 在本文中&#xff0c;我们将…

【大模型基础_毛玉仁】5.3 附加参数法:T-Patcher

目录 5.3 附加参数法&#xff1a;T-Patcher5.3.1 补丁的位置1&#xff09;键值存储体2&#xff09;补丁设计 5.3.2 补丁的形式5.3.3 补丁的实现1&#xff09;准确性2&#xff09;局部性 5.3 附加参数法&#xff1a;T-Patcher 附加参数法&#xff1a;通过引入可训练的额外参数实…

【原理系列】计算机组成原理-第一遍阅读总结

目录 创作灵感&#xff1a; 总览&#xff1a; 1、计算机抽象与技术 2、ISA指令集架构 3、CPU处理器 4、存储器 创作灵感&#xff1a; 夯实计算机原理&#xff0c;构建知识框架 此系列将总结和记录我对 【深入浅出计算机组成原理-台湾科技大学/元智大学的刘一宇教授】 的…

React程序打包与部署

===================== 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为生产环境准备React应用最小化和打包环境变量错误处理部署到托管服务部署到Netlify探索高级主题:Hooks、Su…

C++运算符重载、类的转换构造函数和类型转换函数的基础练习

练习1&#xff1a;&#xff08;困难&#xff09; 建立一个矩阵类&#xff0c;可以完成指定的操作或运算。 说明&#xff1a; &#xff08;1&#xff09;、矩阵为2行3列&#xff0c;基类型为整型&#xff1b; &#xff08;2&#xff09;、操作或运算&#xff1a;初始化&…