Flutter上下文菜单插件super_context_menu的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter上下文菜单插件super_context_menu的使用

特性

  • 在所有桌面平台、移动平台和Web上工作的单一上下文菜单小部件。
  • 可以在Android和iOS上过渡到本地拖放操作。
  • iOS、macOS和Linux上的本地上下文菜单;Android、Windows和Web上的Flutter上下文菜单。
  • 高级功能,如自定义提升图像、菜单和拖动预览、延迟菜单项(懒加载)和延迟菜单预览。

开始使用

super_context_menu 使用Rust来实现低级别的平台特定功能。如果您的系统没有安装Rust,插件会自动下载预编译的二进制文件。如果您希望从源代码编译Rust代码,可以通过 rustup 安装Rust。

安装 Rust

对于 macOS 或 Linux:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

对于 Windows,可以使用 Rust Installer

确保 Rust 是最新版本:

rustup update

首次构建可能会花费一些时间,因为需要安装必要的Rust目标和其他依赖项(如NDK)。

使用示例

以下是一个基本的示例,展示如何使用 ContextMenuWidget 创建一个上下文菜单:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Super Context Menu Example')),
        body: Center(
          child: ContextMenuWidget(
            child: Container(
              padding: EdgeInsets.all(16),
              color: Colors.blue,
              child: Text('Right-click me', style: TextStyle(color: Colors.white)),
            ),
            menuProvider: (_) {
              return Menu(
                children: [
                  MenuAction(title: 'Option 1', callback: () { print('Option 1 selected'); }),
                  MenuAction(title: 'Option 2', callback: () { print('Option 2 selected'); }),
                  MenuSeparator(),
                  Menu(title: 'Submenu', children: [
                    MenuAction(title: 'Submenu Item 1', callback: () { print('Submenu Item 1 selected'); }),
                    MenuAction(title: 'Submenu Item 2', callback: () { print('Submenu Item 2 selected'); }),
                  ]),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

运行示例项目

示例项目位于 super_context_menu/example 目录下。您可以按照以下步骤运行它:

flutter pub global activate melos # 如果您还没有安装melos
git clone https://github.com/superlistapp/super_native_extensions.git
cd super_native_extensions
melos bootstrap

然后可以在VSCode中打开该文件夹并运行 super_context_menu_example 启动配置。

复杂菜单示例

以下是包含更多复杂功能的完整示例,包括自定义提升图像、预览和拖动构建器等:

import 'package:flutter/material.dart';
import 'package:super_context_menu/super_context_menu.dart';
import 'package:super_drag_and_drop/super_drag_and_drop.dart';

void main() => runApp(MainApp());

// ... 其他类定义省略 ...

class MainApp extends StatelessWidget {
  const MainApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: _PageLayout(
            itemZone: SingleChildScrollView(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  Section(
                    description: const Text('Base context menu, without drag & drop.'),
                    child: _BaseContextMenu(),
                  ),
                  Section(
                    description: const Text('Base context menu, with drag & drop.'),
                    child: _BaseContextMenuWithDrag(),
                  ),
                  Section(
                    description: const Text('Complex context menu, with custom lift, preview and drag builders (mobile only).'),
                    child: _ComplexContextMenu(),
                  ),
                  Section(
                    description: const Text('Deferred menu preview (mobile only).'),
                    child: _DeferredMenuPreview(),
                  ),
                ].intersperse(const _Separator()).toList(growable: false),
              ),
            ),
            dropZone: const _DropZone(),
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何创建不同类型的上下文菜单,包括基础菜单、带有拖放功能的菜单以及复杂的菜单配置。通过这些示例,您可以根据自己的需求定制上下文菜单的功能和外观。


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

1 回复

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


当然,以下是一个关于如何在Flutter中使用super_context_menu插件来实现上下文菜单的示例代码。这个插件允许你在长按某个Widget时显示一个上下文菜单。

首先,确保你已经在pubspec.yaml文件中添加了super_context_menu依赖:

dependencies:
  flutter:
    sdk: flutter
  super_context_menu: ^最新版本号  # 请替换为实际发布的最新版本号

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

接下来,下面是一个完整的示例代码,展示了如何使用super_context_menu插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Context Menu Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Context Menu Demo'),
      ),
      body: GestureDetector(
        onLongPress: (details) {
          // 显示上下文菜单
          showContextMenu(
            context: context,
            position: details.globalPosition,
            items: [
              ContextMenuItem(
                title: 'Item 1',
                onTap: () {
                  // 处理点击事件
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('You clicked Item 1')),
                  );
                },
              ),
              ContextMenuItem(
                title: 'Item 2',
                onTap: () {
                  // 处理点击事件
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('You clicked Item 2')),
                  );
                },
              ),
              ContextMenuItem(
                title: 'Item 3',
                onTap: () {
                  // 处理点击事件
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('You clicked Item 3')),
                  );
                },
              ),
            ],
          );
        },
        child: Center(
          child: Text(
            'Long press here to show context menu',
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个文本。当用户长按这个文本时,会显示一个上下文菜单。菜单项是通过ContextMenuItem定义的,每个菜单项都有一个标题和一个点击回调。

注意,showContextMenu函数需要BuildContext和菜单的位置(通常是通过GestureDetectoronLongPress回调获取的)。items参数是一个ContextMenuItem列表,每个项都可以定义自己的标题和点击处理函数。

这个示例展示了基本的用法,你可以根据需要自定义菜单项的外观和行为。

回到顶部