Flutter浮动层构建插件overlay_builder的使用
Flutter浮动层构建插件overlay_builder的使用
overlay_builder
是一个用于在 Flutter 中通过声明式编程构建浮动层(overlay)的插件。本文将详细介绍如何安装、使用以及一些常用的 API。
Getting Started
安装
使用命令行安装
运行以下命令:
flutter pub add overlay_builder
手动安装
在 pubspec.yaml
文件中添加以下依赖,并运行 flutter pub get
:
dependencies:
overlay_builder: ^1.1.0
Usage
基本用法
在你的 Dart 代码中,首先需要导入 overlay_builder
包:
import 'package:overlay_builder/overlay_builder.dart';
要使用 OverlayBuilder
,你需要在 widget 树中的某个位置有一个子 widget,如下所示:
@override
Widget build(BuildContext context) {
return const Text('Overlay Builder Demo');
}
然后,将当前的子 widget 包裹在 OverlayBuilder
中:
@override
Widget build(BuildContext context) {
return OverlayBuilder(
child: const Text('Overlay Builder Demo'),
overlayChild: const Material(
type: MaterialType.transparency,
child: Center(child: Text('Overlay Test')),
),
);
}
全屏覆盖
如果需要渲染一个覆盖整个屏幕的 overlay,可以设置 type
属性为 OverlayType.fullscreen
:
@override
Widget build(BuildContext context) {
return OverlayBuilder(
type: OverlayType.fullscreen,
child: const Text('Overlay Builder Demo'),
overlayChild: const Material(
type: MaterialType.transparency,
child: Center(child: Text('Overlay Test')),
),
);
}
显示和移除 Overlay
要显示或移除 overlay,可以使用 GlobalKey
来控制 OverlayBuilder
的状态:
final _overlay = GlobalKey<OverlayWidgetState>();
OverlayWidgetState get overlayController {
return _overlay.currentState!;
// 或者使用非空安全版本:return _overlay.currentState;
}
在 OverlayBuilder
中使用该 key:
@override
Widget build(BuildContext context) {
return OverlayBuilder(
key: _overlay,
child: const Text('Overlay Builder Demo'),
overlayChild: const Material(
type: MaterialType.transparency,
child: Center(child: Text('Overlay Test')),
),
);
}
使用 key 来显示、移除或检查 overlay 是否正在显示:
void doSomething() {
// 显示 overlay
overlayController.show();
// 移除 overlay
overlayController.remove();
// 检查 overlay 是否正在显示
bool isShowing = overlayController.isShowing;
// 切换 overlay 的显示状态
overlayController.toggle();
}
APIS
OverlayBuilder
OverlayBuilder
用于根据其类型显示一个 overlay widget。
Props
Name | Description | Required |
---|---|---|
overlayChild |
用于获取当前的 overlay widget。当它发生变化时,当前的 overlay 将被更新。 | true |
child |
用于获取当前被 OverlayBuilder 包裹的 widget,然后在应用程序界面中显示它。 |
true |
initialShow |
当为 true 时,在第一帧时构建 overlayChild 。默认为 false 。 |
false |
maintainState |
是否必须包含在树中,即使在其上方有完全不透明的条目。默认情况下,如果有完全不透明的条目覆盖此条目,则此条目不会包含在 widget 树中(特别是,overlay 条目中的状态化 widget 不会被实例化)。为了确保即使不可见时仍然构建 overlay 条目,将 maintainState 设置为 true 。这更昂贵,因此应谨慎使用。特别是在 overlay 条目中设置了 maintainState 为 true 的 widget 反复调用 State.setState 时,会不必要的消耗用户电池。默认为 false 。 |
false |
opaque |
该条目是否遮挡整个 overlay。如果条目声称是不透明的,那么为了效率,overlay 将跳过构建位于该条目下方的条目,除非它们设置了 maintainState 。默认为 false 。 |
false |
type |
用于根据其类型渲染 overlay widget。如果为 OverlayType.fullscreen ,则渲染一个覆盖整个屏幕的 overlay widget;如果为 OverlayType.positioned ,则渲染一个覆盖其子 widget 的 overlay widget。默认为 OverlayType.positioned 。 |
false |
alignment |
用于在 type 为 OverlayType.positioned 时,基于其子 widget 的约束对齐 overlayChild 。默认为 OverlayAlignment.bottomCenter 。 |
false |
verticalSpacing |
用于在 type 为 OverlayType.positioned 时,垂直方向上为 overlayChild 添加内边距。默认为 0.0 ,可以为负值。 |
false |
horizontalSpacing |
用于在 type 为 OverlayType.positioned 时,水平方向上为 overlayChild 添加内边距。默认为 0.0 ,可以为负值。 |
false |
OverlayAlignment
OverlayAlignment
与 OverlayBuilder
一起使用,用于在 type
为 OverlayType.positioned
时对齐 overlay widget。
Getters
Name | Description |
---|---|
topCenter |
顶部中心点 |
topLeft |
顶部左角 |
topRight |
顶部右角 |
center |
中心点,水平和垂直方向均居中 |
centerLeft |
左侧中心点 |
centerRight |
右侧中心点 |
bottomCenter |
底部中心点 |
bottomLeft |
底部左角 |
bottomRight |
底部右角 |
OverlayType
OverlayType
用于根据其类型渲染 overlay。如果为 OverlayType.fullscreen
,则渲染一个覆盖整个屏幕的 overlay widget;如果为 OverlayType.positioned
,则渲染一个覆盖其子 widget 的 overlay widget。
Getters
Name | Description |
---|---|
fullscreen |
用于渲染全屏 overlay widget |
positioned |
用于渲染定位的 overlay widget |
OverlayWidgetState
OverlayWidgetState
与 GlobalKey
一起使用,用于获取当前 OverlayBuilder
的状态,以显示、移除或检查 overlay 是否正在显示。
Methods
Name | Description |
---|---|
show |
用于显示 OverlayBuilder.overlayChild widget,覆盖其屏幕或子 widget |
remove |
用于移除 OverlayBuilder.overlayChild widget,当它覆盖其屏幕或子 widget 时 |
toggle |
用于切换 OverlayBuilder.overlayChild widget 的显示状态 |
Getters
Name | Description |
---|---|
isShowing |
用于检查 overlay 是否正在显示 |
Deprecation Notice
为了进行一些代码优化,OverlayWidget
和 OverlayFullscreen
API 已被弃用。请改用 OverlayBuilder
。
示例代码
以下是一个完整的示例代码,展示了如何使用 overlay_builder
插件:
import 'package:flutter/material.dart';
import 'package:overlay_builder/overlay_builder.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Overlay Builder Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _overlayWidget = GlobalKey<OverlayWidgetState>();
final _overlayFullscreen = GlobalKey<OverlayWidgetState>();
OverlayWidgetState get overlayWidgetController {
return _overlayWidget.currentState!;
}
OverlayWidgetState get overlayFullscreenController {
return _overlayFullscreen.currentState!;
}
void onTap() {
overlayWidgetController.toggle();
overlayFullscreenController.toggle();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Overlay Builder Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
OverlayBuilder(
key: _overlayWidget,
child: const Text('Overlay Builder Demo'),
overlayChild: const Material(
type: MaterialType.transparency,
child: CircularProgressIndicator(),
),
),
],
),
),
floatingActionButton: OverlayBuilder(
key: _overlayFullscreen,
type: OverlayType.fullscreen,
child: FloatingActionButton(
onPressed: onTap,
tooltip: 'Show Overlay',
child: const Icon(Icons.zoom_out_map),
),
overlayChild: const Material(
type: MaterialType.transparency,
child: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation(Colors.black),
),
),
),
), // 这个尾随逗号使自动格式化更好看
);
}
}
希望这篇文章能帮助你更好地理解和使用 overlay_builder
插件。如果你有任何问题或建议,请随时留言!
更多关于Flutter浮动层构建插件overlay_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter浮动层构建插件overlay_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用overlay_builder
插件来构建浮动层的代码示例。overlay_builder
插件使得在Flutter应用中创建和管理Overlay(覆盖层)变得更加简单和直观。
首先,你需要在你的pubspec.yaml
文件中添加overlay_builder
依赖:
dependencies:
flutter:
sdk: flutter
overlay_builder: ^0.9.6 # 请确保使用最新版本
然后运行flutter pub get
来安装依赖。
接下来,让我们看一个具体的代码示例:
import 'package:flutter/material.dart';
import 'package:overlay_builder/overlay_builder.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Overlay Builder Example'),
),
body: Center(
child: Builder(
builder: (context) {
return ElevatedButton(
onPressed: () {
// 显示浮动层
showOverlay(
context: context,
builder: (context) {
return OverlayBuilder(
builder: (context, overlayState) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('This is an overlay!'),
ElevatedButton(
onPressed: () {
// 关闭浮动层
overlayState.remove();
},
child: Text('Close'),
),
],
);
},
);
},
);
},
child: Text('Show Overlay'),
);
},
),
),
),
);
}
}
// showOverlay是一个封装函数,用于简化Overlay的显示逻辑
void showOverlay({
required BuildContext context,
required WidgetBuilder builder,
}) {
final OverlayState overlayState = Overlay.of(context);
final OverlayEntry overlayEntry = OverlayEntry(
builder: builder,
);
overlayEntry.add();
// 可选:添加动画效果
overlayEntry.markNeedsBuild();
}
代码说明:
-
依赖导入: 导入
flutter
和overlay_builder
包。 -
MyApp
类:- 使用
MaterialApp
和Scaffold
来构建主应用结构。 - 在
Scaffold
的body
中,使用Center
和ElevatedButton
来创建一个按钮,点击该按钮会显示浮动层。
- 使用
-
Builder
小部件:- 使用
Builder
小部件来获取一个可以在onPressed
回调中使用的BuildContext
。
- 使用
-
showOverlay
函数:- 这是一个封装函数,用于简化
Overlay
的显示逻辑。它接受一个context
和一个builder
函数。 Overlay.of(context)
用于获取当前Overlay
状态。- 创建一个
OverlayEntry
,并将其添加到Overlay
中。
- 这是一个封装函数,用于简化
-
OverlayBuilder
:- 在
OverlayEntry
的builder
函数中,使用OverlayBuilder
来构建浮动层内容。 OverlayBuilder
的builder
函数接受一个OverlayState
,可以用来控制浮动层的显示和隐藏。
- 在
-
关闭浮动层:
- 在浮动层中添加一个关闭按钮,点击按钮时调用
overlayState.remove()
来移除浮动层。
- 在浮动层中添加一个关闭按钮,点击按钮时调用
这个示例展示了如何使用overlay_builder
插件来创建一个简单的浮动层,并在需要时显示和隐藏它。你可以根据需要进一步自定义和扩展这个示例。