Flutter覆盖层弹窗插件overlay_popup_dialog的使用
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
更多关于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'),
),
],
),
);
},
);
}
}
代码解释:
-
依赖导入:
- 导入
flutter/material.dart
和overlay_popup_dialog/overlay_popup_dialog.dart
。
- 导入
-
主应用:
MyApp
是一个无状态组件,它构建了一个简单的MaterialApp
,其中包含一个带有按钮的Scaffold
。
-
按钮点击事件:
- 按钮的
onPressed
属性绑定了一个方法_showPopupDialog
,该方法用于显示弹窗。
- 按钮的
-
显示弹窗:
OverlayPopupDialog.show
方法用于显示弹窗。context
:当前上下文。barrierDismissible
:是否可以通过点击背景来关闭弹窗,这里设置为true
。position
:弹窗的位置,这里设置为OverlayPopupPosition.bottom
,即弹窗显示在屏幕底部。builder
:一个构建器函数,返回弹窗的内容。这里我们创建了一个简单的容器,其中包含一些文本和一个关闭按钮。
-
关闭弹窗:
- 关闭按钮的
onPressed
属性绑定了OverlayPopupDialog.dismiss
方法,用于关闭弹窗。
- 关闭按钮的
这个示例展示了如何使用overlay_popup_dialog
插件来创建一个基本的覆盖层弹窗。你可以根据需要自定义弹窗的内容和样式。