Flutter浮动层构建插件overlay_builder的使用

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

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 条目中设置了 maintainStatetrue 的 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 用于在 typeOverlayType.positioned 时,基于其子 widget 的约束对齐 overlayChild。默认为 OverlayAlignment.bottomCenter false
verticalSpacing 用于在 typeOverlayType.positioned 时,垂直方向上为 overlayChild 添加内边距。默认为 0.0,可以为负值。 false
horizontalSpacing 用于在 typeOverlayType.positioned 时,水平方向上为 overlayChild 添加内边距。默认为 0.0,可以为负值。 false

OverlayAlignment

OverlayAlignmentOverlayBuilder 一起使用,用于在 typeOverlayType.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

OverlayWidgetStateGlobalKey 一起使用,用于获取当前 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

为了进行一些代码优化,OverlayWidgetOverlayFullscreen 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

1 回复

更多关于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();
}

代码说明:

  1. 依赖导入: 导入flutteroverlay_builder包。

  2. MyApp

    • 使用MaterialAppScaffold来构建主应用结构。
    • Scaffoldbody中,使用CenterElevatedButton来创建一个按钮,点击该按钮会显示浮动层。
  3. Builder小部件

    • 使用Builder小部件来获取一个可以在onPressed回调中使用的BuildContext
  4. showOverlay函数

    • 这是一个封装函数,用于简化Overlay的显示逻辑。它接受一个context和一个builder函数。
    • Overlay.of(context)用于获取当前Overlay状态。
    • 创建一个OverlayEntry,并将其添加到Overlay中。
  5. OverlayBuilder

    • OverlayEntrybuilder函数中,使用OverlayBuilder来构建浮动层内容。
    • OverlayBuilderbuilder函数接受一个OverlayState,可以用来控制浮动层的显示和隐藏。
  6. 关闭浮动层

    • 在浮动层中添加一个关闭按钮,点击按钮时调用overlayState.remove()来移除浮动层。

这个示例展示了如何使用overlay_builder插件来创建一个简单的浮动层,并在需要时显示和隐藏它。你可以根据需要进一步自定义和扩展这个示例。

回到顶部