flutter实现下拉菜单组件——基于PopupMenuButton

这篇具有很好参考价值的文章主要介绍了flutter实现下拉菜单组件——基于PopupMenuButton。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

客户端日常开发和学习过程,下拉菜单是一个很常见的组件,本文主要介绍flutter中实现下拉菜单组件的一个方案,基于PopupMenuButton来进行实现。

问题分析

PopupMenuButton PopupMenuButton 是一个非常常见的弹出菜单栏。 属性介绍: flutter 下拉菜单,flutter,android,ios

问题解决

话不多说,直接上代码 (1)新建MenuItem.dart通用菜单项类,代码如下:

/// author baorant
/// 通用菜单项
class MenuItem {
  // 显示的文本
  String label;
  // 选中的值
  dynamic value;
  // 是否选中
  bool checked;

  MenuItem({this.label = '', this.value, this.checked = false});
}

(2)实现SelectWidget.dart下拉菜单项组件,代码如下:

import 'package:flutter/material.dart';
import 'MenuItem.dart';

/// @author baorant
/// @创建时间:2024/4/11
/// 下拉菜单按钮组件
class SelectWidget extends StatefulWidget {
  // 显示的菜单项
  final List<MenuItem> items;
  // 当前选中的值
  final dynamic value;
  // 选择框前的标题
  final String? title;
  // 提示语
  final String tooltip;
  // 选中数据的回调事件
  final ValueChanged<dynamic>? valueChanged;
  const SelectWidget(
      {Key? key,
        this.items = const [],
        this.value,
        this.valueChanged,
        this.title,
        this.tooltip = "点击选择"})
      : super(key: key);

  @override
  State<SelectWidget> createState() => _SelectWidgetState();
}

class _SelectWidgetState extends State<SelectWidget> {
  String label = '请选择';
  // 是否展开下拉按钮
  bool isExpand = false;
  // 当前的值
  dynamic currentValue;

  @override
  void initState() {
    currentValue = widget.value;
    super.initState();
  }

  /// 根据当前的value处理当前文本显示
  void initTitle() {
    if (currentValue != null) {
      // 有值查值
      for (MenuItem item in widget.items) {
        if (item.value == currentValue) {
          label = item.label;
          return;
        }
      }
    }
    // 没值默认取第一个
    if (widget.items.isNotEmpty) {
      label = widget.items[0].label;
    }
  }

  @override
  Widget build(BuildContext context) {
    initTitle();
    return Wrap(
      children: [
        if (widget.title != null)
          Text(widget.title!, style: TextStyle(fontSize: 18)),
        PopupMenuButton<String>(
          // initialValue: currentValue,
          tooltip: widget.tooltip,
          offset: Offset(25, 30),
          enableFeedback: true,
          child: Listener(
            // 使用listener事件能够继续传递
            onPointerDown: (event) {
              setState(() {
                isExpand = !isExpand;
              });
            },
            child: Wrap(
              children: [
                Text(
                  label,
                  style: TextStyle(fontSize: 18),
                ),
                isExpand
                    ? const Icon(Icons.arrow_drop_up)
                    : const Icon(Icons.arrow_drop_down)
              ],
            ),
          ),
          onSelected: (value) {
            widget.valueChanged?.call(value);
            setState(() {
              currentValue = value;
              isExpand = !isExpand;
            });
          },
          onCanceled: () {
            // 取消展开
            setState(() {
              isExpand = false;
            });
          },
          itemBuilder: (context) {
            return widget.items
                .map(
                  (item) => item.value == currentValue
                  ? PopupMenuItem<String>(
                value: item.value,
                child: Text(
                  item.label,
                  style: TextStyle(
                      color: Theme.of(context).primaryColor),
                ),
              )
                  : PopupMenuItem<String>(
                value: item.value,
                child: Text(item.label),
              ),
            ).toList();
          },
        )
      ],
    );
  }
}

(3)测试代码如下:

import 'package:flutter/material.dart';

import '../../../components/select_menu/MenuItem.dart';
import '../../../components/select_menu/SelectWidget.dart';
import '../../../utils/custom_appbar.dart';

class Test extends StatefulWidget {
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  String value = "1";

  /// 下拉选择值改变
  selectChange(value) {
    print("值改变了:$value");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: customAppbar(
        title: "下拉菜单演示",
      ),
      body: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          SelectWidget(
            items: [
              MenuItem(label: "张飞", value: '1'),
              MenuItem(label: "关羽", value: '2'),
              MenuItem(label: "刘备", value: '3'),
              MenuItem(label: "亚瑟", value: '4'),
              MenuItem(label: "妲己", value: '5'),
              MenuItem(label: "兰陵王", value: '6'),
            ],
            value: value,
            valueChanged: selectChange,
          ),
        ],
      ),
    );
  }
}

(4)运行结果如下: flutter 下拉菜单,flutter,android,ios

问题总结

本文主要介绍flutter中实现下拉菜单组件的一个方案,基于PopupMenuButton来进行实现,有兴趣的同学可以进一步深入研究。文章来源地址https://www.toymoban.com/news/detail-724928.html

到了这里,关于flutter实现下拉菜单组件——基于PopupMenuButton的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【unity3D】Dropdown组件 — 如何使用下拉菜单

    💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity的Dropdown组件 介绍:Unity的Dropdown组件是一种UI控件,用于在下拉列表中显示选项或选项组。它允许用户从列表中选择一个选项,并可以在选择时触发特定的行为或事件。通

    2024年02月06日
    浏览(68)
  • Vue 中修改 Element 组件的 下拉菜单(Dropdown) 的样式

    今天在项目中碰到一个 UI 改造的需求,需要根据设计图把页面升级成 UI 设计师提供的设计图样式。 到最后页面改造完了,但是 UI 提供的下拉菜单样式全部是黑色半透明的,只能硬着头皮改了。 然后,就有了一下午的头脑风暴。 一开始,我是想着使用 /deep/ 来深度修改样式

    2024年01月17日
    浏览(70)
  • Unity UGUI的Dropdown(下拉菜单)组件的介绍及使用

    Dropdown(下拉菜单)是Unity UGUI中的一个常用组件,用于在用户点击或选择时显示一个下拉菜单,提供多个选项供用户选择。 Dropdown组件由两部分组成:一个可点击的按钮和一个下拉菜单。当用户点击按钮时,下拉菜单会展开,显示所有选项。用户可以通过点击选项来进行选择

    2024年02月13日
    浏览(109)
  • 【Unity-UGUI控件全面解析】| Dropdown 下拉菜单组件详解

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:

    2024年02月06日
    浏览(65)
  • 【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)

    Select组件:提供下拉选择菜单,可以让用户在多个选项之间选择。 Slider组件:滑动条组件,通常用于快速调节设置值,如音量调节、亮度调节等应用场景。 提供下拉选择菜单,可以让用户在多个选项之间选择。 说明 该组件从API Version 8开始支持。后续版本如有新增内容,则

    2024年02月07日
    浏览(67)
  • 基于vue+element ui实现下拉表格选择组件

    根据https://lolicode.gitee.io/scui-doc/demo/#/dashboard里的组件修改

    2024年02月16日
    浏览(56)
  • Axure网页端高交互组件库, 下拉菜单文件上传穿梭框日期城市选择器

    组件数量:共 11 套 兼容软件:Axure RP 9/10,不支持低版本 应用领域:web端原型设计、桌面端原型设计 本作品为「web端组件库」,高保真高交互 (带仿真功能效果);运用了动态面板、中继器、变量值,可以自定义数据;主要包括表单类和选择器,一共11套组件。 表单类有:输

    2024年02月04日
    浏览(62)
  • Axure网页端高交互组件库11套, 下拉菜单文件上传穿梭框日期城市选择器

    组件数量:共 11 套 兼容软件:Axure RP 9/10,不支持低版本 应用领域:web端原型设计、桌面端原型设计 本作品为「web端组件库」,高保真高交互 (带仿真功能效果);运用了动态面板、中继器、变量值,可以自定义数据;主要包括表单类和选择器,一共11套组件。 表单类有:输

    2024年01月17日
    浏览(42)
  • 如何使用CSS实现一个下拉菜单?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月13日
    浏览(43)
  • QT实现多级下拉列表导航菜单,可折叠(QTreewidget实现)

    目录 创建多级列表 在ui中拖入一个QTreewidget控件。 双击该控件,打开编辑树窗口部件。​编辑​编辑 进行列表控件设置: 在项目前添加图标: 效果: QT实现多级下拉列表,可折叠 做项目的时候需要实现一个可折叠的多级下拉列表,用QTreewidget就可以实现,而且直接在ui文件

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包