当前位置: 首页 > news >正文

Flutter 自定义 Switch 切换组件完全指南

Flutter 自定义组件:Switch 切换实现

在 Flutter 中,你可以通过多种方式创建自定义的 Switch 切换组件。下面我将介绍几种实现方法,包括基础实现、自定义样式和完全自定义的 Switch 组件。

  1. 使用 Flutter 自带的 Switch 组件

最简单的方法是使用 Flutter 提供的 Switch 组件:

bool _switchValue = false;Switch(value: _switchValue,onChanged: (bool value) {setState(() {_switchValue = value;});},activeColor: Colors.blue, // 开启时的颜色activeTrackColor: Colors.blue[200], // 开启时轨道颜色inactiveThumbColor: Colors.grey, // 关闭时滑块颜色inactiveTrackColor: Colors.grey[300], // 关闭时轨道颜色
)
  1. 使用 CupertinoSwitch (iOS 风格)

如果你想要 iOS 风格的 Switch,可以使用 CupertinoSwitch:

bool _cupertinoSwitchValue = false;CupertinoSwitch(value: _cupertinoSwitchValue,onChanged: (bool value) {setState(() {_cupertinoSwitchValue = value;});},activeColor: Colors.blue,
)
  1. 完全自定义 Switch 组件

如果你想完全控制 Switch 的外观和行为,可以创建一个自定义组件:

自定义 Switch 实现

class CustomSwitch extends StatefulWidget {final bool value;final ValueChanged<bool> onChanged;final Color activeColor;final Color inactiveColor;final double width;final double height;const CustomSwitch({Key? key,required this.value,required this.onChanged,this.activeColor = Colors.blue,this.inactiveColor = Colors.grey,this.width = 50.0,this.height = 30.0,}) : super(key: key);_CustomSwitchState createState() => _CustomSwitchState();
}class _CustomSwitchState extends State<CustomSwitch> {Widget build(BuildContext context) {return GestureDetector(onTap: () {widget.onChanged(!widget.value);},child: AnimatedContainer(duration: const Duration(milliseconds: 200),width: widget.width,height: widget.height,decoration: BoxDecoration(borderRadius: BorderRadius.circular(widget.height),color: widget.value ? widget.activeColor : widget.inactiveColor,),child: Stack(children: [AnimatedPositioned(duration: const Duration(milliseconds: 200),left: widget.value ? widget.width - widget.height : 0,child: Container(width: widget.height,height: widget.height,decoration: BoxDecoration(shape: BoxShape.circle,color: Colors.white,boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.2),blurRadius: 4,offset: const Offset(0, 2),),],),),),],),),);}
}

使用自定义 Switch

bool _customSwitchValue = false;CustomSwitch(value: _customSwitchValue,onChanged: (value) {setState(() {_customSwitchValue = value;});},activeColor: Colors.green,inactiveColor: Colors.red[200],width: 60,height: 35,
)
  1. 带图标和文本的自定义 Switch
class IconSwitch extends StatelessWidget {final bool value;final ValueChanged<bool> onChanged;final IconData activeIcon;final IconData inactiveIcon;final String activeText;final String inactiveText;final Color activeColor;final Color inactiveColor;const IconSwitch({Key? key,required this.value,required this.onChanged,this.activeIcon = Icons.check,this.inactiveIcon = Icons.close,this.activeText = 'ON',this.inactiveText = 'OFF',this.activeColor = Colors.green,this.inactiveColor = Colors.red,}) : super(key: key);Widget build(BuildContext context) {return GestureDetector(onTap: () => onChanged(!value),child: Container(padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),decoration: BoxDecoration(color: value ? activeColor : inactiveColor,borderRadius: BorderRadius.circular(20),),child: Row(mainAxisSize: MainAxisSize.min,children: [Icon(value ? activeIcon : inactiveIcon,color: Colors.white,size: 16,),const SizedBox(width: 4),Text(value ? activeText : inactiveText,style: const TextStyle(color: Colors.white,fontSize: 12,fontWeight: FontWeight.bold,),),],),),);}
}
  1. 动画增强版自定义 Switch
class AnimatedToggleSwitch extends StatefulWidget {final bool value;final ValueChanged<bool> onChanged;final Duration animationDuration;final Color activeColor;final Color inactiveColor;const AnimatedToggleSwitch({Key? key,required this.value,required this.onChanged,this.animationDuration = const Duration(milliseconds: 300),this.activeColor = Colors.blue,this.inactiveColor = Colors.grey,}) : super(key: key);_AnimatedToggleSwitchState createState() => _AnimatedToggleSwitchState();
}class _AnimatedToggleSwitchState extends State<AnimatedToggleSwitch>with SingleTickerProviderStateMixin {late AnimationController _controller;late Animation<double> _animation;void initState() {super.initState();_controller = AnimationController(vsync: this,duration: widget.animationDuration,);_animation = Tween<double>(begin: 0, end: 1).animate(_controller);if (widget.value) {_controller.value = 1.0;}}void didUpdateWidget(AnimatedToggleSwitch oldWidget) {super.didUpdateWidget(oldWidget);if (widget.value != oldWidget.value) {if (widget.value) {_controller.forward();} else {_controller.reverse();}}}void dispose() {_controller.dispose();super.dispose();}Widget build(BuildContext context) {return GestureDetector(onTap: () {widget.onChanged(!widget.value);},child: Container(width: 60,height: 30,decoration: BoxDecoration(borderRadius: BorderRadius.circular(15),color: Color.lerp(widget.inactiveColor,widget.activeColor,_animation.value,),),child: AnimatedBuilder(animation: _animation,builder: (context, child) {return Stack(children: [Positioned(left: _animation.value * 30,child: Container(width: 30,height: 30,decoration: BoxDecoration(shape: BoxShape.circle,color: Colors.white,boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.2),blurRadius: 4,offset: const Offset(0, 2),),],),),),],);},),),);}
}

使用示例

class SwitchExamplePage extends StatefulWidget {const SwitchExamplePage({Key? key}) : super(key: key);_SwitchExamplePageState createState() => _SwitchExamplePageState();
}class _SwitchExamplePageState extends State<SwitchExamplePage> {bool _basicSwitch = false;bool _cupertinoSwitch = false;bool _customSwitch = false;bool _iconSwitch = false;bool _animatedSwitch = false;Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Switch Examples')),body: Padding(padding: const EdgeInsets.all(16.0),child: Column(children: [ListTile(title: const Text('Basic Switch'),trailing: Switch(value: _basicSwitch,onChanged: (value) {setState(() {_basicSwitch = value;});},),),ListTile(title: const Text('Cupertino Switch'),trailing: CupertinoSwitch(value: _cupertinoSwitch,onChanged: (value) {setState(() {_cupertinoSwitch = value;});},),),ListTile(title: const Text('Custom Switch'),trailing: CustomSwitch(value: _customSwitch,onChanged: (value) {setState(() {_customSwitch = value;});},),),ListTile(title: const Text('Icon Switch'),trailing: IconSwitch(value: _iconSwitch,onChanged: (value) {setState(() {_iconSwitch = value;});},),),ListTile(title: const Text('Animated Switch'),trailing: AnimatedToggleSwitch(value: _animatedSwitch,onChanged: (value) {setState(() {_animatedSwitch = value;});},),),],),),);}
}

这些示例展示了从简单到复杂的各种 Switch 实现方式。你可以根据自己的需求选择合适的方法,或者在这些基础上进一步自定义。

http://www.lryc.cn/news/625047.html

相关文章:

  • Python 面向对象三大特性详解(与 C++ 对比)
  • Android Handler 线程执行机制
  • flutter项目适配鸿蒙
  • 【展厅多媒体】互动地砖屏怎么提升展厅互动感的?
  • 2025年最新美区Apple ID共享账号免费分享(持续更新)
  • 数组学习2
  • Java面试题储备14: 使用aop实现全局日志打印
  • 【HTML】document api
  • Vue 3中watch的返回值:解锁监听的隐藏技巧
  • C++---有符号和无符号整数的位移操作
  • RabbitMQ:数据隔离
  • kafka 冲突解决 kafka安装
  • Unity进阶--C#补充知识点--【Unity跨平台的原理】Mono与IL2CPP
  • 探索性测试:灵活找Bug的“人肉探测仪”
  • MongoDB Windows 系统实战手册:从配置到数据处理入门
  • keil错误:Error: failed to execute ‘D:\Keil\C51\BIN\BIN\A51.EXE‘
  • 【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
  • PYTHON让繁琐的工作自动化-猜数字游戏
  • 从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
  • 车e估牵头正式启动乘用车金融价值评估师编制
  • CoRL 2025|隐空间扩散世界模型LaDi-WM大幅提升机器人操作策略的成功率和跨场景泛化能力
  • 从「行走」到「思考」:机器人进化之路与感知—决策链路的工程化实践
  • 第4.3节:awk正则表达式详解-特殊字符
  • Pytest测试框架基础及进阶
  • 前端css学习笔记7:各种居中布局空白问题
  • Jenkins全链路教程——Jenkins调用Maven构建项目
  • IoT/透过oc_lwm2m和at源码,分析NB-IoT通信模组和主板MCU之间的通信过程
  • 【Jenkins】03 - 自动构建和docker构建
  • 【opencv-Python学习笔记(7):图像平滑处理】
  • 删除并获得点数