资讯详情

Flutter

如截图所示 多选功能

现代码:

实现 多选中的 每个代码:

import 'dart:core'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter/material.dart';  /// @author XCC /// @创建时间:2022/5/9 /// 工具菜单checkbox版子项 class ToolMenuCheckboxItemWidget extends StatelessWidget {   /// 显示的title   final String title;   final int value;    /// 点击回调   final Function click;   final double? width;   final double? width;   final double? height;   final bool isActive;   final Color? backgroundColor; // 未选择背景色    final Color? activeBackgroundColor; // 所选颜色 主题色取主题色   final BoxBorder? activeBorder; // 选中的border    final BorderRadiusGeometry? borderRadius; // 圆角   final TextStyle? textStyle; // 文字样式   final TextStyle? activeTextStyle; //  选定的文字样式    const ToolMenuCheckboxItemWidget(       {Key? key,       this.isActive = false,       required this.title,       required this.click,       required this.value,       this.width,       this.height,       this.activeBackgroundColor,       this.backgroundColor,       this.activeBorder,       this.borderRadius,       this.textStyle,       this.activeTextStyle})       : super(key: key);    @override   Widget build(BuildContext context) {     TextStyle defaultTextStyle = const TextStyle();      double defaultWidth = width ??? 100.w;     double defaultHeight = height ?? 50.w;     return Container(       // 点击右波纹效果       width: defaultWidth,       height: defaultHeight,       clipBehavior: Clip.hardEdge,       decoration: BoxDecoration(         border: !isActive             ?isActive             ? Border.all(width: 1.w, color: Colors.transparent)             : activeBorder,         borderRadius: borderRadius ?? BorderRadius.circular(defaultHeight / 2),       ),       child: Material(         color: isActive             ? activeBackgroundColor ?? Theme.of(context).primaryColor             : backgroundColor ?? Colors.white60,         borderRadius: borderRadius ?? BorderRadius.circular(defaultHeight / 2),         child: Ink(           child: InkWell(             onTap: () {               click(value);             },             child: Center(               child: Text(title,                   style: isActive                       ? activeTextStyle ? activeTextStyle ?? defaultTextStyle                       : textStyle ?? defaultTextStyle),             ),           ),         ),       ),     );   } } 

实现多选组件的代码:

import 'dart:core'; import 'package:communityApp/home_system/components/check_box_widget/tool_menu_check_box_item_widget.dart'; import 'package:communityApp/home_system/models/recommendToday.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter/material.dart';  /// @author XCC /// @创建时间:2022/5/9 /// 工具菜单checkbox版 class ToolMenuCheckBoxWidget extends StatefulWidget {   final List<FindSimilarYouWant> children;   final Function click; // 点击回调 回到N个选择的情况   final double? width; //item 宽   final double? width; //item 宽   final double? height; // item 高   final List? selectList; // 选中的数据    final Color? backgroundColor; // 背景色   final Color? activeBackgroundColor; // 选定的背景颜色   final BoxBorder? activeBorder; // 选中的边框   final BorderRadiusGeometry? borderRadius; // 圆角   final TextStyle? textStyle; // 文字样式   final TextStyle? activeTextStyle; //  选定的文字样式   const ToolMenuCheckBoxWidget(       {Key? key,       required this.children,       required this.click,       this.width,       this.height,       this.activeBackgroundColor,       this.activeBorder,       this.selectList,       this.backgroundColor,       this.borderRadius,       this.textStyle,       this.activeTextStyle})       : super(key: key);    @override   State<ToolMenuCheckBoxWidget> createState() => _ToolMenuCheckBoxWidgetState(); }  class _ToolMenuCheckBoxWidgetState extends State<ToolMenuCheckBoxWidget> {   late List<FindSimilarYouWant> items;   late final List _selctedList = widget.selectList ?? [];    @override   void initState() {     // 初始化当前选中     items = widget.children;     super.initState();   }  // 是否选中   bool eachItems(val) {     bool falg = false;     for (var ele in _selctedList) {       if (ele == val) {         falg = true;       }     }     return falg;   }    @override   Widget build(BuildContext context) {     return Wrap(       spacing: 10.w,       runSpacing: 10.w,       alignment: WrapAlignment.start,       children: widget.children.map((val) {         return ToolMenuCheckboxItemWidget(           title: val.title,           value: val.value,           click: (int selectValue) {             // bool galg = false;             // setState(() {             //   _selctedList.removeWhere((element) {             //     galg = true;            //     return element == selectValue;
            //   });
            //   if (!galg) {
            //     setState(() {
            //       _selctedList.add(val.value);
            //     });
            //   }
            // });

            if (_selctedList.contains(selectValue)) {
              setState(() {
                _selctedList.remove(selectValue);
              });
            } else {
              setState(() {
                _selctedList.add(selectValue);
              });
            }
            widget.click(_selctedList);
          },
          width: widget.width,
          height: widget.height,
          isActive: eachItems(val.value),
          backgroundColor: widget.backgroundColor,
          textStyle: widget.textStyle,
          activeTextStyle: widget.activeTextStyle,
          activeBackgroundColor: widget.activeBackgroundColor,
          activeBorder: widget.activeBorder,
          borderRadius: widget.borderRadius,
        );
      }).toList(),
    );
  }
}

 试用的代码:

///初始化代码
widget.selectlist = [];
var data = [
  {"title": 'aaa', "value": 1},
  {"title": 'bbb', "value": 2},
  {"title": 'ccc', "value": 3},
  {"title": 'ddd', "value": 4},
];
youList = data.map((e) => FindSimilarYouWant.froJson(e)).toList();



 builder 的代码
ToolMenuCheckBoxWidget(
  width: 105.w,
  height: 36.w,
  children: youList,  ///数据列表
  selectList: widget.selectlist,  ///默认选中的代码
  backgroundColor: const Color(0xFFF3F9FB),
  activeBackgroundColor: Colors.white,
  activeBorder:
      Border.all(width: 1.w, color: const Color(0xFFFF8A00)),
  activeTextStyle: TextStyle(
    color: const Color(0xFFFF8A00),
    fontSize: 14.sp,
    fontWeight: FontWeight.w500,
  ),
  textStyle: TextStyle(fontSize: 14.sp),
  click: (List selection) {
    setState(() {
      widget.selectlist = selection;    ///接受选中的数据
    });
    print('======>$selection');
  },
)

EndTip: 

 在传递  children 这个Map 列表,进行map遍历去拿到Map里数据的时候 , 会出现数据格式报错的问题 (超级恶心的问题!!!!),我写了一个models来对传递的children数据 进行类型声明。

代码:


class FindSimilarYouWant {
  late String title;
  late int value;
  FindSimilarYouWant({required this.title, required this.value});

  FindSimilarYouWant.froJson(Map<String, dynamic> json) {
    title = json['title'];
    value = json['value'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['title'] = title;
    data['value'] = value;
    return data;
  }
}

标签: 高压电阻器5w500m

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台