網(wǎng)站首頁 編程語言 正文
效果展示
CHeckbox多選版?flutter封裝點(diǎn)擊菜單工具欄組件
本文是單選版
效果如圖所示,點(diǎn)擊選項(xiàng)回調(diào)選中的index,可以自定義橫向縱向,傳遞寬高后自動計算子項(xiàng)寬高,自定義邊框、背景、選中的樣式
實(shí)現(xiàn)代碼
第一部分是封裝子項(xiàng)組件, ToolMenuItemWidget組件如下:
import 'dart:core';
import 'package:flutter/material.dart';
/// @author 編程小龍
/// @創(chuàng)建時間: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)建時間: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; // 用于遍歷計數(shù)
int size = widget.titles.length;
double height = widget.height ?? (isHorizontal ? 50 : 200); //設(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ù)再弄一個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");
},
)
原文鏈接:https://blog.csdn.net/qq_42365534/article/details/123268780
相關(guān)推薦
- 2023-07-10 Bean的生命周期和作用域
- 2022-03-04 element-ui 固定彈窗底部的按鈕
- 2022-04-07 C語言的線性表之順序表你了解嗎_C 語言
- 2023-03-01 Python中的getter與setter及deleter使用示例講解_python
- 2022-08-02 詳解C++中遞增運(yùn)算符重載的實(shí)現(xiàn)_C 語言
- 2022-01-21 如何保證Redis緩存與數(shù)據(jù)庫的一致性?
- 2022-06-13 ASP.NET?Core?MVC路由(Routing)的用法_基礎(chǔ)應(yīng)用
- 2022-08-11 Go語言Grpc?Stream的實(shí)現(xiàn)_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支