Flutter弹出菜单插件w_popup_menu的使用

Flutter弹出菜单插件w_popup_menu的使用

简介

w_popup_menu 是一个模仿 iOS 微信页面弹出菜单的 Flutter 插件。它提供了灵活的弹出菜单功能,支持自定义菜单项和位置。

更新日志

  • [0.3.1]:解决了返回键无法关闭菜单的 bug。
  • [0.3.0]:将弹出方式改为 Overlay,解决了弹出菜单时输入框被收起的问题。
  • [0.2.5]:修复了位置弹出错误的问题。
  • [0.2.4]:修复了菜单朝下时位置计算错误的问题,并优化了弹出逻辑。
  • [0.2.3]:更新了 WPopupMenu 的构造函数,使其与 Container 类似,支持更多的属性(如 margin)。

使用步骤

以下是使用 w_popup_menu 插件的完整示例。

1. 添加依赖

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  w_popup_menu: ^0.3.1

然后运行以下命令安装依赖:

$ flutter pub get

2. 导入插件

在 Dart 文件中导入插件:

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

3. 创建弹出菜单

以下是一个完整的示例代码,展示了如何使用 w_popup_menu 插件创建一个弹出菜单。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('w_popup_menu 示例')),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isMenuOpen = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        // 主按钮
        ElevatedButton(
          onPressed: () {
            setState(() {
              _isMenuOpen = !_isMenuOpen;
            });
          },
          child: Text('点击打开菜单'),
        ),

        // 弹出菜单
        WPopupMenu(
          visible: _isMenuOpen,
          position: Position.topRight, // 菜单位置
          child: Container(
            width: 200,
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(8),
              boxShadow: [
                BoxShadow(
                  color: Colors.black12,
                  blurRadius: 5,
                  offset: Offset(0, 2),
                ),
              ],
            ),
            padding: EdgeInsets.all(16),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                ListTile(
                  leading: Icon(Icons.edit),
                  title: Text('编辑'),
                  onTap: () {
                    print('点击编辑');
                  },
                ),
                ListTile(
                  leading: Icon(Icons.delete),
                  title: Text('删除'),
                  onTap: () {
                    print('点击删除');
                  },
                ),
                ListTile(
                  leading: Icon(Icons.share),
                  title: Text('分享'),
                  onTap: () {
                    print('点击分享');
                  },
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

更多关于Flutter弹出菜单插件w_popup_menu的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter弹出菜单插件w_popup_menu的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


w_popup_menu 是一个用于在 Flutter 应用中创建弹出菜单的插件。它提供了简单易用的 API,可以帮助你快速实现自定义的弹出菜单。以下是如何使用 w_popup_menu 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 w_popup_menu 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  w_popup_menu: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 w_popup_menu 包:

import 'package:w_popup_menu/w_popup_menu.dart';

3. 使用 WPopupMenu

WPopupMenu 是一个可以附加到任何小部件上的弹出菜单。你可以通过 WPopupMenu 来显示一个自定义的菜单。

基本用法

以下是一个简单的示例,展示如何使用 WPopupMenu

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

class PopupMenuExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Popup Menu Example'),
      ),
      body: Center(
        child: WPopupMenu(
          child: Text('Show Menu'),
          menu: Column(
            children: [
              WPopupMenuItem(
                child: Text('Item 1'),
                onTap: () {
                  print('Item 1 clicked');
                },
              ),
              WPopupMenuItem(
                child: Text('Item 2'),
                onTap: () {
                  print('Item 2 clicked');
                },
              ),
              WPopupMenuItem(
                child: Text('Item 3'),
                onTap: () {
                  print('Item 3 clicked');
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: PopupMenuExample(),
));

自定义菜单项

你可以通过 WPopupMenuItem 自定义菜单项的内容和样式。WPopupMenuItemchild 属性可以接受任何小部件,因此你可以根据需要自定义菜单项的外观。

WPopupMenuItem(
  child: Container(
    padding: EdgeInsets.all(10),
    color: Colors.blue,
    child: Text(
      'Custom Item',
      style: TextStyle(color: Colors.white),
    ),
  ),
  onTap: () {
    print('Custom Item clicked');
  },
),

控制菜单的显示和隐藏

你可以通过 WPopupMenuController 来控制菜单的显示和隐藏。首先,创建一个 WPopupMenuController 实例,然后将其传递给 WPopupMenucontroller 属性。

class PopupMenuExample extends StatefulWidget {
  @override
  _PopupMenuExampleState createState() => _PopupMenuExampleState();
}

class _PopupMenuExampleState extends State<PopupMenuExample> {
  final WPopupMenuController _controller = WPopupMenuController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Popup Menu Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            WPopupMenu(
              controller: _controller,
              child: Text('Show Menu'),
              menu: Column(
                children: [
                  WPopupMenuItem(
                    child: Text('Item 1'),
                    onTap: () {
                      print('Item 1 clicked');
                    },
                  ),
                  WPopupMenuItem(
                    child: Text('Item 2'),
                    onTap: () {
                      print('Item 2 clicked');
                    },
                  ),
                ],
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _controller.show();
              },
              child: Text('Show Menu Programmatically'),
            ),
            ElevatedButton(
              onPressed: () {
                _controller.hide();
              },
              child: Text('Hide Menu Programmatically'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 其他配置

WPopupMenu 还提供了其他一些配置选项,例如:

  • offset: 控制菜单相对于触发点的偏移量。
  • barrierColor: 设置菜单背景遮罩的颜色。
  • barrierDismissible: 控制是否可以通过点击遮罩来关闭菜单。
WPopupMenu(
  offset: Offset(0, 10),
  barrierColor: Colors.black.withOpacity(0.5),
  barrierDismissible: true,
  child: Text('Show Menu'),
  menu: Column(
    children: [
      WPopupMenuItem(
        child: Text('Item 1'),
        onTap: () {
          print('Item 1 clicked');
        },
      ),
      WPopupMenuItem(
        child: Text('Item 2'),
        onTap: () {
          print('Item 2 clicked');
        },
      ),
    ],
  ),
),
回到顶部