Flutter覆盖层弹窗插件overlay_popup_dialog的使用

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

Flutter覆盖层弹窗插件 overlay_popup_dialog 的使用

overlay_popup_dialog 是一个用于在点击的控件上方、下方、左侧、右侧或顶部显示动画平滑覆盖层的Flutter插件。它提供了高度自定义的弹窗功能,支持多种触发方式和动画效果。

功能特点

  • 支持在上、下、左、右或点击的控件上显示覆盖层。
  • 可以根据需求自定义覆盖层。
  • 使用控制器调用打开和关闭覆盖层的功能。
  • 控制器支持多种动画方向(例如从上到下,从左到右等)。
  • 当覆盖层打开时可以显示高亮按钮。

开始使用

添加依赖

首先,在你的Flutter项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  overlay_popup_dialog: ^latest_version

请将^latest_version替换为最新版本号,可以通过Pub.dev获取。

导入包

然后导入必要的包:

import 'package:overlay_popup_dialog/overlay_popup_dialog.dart';

示例代码

下面是一个完整的示例代码,演示如何使用overlay_popup_dialog来创建一个带有过滤选项的按钮,并在其上显示一个覆盖层对话框。

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'OverlayPopupDialog Playground',
      home: const HomePage(),
      theme: ThemeData(
        scaffoldBackgroundColor: Colors.white,
        expansionTileTheme: ExpansionTileThemeData(
          backgroundColor: Colors.lightBlue[100],
          collapsedBackgroundColor: Colors.grey[200],
        ),
      ),
    );
  }
}

class CategoryModel {
  final String name;
  final IconData icon;
  bool isSelected;

  CategoryModel({
    required this.name,
    required this.icon,
    this.isSelected = false,
  });
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late final OverlayPopupDialogController _overlayController;

  @override
  void initState() {
    super.initState();
    _overlayController = OverlayPopupDialogController();
  }

  @override
  void dispose() {
    _overlayController.dispose();
    super.dispose();
  }

  final List<CategoryModel> categories = [
    CategoryModel(name: 'All', icon: Icons.all_inclusive),
    CategoryModel(name: 'Food', icon: Icons.fastfood),
    CategoryModel(name: 'Drink', icon: Icons.local_drink),
    CategoryModel(name: 'Dessert', icon: Icons.icecream),
  ];

  List<CategoryModel> selectedCategories = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('OverlayPopupDialog Playground'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Align(
            alignment: Alignment.center,
            child: OverlayPopupDialog(
              controller: _overlayController,
              highlightChildOnBarrier: false,
              scaleBegin: 0.1,
              triggerWithLongPress: true,
              highlightBorderRadius: const BorderRadius.all(
                Radius.circular(16),
              ),
              highlightPadding: 4,
              overlayLocation: OverlayLocation.top,
              animationDuration: const Duration(seconds: 1),
              dialogChild: Container(
                margin: const EdgeInsets.all(8),
                decoration: BoxDecoration(
                  color: Theme.of(context).dialogBackgroundColor,
                  borderRadius: BorderRadius.circular(16),
                ),
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  children: [
                    const SizedBox(height: 16),
                    Text(
                      'Filter Categories',
                      style: Theme.of(context).textTheme.titleLarge,
                    ),
                    Wrap(
                      spacing: 8,
                      runSpacing: 8,
                      children: categories.map((category) {
                        return ChoiceChip(
                          label: Text(category.name),
                          selected: category.isSelected,
                          onSelected: (value) {
                            setState(() {
                              category.isSelected = value;
                              if (!selectedCategories.contains(category)) {
                                selectedCategories.add(category);
                              } else {
                                selectedCategories.remove(category);
                              }
                            });
                          },
                        );
                      }).toList(),
                    ),
                    const SizedBox(height: 16),
                  ],
                ),
              ),
              child: OutlinedButton(
                onPressed: () {
                  _overlayController.show();
                },
                child: Text(selectedCategories.isEmpty
                    ? 'Filter Categories'
                    : 'Filtered Categories (${selectedCategories.length})'),
              ),
            ),
          ),
          ...selectedCategories.map((category) => Text(category.name)),
        ],
      ),
    );
  }
}

这个示例展示了如何创建一个带有过滤选项的按钮,并在点击该按钮时显示一个覆盖层对话框。你可以根据自己的需求调整覆盖层的位置、动画效果和其他属性。


更多关于Flutter覆盖层弹窗插件overlay_popup_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter覆盖层弹窗插件overlay_popup_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用overlay_popup_dialog插件来创建覆盖层弹窗的一个示例代码。这个插件允许你轻松地在Flutter应用中创建自定义弹窗。

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

dependencies:
  flutter:
    sdk: flutter
  overlay_popup_dialog: ^latest_version  # 请替换为最新版本号

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

接下来,我们来看一个具体的代码示例。这个示例展示了如何使用OverlayPopupDialog来创建一个简单的弹窗。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Overlay Popup Dialog Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              _showPopupDialog(context);
            },
            child: Text('Show Popup Dialog'),
          ),
        ),
      ),
    );
  }

  void _showPopupDialog(BuildContext context) {
    OverlayPopupDialog.show(
      context: context,
      barrierDismissible: true,
      position: OverlayPopupPosition.bottom,
      builder: (context) {
        return Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(10),
          ),
          padding: EdgeInsets.all(20),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text(
                'This is a custom popup dialog!',
                style: TextStyle(fontSize: 18),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  OverlayPopupDialog.dismiss(context);
                },
                child: Text('Close'),
              ),
            ],
          ),
        );
      },
    );
  }
}

代码解释:

  1. 依赖导入

    • 导入flutter/material.dartoverlay_popup_dialog/overlay_popup_dialog.dart
  2. 主应用

    • MyApp是一个无状态组件,它构建了一个简单的MaterialApp,其中包含一个带有按钮的Scaffold
  3. 按钮点击事件

    • 按钮的onPressed属性绑定了一个方法_showPopupDialog,该方法用于显示弹窗。
  4. 显示弹窗

    • OverlayPopupDialog.show方法用于显示弹窗。
    • context:当前上下文。
    • barrierDismissible:是否可以通过点击背景来关闭弹窗,这里设置为true
    • position:弹窗的位置,这里设置为OverlayPopupPosition.bottom,即弹窗显示在屏幕底部。
    • builder:一个构建器函数,返回弹窗的内容。这里我们创建了一个简单的容器,其中包含一些文本和一个关闭按钮。
  5. 关闭弹窗

    • 关闭按钮的onPressed属性绑定了OverlayPopupDialog.dismiss方法,用于关闭弹窗。

这个示例展示了如何使用overlay_popup_dialog插件来创建一个基本的覆盖层弹窗。你可以根据需要自定义弹窗的内容和样式。

回到顶部