Flutter锚定弹出窗口插件anchored_popups的使用

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

Flutter锚定弹出窗口插件anchored_popups的使用

anchored_popups 是一个用于在Flutter应用中显示上下文菜单的插件,支持右键点击或长按触发。下面我们将详细介绍如何安装和使用该插件,并提供一个完整的示例代码。

🔨 安装

首先,在 pubspec.yaml 文件中添加 anchored_popups 依赖:

dependencies:
  anchored_popups: ^0.1.0

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

⚙ 导入

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

import 'package:anchored_popups/anchored_popups.dart';

🕹️ 使用

anchored_popups 提供了一个名为 AnchoredPopUpRegion 的小部件,它可以将弹出窗口锚定到特定的小部件上。你可以通过设置 anchorpopAnchor 属性来控制弹出窗口相对于目标小部件的位置。

示例代码

以下是一个完整的示例代码,展示了如何使用 anchored_popups 插件创建不同类型的锚定弹出窗口:

import 'package:anchored_popups/anchored_popup_region.dart';
import 'package:anchored_popups/anchored_popups.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return AnchoredPopups(
      child: MaterialApp(
        home: PopupTests(),
      ),
    );
  }
}

class PopupTests extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          // 示例1:底部右对齐的弹出窗口
          Positioned(
            bottom: 0,
            right: 0,
            child: AnchoredPopUpRegion(
              anchor: Alignment.centerLeft, // 弹出窗口相对于目标小部件的锚点
              popAnchor: Alignment.centerRight, // 弹出窗口自身的锚点
              popChild: Card(child: Text("centerLeft to centerRight")), // 弹出窗口的内容
              child: Container(width: 50, height: 50, child: Placeholder()), // 目标小部件
            ),
          ),
          
          Center(
            child: SeparatedColumn(
              mainAxisAlignment: MainAxisAlignment.center,
              separatorBuilder: () => SizedBox(height: 10),
              children: [
                Text("悬停在方块上以显示不同的行为。"),
                
                // 示例2:底部左对齐的弹出窗口
                AnchoredPopUpRegion(
                  anchor: Alignment.bottomLeft,
                  popAnchor: Alignment.bottomRight,
                  popChild: Card(child: Text("BottomLeft to BottomRight")),
                  child: Container(width: 50, height: 50, child: Placeholder()),
                ),
                
                // 示例3:居中对齐的弹出窗口
                AnchoredPopUpRegion(
                  anchor: Alignment.center,
                  popAnchor: Alignment.center,
                  popChild: Card(child: Text("Center to Center")),
                  child: Container(width: 50, height: 50, child: Placeholder()),
                ),
                
                OutlinedButton(onPressed: () {}, child: Text("Btn1")),
                OutlinedButton(onPressed: () {}, child: Text("Btn2")),
                
                // 示例4:点击显示表单的弹出窗口
                AnchoredPopUpRegion(
                  mode: PopUpMode.clickToToggle, // 点击切换弹出窗口的显示状态
                  anchor: Alignment.centerRight,
                  popAnchor: Alignment.centerLeft,
                  buttonBuilder: (_, child, show) {
                    return TextButton(child: child, onPressed: show); // 自定义按钮
                  },
                  popChild: Card(
                    child: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        Text("CenterRight to CenterLeft"),
                        TextButton(
                          onPressed: () {
                            AnchoredPopups.of(context).hide(); // 关闭弹出窗口
                          },
                          child: Text("关闭弹出窗口"),
                        )
                      ],
                    ),
                  ),
                  child: Container(
                    child: Card(
                      child: Text("点击我获取更多信息..."),
                    ),
                  ),
                ),
              ],
            ),
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter中的anchored_popups插件来创建锚定弹出窗口的示例代码。这个插件允许你创建相对于某个锚点(如按钮)的弹出窗口。

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

dependencies:
  flutter:
    sdk: flutter
  anchored_popups: ^x.y.z  # 替换为最新版本号

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

接下来,创建一个简单的Flutter应用,展示如何使用anchored_popups插件。

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey _anchorKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Anchored Popups Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 锚点按钮
            Anchor(
              key: _anchorKey,
              child: ElevatedButton(
                onPressed: () {
                  // 显示弹出窗口
                  showAnchoredPopup(
                    context: context,
                    anchor: _anchorKey.currentContext!,
                    popup: Material(
                      elevation: 8.0,
                      child: Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: <Widget>[
                            Text('这是一个弹出窗口'),
                            ElevatedButton(
                              onPressed: () {
                                // 关闭弹出窗口
                                Navigator.of(context).pop();
                              },
                              child: Text('关闭'),
                            ),
                          ],
                        ),
                      ),
                    ),
                    preferredPosition: AnchoredPopupPosition.below,
                    margin: const EdgeInsets.only(top: 8.0),
                    barrierDismissible: true,
                    barrierColor: Colors.black.withOpacity(0.5),
                  );
                },
                child: Text('显示弹出窗口'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 定义锚点:我们使用Anchor组件和一个GlobalKey来定义一个锚点。GlobalKey用于在运行时获取锚点的上下文。

  2. 创建弹出窗口:我们定义了一个简单的弹出窗口,包含一个文本和一个关闭按钮。

  3. 显示弹出窗口:当用户点击按钮时,调用showAnchoredPopup函数,将弹出窗口显示在锚点的下方。

  4. 关闭弹出窗口:在弹出窗口中点击关闭按钮时,调用Navigator.of(context).pop()来关闭弹出窗口。

这样,你就成功地在Flutter应用中使用anchored_popups插件创建了一个锚定弹出窗口。如果你需要更复杂的布局或功能,可以进一步自定义弹出窗口的内容。

回到顶部