<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
CHeckbox多選版 flutter封裝點選選單工具列元件
本文是單選版
效果如圖所示,點選選項回撥選中的index,可以自定義橫向縱向,傳遞寬高後自動計運算元項寬高,自定義邊框、背景、選中的樣式
第一部分是封裝子項元件, ToolMenuItemWidget元件如下:
import 'dart:core'; import 'package:flutter/material.dart'; /// @author 程式設計小龍 /// @建立時間:2022/3/8 /// 工具選單子項 class ToolMenuItemWidget extends StatelessWidget { /// 顯示的title final String title; /// 當前選中 final int index; /// 點選回撥 final ValueChanged<int> click; final double width; final double height; final bool isActive; final bool isHorizontal; // 是否橫向 final bool isEnd; // 是否為末尾 final Color? activeColor; // 點選後的顏色 final Color? backgroundColor; // 背景色 final Color? borderColor; // 邊框色 final TextStyle? textStyle; // 文字樣式 final TextStyle? activeTextStyle; // 選中的文字樣式 const ToolMenuItemWidget({ Key? key, this.isActive = false, required this.title, required this.index, required this.click, this.activeColor, this.backgroundColor, this.borderColor, this.textStyle, this.activeTextStyle, this.isHorizontal = false, this.width = 100, this.isEnd = false, this.height = 40, }) : super(key: key); @override Widget build(BuildContext context) { var defaultTextStyle = TextStyle( fontSize: 16, color: isActive ? Colors.white : Colors.black87); return Material( child: Ink( // 點選右波紋效果 width: width, height: height, decoration: BoxDecoration( color: isActive ? activeColor ?? Theme.of(context).primaryColor : backgroundColor ?? Colors.white30, border: isHorizontal ? isEnd ? const Border() : Border( right: BorderSide( width: 1, color: borderColor ?? Colors.grey)) : Border( bottom: BorderSide( width: 1, color: borderColor ?? Colors.grey))), child: InkWell( onTap: () { click(index); }, child: Center( child: Text(title, style: isActive ? activeTextStyle ?? defaultTextStyle : textStyle ?? defaultTextStyle), )), ), ); } }
第二部分是封裝工具列部分, ToolMenuItemWidget元件如下:
import 'package:demo/widgets/tool_menu_item_widget.dart'; import 'package:flutter/material.dart'; /// @author 程式設計小龍 /// @建立時間:2022/3/8 /// 工具選單 class ToolMenuWidget extends StatefulWidget { final List<String> titles; final ValueChanged<int> click; // 點選回撥 final double? width; final double? height; final int currentIndex; // 當前選中 final bool isHorizontal; // 橫向 final Color? activeColor; // 點選後的顏色 沒傳取主題色 final Color? backgroundColor; // 背景色 final Color? borderColor; // 邊框色 final TextStyle? textStyle; // 文字樣式 final TextStyle? activeTextStyle; // 選中的文字樣式 const ToolMenuWidget( {Key? key, this.currentIndex = 0, required this.titles, required this.click, this.width, this.height, this.isHorizontal = false, this.activeColor, this.backgroundColor, this.borderColor, this.textStyle, this.activeTextStyle, }) : super(key: key); @override State<ToolMenuWidget> createState() => _ToolMenuWidgetState(); } class _ToolMenuWidgetState extends State<ToolMenuWidget> { int currentIndex = 0; // 當前選中 bool isHorizontal = false; // 是否橫向 @override void initState() { // 初始化當前選中 currentIndex = widget.currentIndex; isHorizontal = widget.isHorizontal; super.initState(); } @override Widget build(BuildContext context) { int index = 0; // 用於遍歷計數 int size = widget.titles.length; double height = widget.height ?? (isHorizontal ? 50 : 200); //設定水平和豎直時的預設值 double width = widget.width ?? (isHorizontal ? 400 : 100); return Container( height: height, width: width, decoration: BoxDecoration( color: widget.backgroundColor ?? Colors.white30, border: Border.all(color: widget.borderColor ?? Colors.grey, width: 1), ), child: Wrap( children: widget.titles.map((title) { return ToolMenuItemWidget( title: title, index: index, isHorizontal: widget.isHorizontal, click: (index) { setState(() { currentIndex = index; }); widget.click(index); }, activeColor: widget.activeColor, backgroundColor: widget.backgroundColor, borderColor: widget.borderColor, textStyle: widget.textStyle, height: widget.isHorizontal ? height - 2 : height / size, // 豎直狀態-2 是去掉邊框所佔畫素 isActive: index == currentIndex, width: widget.isHorizontal ? width / size - 1 : width, isEnd: index++ == size - 1, ); }).toList(), ), ); } }
最簡單案例只需傳入titles即可,選中顏色預設取主題顏色,後續再弄一個chekbox版的,可多選選單
/// 豎向,預設樣式 ToolMenuWidget( titles: const ["選項1", "選項2", "選項3", "選項4"], click: (index) { print(" 豎向選中的是 $index"); }, ), /// 自定義樣式橫向 ToolMenuWidget( titles: const ["選項1", "選項2", "選項3", "選項4","選項5"], isHorizontal: true, activeColor: Colors.green, backgroundColor: Colors.black, textStyle: const TextStyle(color: Colors.white), activeTextStyle: const TextStyle(color: Colors.white,fontSize: 18), borderColor: Colors.orange, click: (index) { print("橫向選中的是 $index"); }, )
以上就是flutter封裝單選點選選單工具列元件的詳細內容,更多關於flutter封裝點選選單工具列元件的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45