Flutter覆盖层显示插件overlay_on_widget的使用

Flutter覆盖层显示插件overlay_on_widget的使用

Overlay On Widget

pub package License: MIT

一个用于轻松在其他部件上添加覆盖层部件的Flutter包。

Overlay On Widget Overlay On Widget

特性

  • 轻松地将部件叠加到其他部件上。
  • 支持自定义定位和覆盖部件的尺寸。
  • 适合创建工具提示、弹出框或任何覆盖层UI元素。
  • 提供简单方便的API来添加和管理覆盖层。

安装

  1. 在你的 pubspec.yaml 文件中添加此依赖:

    dependencies:
      overlay_on_widget: ^0.0.5 # 使用 pub.dev 上的最新版本
    
  2. 运行以下命令安装包:

    flutter pub get
    
  3. 在你的代码中导入包:

    import 'package:overlay_on_widget/overlay_on_widget.dart';
    
  4. 添加包:

    dart pub add overlay_on_widget
    

使用

叠加部件

要将一个部件叠加到另一个部件上,可以使用 OverlayOnWidget 小部件。

示例

Container(
  decoration: ShapeDecoration(
  color: Colors.blue,
  shape: OverlayOnWidget(
    CutoutScreenArea(
      borderColor: Colors.red,
      borderWidth: 3.0,
      overlayColor: Color.fromRGBO(0, 0, 0, 80),
      borderRadius: 10.0,
      borderLength: 40.0,
      cutOutWidth: 150.0,
      cutOutHeight: 150.0,
      ),
    ),
  ),
),

示例代码

import 'package:flutter/material.dart';

import 'cutoutscreen.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Stack(
            alignment: Alignment.center,
            children: [
              Image.network(
                'https://images.pexels.com/photos/2739666/pexels-photo-2739666.jpeg?cs=srgb&dl=pexels-tom-fisk-2739666.jpg&fm=jpg',
                fit: BoxFit.cover,
              ),
              Positioned.fill(
                child: Container(
                  decoration: ShapeDecoration(
                    color: Colors.blue,
                    shape: OverlayOnWidget(
                      CutoutScreenArea(
                        borderColor: Colors.red,
                        borderWidth: 3.0,
                        overlayColor: Color.fromRGBO(0, 0, 0, 80),
                        borderRadius: 10.0,
                        borderLength: 40.0,
                        cutOutWidth: 150.0,
                        cutOutHeight: 150.0,
                      ),
                    ),
                  ),
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


overlay_on_widget 是一个 Flutter 插件,用于在特定 widget 上方显示一个覆盖层。这种覆盖层通常用于显示提示、引导、或者临时内容,而不影响底层 widget 的布局和功能。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 overlay_on_widget 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  overlay_on_widget: ^1.0.0  # 请使用最新版本

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

基本用法

  1. 导入包

    import 'package:overlay_on_widget/overlay_on_widget.dart';
    
  2. 创建 Overlay

    你可以使用 OverlayOnWidget widget 来包裹你希望在其上方显示覆盖层的 widget。然后在 overlay 属性中定义覆盖层的内容。

    OverlayOnWidget(
      child: YourWidget(),  // 这是你希望覆盖的 widget
      overlay: Container(
        color: Colors.black.withOpacity(0.5),
        child: Center(
          child: Text(
            'This is an overlay',
            style: TextStyle(color: Colors.white, fontSize: 20),
          ),
        ),
      ),
    )
    
  3. 控制覆盖层的显示

    你可以通过 OverlayOnWidgetController 来控制覆盖层的显示和隐藏。

    OverlayOnWidgetController _controller = OverlayOnWidgetController();
    
    OverlayOnWidget(
      controller: _controller,
      child: YourWidget(),
      overlay: Container(
        color: Colors.black.withOpacity(0.5),
        child: Center(
          child: Text(
            'This is an overlay',
            style: TextStyle(color: Colors.white, fontSize: 20),
          ),
        ),
      ),
    )
    
    // 显示覆盖层
    _controller.show();
    
    // 隐藏覆盖层
    _controller.hide();
    
  4. 动态更新覆盖层内容

    你可以在 overlay 中使用 StatefulBuilder 或者 StreamBuilder 来动态更新覆盖层的内容。

    OverlayOnWidget(
      child: YourWidget(),
      overlay: StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return Container(
            color: Colors.black.withOpacity(0.5),
            child: Center(
              child: ElevatedButton(
                onPressed: () {
                  setState(() {
                    // 更新状态
                  });
                },
                child: Text('Update Overlay'),
              ),
            ),
          );
        },
      ),
    )
    

注意事项

  • 覆盖层的位置:覆盖层默认会覆盖在 child widget 的上方,并且会根据 child widget 的大小和位置进行调整。
  • 性能:由于覆盖层是动态添加的,频繁的显示和隐藏可能会影响性能,特别是在复杂的 UI 中。确保在不必要时隐藏覆盖层。
  • 动画和过渡效果:你可以通过自定义 overlay 的内容来添加动画或过渡效果。

示例代码

以下是一个完整的示例代码,展示如何使用 overlay_on_widget 插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('OverlayOnWidget Example')),
        body: HomePage(),
      ),
    );
  }
}

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  OverlayOnWidgetController _controller = OverlayOnWidgetController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          OverlayOnWidget(
            controller: _controller,
            child: ElevatedButton(
              onPressed: () {
                _controller.show();
              },
              child: Text('Show Overlay'),
            ),
            overlay: Container(
              color: Colors.black.withOpacity(0.5),
              child: Center(
                child: Text(
                  'This is an overlay',
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              _controller.hide();
            },
            child: Text('Hide Overlay'),
          ),
        ],
      ),
    );
  }
}
回到顶部