我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

问题背景

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

问题分析

PopupMenuButton PopupMenuButton 是一个非常常见的弹出菜单栏。 属性介绍: image.png

问题解决

话不多说,直接上代码 (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 items;  // 当前选中的值  final dynamic value;  // 选择框前的标题  final String? title;  // 提示语  final String tooltip;  // 选中数据的回调事件  final ValueChanged? valueChanged;  const SelectWidget(      {Key? key,        this.items = const [],        this.value,        this.valueChanged,        this.title,        this.tooltip = "点击选择"})      : super(key: key);  @override  State createState() => _SelectWidgetState();}class _SelectWidgetState extends State {  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(          // 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(                value: item.value,                child: Text(                  item.label,                  style: TextStyle(                      color: Theme.of(context).primaryColor),                ),              )                  : PopupMenuItem(                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 {  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)运行结果如下: 1681176528016.gif

问题总结

本文主要介绍flutter中实现下拉菜单组件的一个方案,基于PopupMenuButton来进行实现,有兴趣的同学可以进一步深入研究。

来源地址:https://blog.csdn.net/weixin_39033300/article/details/130456842

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于WPF实现简单的下拉筛选控件

这篇文章主要为大家详细介绍了如何基于WPF实现简单的下拉筛选控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-05-14

如何使用JS组件Bootstrap实现下拉菜单效果

这篇“如何使用JS组件Bootstrap实现下拉菜单效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用JS组件Boo
2023-07-04

Bootstrap3中下拉菜单事件的实现方法

这篇文章给大家分享的是有关Bootstrap3中下拉菜单事件的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下拉菜单的事件Bootstrap为下拉菜单插件提供了 4 个事件,通过监听这些事件,可以对特定操
2023-06-14

基于WPF怎么实现简单的下拉筛选控件

本文小编为大家详细介绍“基于WPF怎么实现简单的下拉筛选控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于WPF怎么实现简单的下拉筛选控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。WPF 简单实现下拉筛
2023-07-05

基于WPF实现筛选下拉多选控件

这篇文章主要为大家详细介绍了如何基于WPF实现简单的筛选下拉多选控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-05-16

基于Flutter如何实现多边形和多角星组件

这篇文章主要介绍了基于Flutter如何实现多边形和多角星组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Flutter如何实现多边形和多角星组件文章都会有所收获,下面我们一起来看看吧。组件功能正多边形正
2023-06-30

基于WPF实现多选下拉控件的示例代码

这篇文章主要为大家详细介绍了WPF实现简单的多选下拉控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-02-01

c#下拉菜单的功能加入控件后功能怎么实现

在 c# 中,可以通过 combobox 控件实现下拉菜单功能:添加 combobox 控件。通过 items 属性设置选项列表(可直接指定或数据绑定)。处理 selectedindexchanged 事件以响应用户选择。C# 下拉菜单功能
c#下拉菜单的功能加入控件后功能怎么实现
2024-05-12

Vue下如何用递归组件实现一个可折叠的树形菜单

这篇文章主要介绍“Vue下如何用递归组件实现一个可折叠的树形菜单”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue下如何用递归组件实现一个可折叠的树形菜单”文章能帮助大家解决问题。在Vue.js中
2023-07-04

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录