flutter封裝單選點(diǎn)擊菜單工具欄組件
效果展示
CHeckbox多選版 flutter封裝點(diǎn)擊菜單工具欄組件
本文是單選版
效果如圖所示,點(diǎn)擊選項(xiàng)回調(diào)選中的index,可以自定義橫向縱向,傳遞寬高后自動(dòng)計(jì)算子項(xiàng)寬高,自定義邊框、背景、選中的樣式
實(shí)現(xiàn)代碼
第一部分是封裝子項(xiàng)組件, ToolMenuItemWidget組件如下:
import 'dart:core'; import 'package:flutter/material.dart'; /// @author 編程小龍 /// @創(chuàng)建時(shí)間:2022/3/8 /// 工具菜單子項(xiàng) class ToolMenuItemWidget extends StatelessWidget { /// 顯示的title final String title; /// 當(dāng)前選中 final int index; /// 點(diǎn)擊回調(diào) final ValueChanged<int> click; final double width; final double height; final bool isActive; final bool isHorizontal; // 是否橫向 final bool isEnd; // 是否為末尾 final Color? activeColor; // 點(diǎn)擊后的顏色 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( // 點(diǎn)擊右波紋效果 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 編程小龍 /// @創(chuàng)建時(shí)間:2022/3/8 /// 工具菜單 class ToolMenuWidget extends StatefulWidget { final List<String> titles; final ValueChanged<int> click; // 點(diǎn)擊回調(diào) final double? width; final double? height; final int currentIndex; // 當(dāng)前選中 final bool isHorizontal; // 橫向 final Color? activeColor; // 點(diǎn)擊后的顏色 沒傳取主題色 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; // 當(dāng)前選中 bool isHorizontal = false; // 是否橫向 @override void initState() { // 初始化當(dāng)前選中 currentIndex = widget.currentIndex; isHorizontal = widget.isHorizontal; super.initState(); } @override Widget build(BuildContext context) { int index = 0; // 用于遍歷計(jì)數(shù) int size = widget.titles.length; double height = widget.height ?? (isHorizontal ? 50 : 200); //設(shè)置水平和豎直時(shí)的默認(rèn)值 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, // 豎直狀態(tài)-2 是去掉邊框所占像素 isActive: index == currentIndex, width: widget.isHorizontal ? width / size - 1 : width, isEnd: index++ == size - 1, ); }).toList(), ), ); } }
代碼調(diào)用
最簡單案例只需傳入titles即可,選中顏色默認(rèn)取主題顏色,后續(xù)再弄一個(gè)chekbox版的,可多選菜單
/// 豎向,默認(rèn)樣式 ToolMenuWidget( titles: const ["選項(xiàng)1", "選項(xiàng)2", "選項(xiàng)3", "選項(xiàng)4"], click: (index) { print(" 豎向選中的是 $index"); }, ), /// 自定義樣式橫向 ToolMenuWidget( titles: const ["選項(xiàng)1", "選項(xiàng)2", "選項(xiàng)3", "選項(xiàng)4","選項(xiàng)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封裝單選點(diǎn)擊菜單工具欄組件的詳細(xì)內(nèi)容,更多關(guān)于flutter封裝點(diǎn)擊菜單工具欄組件的資料請關(guān)注腳本之家其它相關(guān)文章!
- Flutter在項(xiàng)目中使用動(dòng)畫不使用包實(shí)現(xiàn)詳解
- Flutter繪制3.4邊形及多邊形漸變動(dòng)畫實(shí)現(xiàn)示例
- Flutter添加頁面過渡動(dòng)畫實(shí)現(xiàn)步驟
- 封裝flutter狀態(tài)管理工具示例詳解
- Flutter學(xué)習(xí)LogUtil封裝與實(shí)現(xiàn)實(shí)例詳解
- flutter封裝點(diǎn)擊菜單工具欄組件checkBox多選版
- 基于fluttertoast實(shí)現(xiàn)封裝彈框提示工具類
- Flutter封裝組動(dòng)畫混合動(dòng)畫AnimatedGroup示例詳解
相關(guān)文章
Android中使用DialogFragment編寫對話框的實(shí)例教程
這篇文章主要介紹了Android中使用DialogFragment編寫對話框的實(shí)例教程,DialogFragment也是一種Fragment,因而管理生命周期時(shí)比較給力,需要的朋友可以參考下2016-04-04Android使用ContentResolver搜索手機(jī)通訊錄的方法
這篇文章主要介紹了Android使用ContentResolver搜索手機(jī)通訊錄的方法,結(jié)合實(shí)例形式分析了Android中ContentResolver操作手機(jī)通訊錄的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01Android開發(fā)人臉識別統(tǒng)計(jì)人臉數(shù)
這篇文章主要介紹了Android開發(fā)人臉識別統(tǒng)計(jì)人臉數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Android基于TextView屬性android:ellipsize實(shí)現(xiàn)跑馬燈效果的方法
這篇文章主要介紹了Android基于TextView屬性android:ellipsize實(shí)現(xiàn)跑馬燈效果的方法,涉及Android跑馬燈效果所涉及的TextView相關(guān)屬性與使用方法,需要的朋友可以參考下2016-08-08Android 軟鍵盤自動(dòng)彈出與關(guān)閉實(shí)例詳解
這篇文章主要介紹了Android 軟鍵盤自動(dòng)彈出與關(guān)閉實(shí)例詳解的相關(guān)資料,為了用戶體驗(yàn)應(yīng)該自動(dòng)彈出軟鍵盤而不是讓用戶主動(dòng)點(diǎn)擊輸入框才彈出,這里舉例說明該如何實(shí)現(xiàn),需要的朋友可以參考下2016-12-12Android使用http實(shí)現(xiàn)注冊登錄功能
這篇文章主要為大家詳細(xì)介紹了Android使用http實(shí)現(xiàn)注冊登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04