flutter封装点击菜单工具栏组件checkBox多选版

作者:编程小龙 时间:2022-08-16 08:18:59 

效果展示

单选版可看上篇博文 用flutter封装一个点击菜单工具栏组件

本文是CHeckbox多选版

效果如图所示,点击选项回调选中的index和是否选中的值,可以自定义横向纵向,传递宽高后自动计算子项宽高,自定义边框、背景、选中的样式

flutter封装点击菜单工具栏组件checkBox多选版

实现代码

第一部分是封装子项组件, ToolMenuCheckboxItemWidget组件如下:

import 'dart:core';
import 'package:flutter/material.dart';
/// @author 编程小龙
/// @创建时间:2022/3/8
/// 工具菜单checkbox版子项
class ToolMenuCheckboxItemWidget extends StatelessWidget {
 /// 显示的title
 final String title;
 /// 序号
 final int index;
 /// 点击回调
 final void Function(int, bool) 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 ToolMenuCheckboxItemWidget(
     {Key? key,
     this.isActive = false,
     required this.title,
     required this.index,
     required this.click,
     this.isHorizontal = false,
     this.width = 100,
     this.isEnd = false,
     this.height = 40,
     this.activeColor,
     this.backgroundColor,
     this.borderColor,
     this.textStyle,
     this.activeTextStyle})
     : super(key: key);
 @override
 Widget build(BuildContext context) {
   TextStyle 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,!isActive);
           },
           child: Center(
             child: Text(title,
                 style: isActive
                     ? activeTextStyle ?? defaultTextStyle
                     : textStyle ?? defaultTextStyle),
           )),
     ),
   );
 }
}

第二部分是封装菜单内容,ToolMenuCheckBoxWidget代码如下

import 'package:demo/widgets/tool_menu_checkbox_item_widget.dart';
import 'package:flutter/material.dart';
/// @author 编程小龙
/// @创建时间:2022/3/8
/// 工具菜单checkbox版
class ToolMenuCheckBoxWidget extends StatefulWidget {
 final Map<String, bool> items; // title:checked 的形式 返回值为 key:true/false
 final void Function(int, bool) click; // 点击回调 返回第n个的选中情况
 final double? width;
 final double? height;
 final bool isHorizontal; // 横向
 final Color? activeColor; // 点击后的颜色 没传取主题色
 final Color? backgroundColor; // 背景色
 final Color? borderColor; // 边框色
 final TextStyle? textStyle; // 文字样式
 final TextStyle? activeTextStyle; //  选中的文字样式
 const ToolMenuCheckBoxWidget(
     {Key? key,
     required this.items,
     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<ToolMenuCheckBoxWidget> createState() => _ToolMenuCheckBoxWidgetState();
}
class _ToolMenuCheckBoxWidgetState extends State<ToolMenuCheckBoxWidget> {
 late Map<String, bool> items;
 bool isHorizontal = false; // 是否横向
 @override
 void initState() {
   // 初始化当前选中
   items = widget.items;
   isHorizontal = widget.isHorizontal;
   super.initState();
 }
 @override
 Widget build(BuildContext context) {
   int index = 0; // 遍历自增 index
   int size = widget.items.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: items.keys.map((key) {
         return ToolMenuCheckboxItemWidget(
           title: key,
           index: index,
           isHorizontal: widget.isHorizontal,
           click: (index, isChecked) {
             setState(() {
               items[key] = isChecked;
             });
             widget.click(index, isChecked);
           },
           height:
               widget.isHorizontal ? height - 2 : height / size,
           isActive: items[key] ?? false,
           width: widget.isHorizontal ? width / size - 1 : width,
           isEnd: index++ == size - 1,
           textStyle: widget.textStyle,
           activeTextStyle: widget.activeTextStyle,
           backgroundColor: widget.backgroundColor,
           activeColor: widget.activeColor,
           borderColor: widget.borderColor,
         );
       }).toList(),
     ),
   );
 }
}

代码调用

最简单案例只需传入titles即可,选中颜色默认取主题颜色,后续再弄一个chekbox版的,可多选菜单

/// 竖向
ToolMenuCheckBoxWidget(
   items: { // 注意这里map不要用const声明,因为里面的值传递过去会同步更改,并不会重新copy一份值操作
     "选项1": true,
     "选项2": true,
     "选项3": false,
     "选项4": false
   },
   click: (index, isActive) {
     print("竖向 选项$index 的值为$isActive");
   }),
/// 自定义样式横向
ToolMenuCheckBoxWidget(
items: { // 注意这里map不要用const声明,因为里面的值传递过去会同步更改,并不会重新copy一份值操作
   "选项1": true,
   "选项2": false,
   "选项3": false,
   "选项4": true,
   "选项5": false,
   "选项6": false,
 },
 click: (index, isActive) {
   print("横向 选项$index 的值为$isActive");
 },
 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,
),

来源:https://blog.csdn.net/qq_42365534/article/details/123352892

标签:flutter,封装组件,菜单组件,多选菜单
0
投稿

猜你喜欢

  • PageHelper在springboot+mybatis框架中的使用步骤及原理解析

    2023-07-28 21:40:09
  • Java异常处理操作 Throwable、Exception、Error

    2022-02-19 20:56:13
  • C#调用Java类的实现方法

    2022-10-30 11:00:10
  • Java实战之医院管理系统的实现

    2022-04-13 17:39:27
  • java反射之通过反射了解集合泛型的本质(详解)

    2023-02-04 03:10:25
  • Java使用过滤器防止SQL注入XSS脚本注入的实现

    2021-09-14 18:17:19
  • java实现多人聊天室可视化

    2021-08-27 01:16:49
  • RecyclerView的使用之HelloWorld

    2023-10-24 08:14:13
  • Java方法重载Overload原理及使用解析

    2021-11-21 14:23:14
  • 详解Kotlin Android开发中的环境配置

    2022-06-25 10:42:17
  • prometheus监控springboot应用简单使用介绍详解

    2023-02-24 03:49:00
  • 在Spring中自动装配Bean的属性

    2022-01-29 07:01:28
  • IDEA如何自动生成serialVersionUID的设置

    2023-08-09 04:00:33
  • Java实现人机猜拳小游戏

    2023-10-07 16:11:37
  • Java实现带图形界面的聊天程序

    2022-04-25 22:41:55
  • Java面向对象基础,类,变量,方法

    2023-04-08 13:21:49
  • Spring Boot集成Mybatis中如何显示日志的实现

    2023-04-09 10:49:48
  • 使用Jenkins来构建SVN+Maven项目的实现

    2023-07-30 12:45:22
  • MybatisPlus整合Flowable出现的坑及解决

    2022-03-28 22:56:35
  • SpringBoot @Cacheable自定义KeyGenerator方式

    2022-12-25 13:23:11
  • asp之家 软件编程 m.aspxhome.com