广告
返回顶部
首页 > 资讯 > 移动开发 >flutter实现下拉菜单组件——基于PopupMenuButton
  • 692
分享到

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

flutterandroidios 2023-10-22 11:10:59 692人浏览 独家记忆
摘要

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

问题背景

客户端日常开发学习过程,下拉菜单是一个很常见的组件,本文主要介绍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

--结束END--

本文标题: flutter实现下拉菜单组件——基于PopupMenuButton

本文链接: https://www.lsjlt.com/news/439626.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • flutter实现下拉菜单组件——基于PopupMenuButton
    问题背景 客户端日常开发和学习过程,下拉菜单是一个很常见的组件,本文主要介绍flutter中实现下拉菜单组件的一个方案,基于PopupMenuButton来进行实现。 问题分析 PopupMenuButton PopupM...
    99+
    2023-10-22
    flutter android ios
  • flutter实现下拉框功能——基于DropdownButtonFormField
    问题背景 客户端日常开发和学习过程,下拉框是一个很常见的组件,本文主要介绍flutter中实现下拉框的一个方案,基于DropdownButtonFormField来进行实现。 问题分析 DropdownButtonFormF...
    99+
    2023-09-05
    flutter android
  • 手写实现vue2下拉菜单dropdown组件实例
    目录概述最终效果(动图没显示出来,请稍定会儿,可以先看后面)实现原理具体实现目录结构emitter.jsMyDropdown.vueMyDropdownMenu.vueMy...
    99+
    2022-11-13
  • 基于WPF实现简单的下拉筛选控件
    WPF 简单实现下拉筛选控件 框架使用.NET40; Visual Studio 2022; 使用 ICollectionView[2] 实现筛选功能,还支持其他...
    99+
    2023-05-14
    WPF实现下拉筛选控件 WPF下拉筛选控件 WPF下拉控件
  • jquery基于layui如何实现二级联动下拉选择菜单
    这篇文章将为大家详细讲解有关jquery基于layui如何实现二级联动下拉选择菜单,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先看一下简单的效果直接上代码html部分 ...
    99+
    2022-10-19
  • bootstrap组件之按钮式下拉菜单的实现方法
    小编给大家分享一下bootstrap组件之按钮式下拉菜单的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、单按钮下拉菜...
    99+
    2022-10-19
  • 如何使用JS组件Bootstrap实现下拉菜单效果
    这篇“如何使用JS组件Bootstrap实现下拉菜单效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用JS组件Boo...
    99+
    2023-07-04
  • 基于WPF怎么实现简单的下拉筛选控件
    本文小编为大家详细介绍“基于WPF怎么实现简单的下拉筛选控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于WPF怎么实现简单的下拉筛选控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。WPF 简单实现下拉筛...
    99+
    2023-07-05
  • 如何实现Amazon下拉菜单的jQ插件
    本篇内容主要讲解“如何实现Amazon下拉菜单的jQ插件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现Amazon下拉菜单的jQ插件”吧!这篇文章向大家...
    99+
    2022-10-19
  • Bootstrap3中下拉菜单事件的实现方法
    这篇文章给大家分享的是有关Bootstrap3中下拉菜单事件的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下拉菜单的事件Bootstrap为下拉菜单插件提供了 4 个事件,通过监听这些事件,可以对特定操...
    99+
    2023-06-14
  • 基于WPF实现筛选下拉多选控件
    WPF 实现筛选下拉多选控件 框架使用.NET4 至 .NET6;Visual Studio 2022; 创建 MultiSelectionSearchComb...
    99+
    2023-05-16
    WPF实现筛选下拉多选控件 WPF筛选下拉多选控件 WPF筛选下拉控件 WPF 控件
  • 基于Flutter实现风车加载组件的制作
    目录前言接口定义实现思路风车绘制旋转效果代码实现WindmillIndicator定义旋转速度设定风车叶片绘制风车组件运行效果总结前言 Flutter 官方提供了诸如 Circula...
    99+
    2022-11-13
  • 基于Flutter实现多边形和多角星组件
    目录前言组件功能1、原理2、找点小结:前言 开发中,免不了会用到多边形、多角星等图案,比较常用的多边形比如雷达图、多角星比如评价星级的五角星等,本篇文章就使用Flutter绘制封装一...
    99+
    2022-11-13
  • 基于WPF实现多选下拉控件的示例代码
    WPF 实现多选下拉控件 框架使用.NET40; Visual Studio 2022; 创建控件 MultiSelectComboBox 继承 Lis...
    99+
    2023-02-01
    WPF多选下拉控件 WPF下拉控件 WPF 控件
  • 基于Flutter如何实现多边形和多角星组件
    这篇文章主要介绍了基于Flutter如何实现多边形和多角星组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Flutter如何实现多边形和多角星组件文章都会有所收获,下面我们一起来看看吧。组件功能正多边形正...
    99+
    2023-06-30
  • Vue下如何用递归组件实现一个可折叠的树形菜单
    这篇文章主要介绍“Vue下如何用递归组件实现一个可折叠的树形菜单”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue下如何用递归组件实现一个可折叠的树形菜单”文章能帮助大家解决问题。在Vue.js中...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作