Flutter快速覆盖层插件lightning_overlay的使用

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

Flutter快速覆盖层插件lightning_overlay的使用

Lightning Overlay

Lightning Overlay 是一个用于任何 Widget 的快速覆盖层插件。它可以在你的任意 Widget 上创建一个漂亮的覆盖效果。

Lightning Overlay 示例

注意事项

  • 如果你希望使用自动启动功能,需要设置 delayDuration。同时还需要设置 pauseDuration 来控制反向动画。如果反向动画没有开始,你需要增加 pauseDuration
  • 如果你希望使用重复模式,需要设置较高的 pauseRepeatDelay(默认为 2 秒),因为当动画完成时,pauseRepeatDelay 将被触发并重新播放动画。

模式

它支持以下几种模式:

  1. 自动启动延迟
  2. 受控于 Lightning 控制器
  3. 手势控制
  4. 重复模式

同时,它还支持以下方向:

  1. 左上角到右下角
  2. 右下角到左上角

API

以下是 Lightning Overlay 的 API 说明表:

属性 描述 必填 可选
maxValue 根据子 Widget 的大小选择较大的数字。例如,宽度为 200,高度为 300 时,选择 300。
child 传递你的子 Widget。
delayDuration 当传递 delayDuration 时,动画将在延迟后自动启动。
useGesture 决定用户是否可以通过点击来启动动画,当点击结束时动画完成。
borderRadius 如果子 Widget 使用了圆角边框,请将半径传递给 Lightning Widget 以在动画期间隐藏边缘。
controller 触发动画(例如,当点击按钮时)。
overlayColor 设置覆盖层的颜色。
pauseDuration 在点击或触发动画时,可以设置暂停时间,从完全覆盖子 Widget 到开始揭示子 Widget 的时间。
durationIn 覆盖动画的持续时间。
durationOut 揭示动画的持续时间。
curveIn 覆盖动画的曲线。
curveOut 揭示动画的曲线。
direction 动画的方向,从左上到右下或反之。

控制器

创建一个控制器并传递给 Lightning Widget:

LightningController controller = LightningController();

注意:由于 animateIn 需要完成覆盖动画,所以在调用 animateOut 之前需要等待。

函数 描述
animateIn 触发覆盖动画
animateOut 触发揭示动画

示例代码

下面是完整的示例代码:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const LightningCard(),
    );
  }
}

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

  [@override](/user/override)
  LightningCardState createState() => LightningCardState();
}

class LightningCardState extends State<LightningCard> {
  LightningController controller = LightningController();

  void animate() async {
    controller.animateIn();
    await Future.delayed(const Duration(milliseconds: 500));
    controller.animateOut();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Center(
            child: Lightning(
              useGesture: false,
              maxValue: 600,
              borderRadius: 15,
              repeat: true,
              delayDuration: const Duration(milliseconds: 300),
              controller: controller,
              direction: LightningDirection.leftToRight,
              pauseDuration: const Duration(milliseconds: 200),
              durationIn: const Duration(milliseconds: 300),
              durationOut: const Duration(milliseconds: 450),
              overlayColor: Colors.white.withOpacity(0.1),
              child: Container(
                height: 300,
                width: 300,
                padding: const EdgeInsets.all(20),
                decoration: BoxDecoration(
                  color: Colors.blue,
                  borderRadius: BorderRadius.circular(15),
                ),
                child: Center(
                  child: Image.network(
                    "https://storage.googleapis.com/cms-storage-bucket/0dbfcc7a59cd1cf16282.png",
                    width: 200,
                  ),
                ),
              ),
            ),
          ),
          const SizedBox(
            height: 100,
          ),
          GestureDetector(
            onTap: () => animate(),
            child: Container(
              height: 70,
              width: 200,
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(10),
                color: Colors.blue,
              ),
              child: const Center(
                child: Text(
                  "Animate",
                  style: TextStyle(
                    color: Colors.white,
                    fontWeight: FontWeight.w700,
                    fontSize: 20,
                  ),
                ),
              ),
            ),
          )
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 lightning_overlay 插件在 Flutter 中实现快速覆盖层的示例代码。lightning_overlay 是一个用于在 Flutter 应用中快速显示覆盖层的插件,非常适合用于显示加载指示器、对话框或自定义覆盖视图。

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

dependencies:
  flutter:
    sdk: flutter
  lightning_overlay: ^最新版本号  # 请替换为实际的最新版本号

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

接下来是一个完整的示例代码,展示如何使用 lightning_overlay 来显示一个简单的加载指示器覆盖层:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Lightning Overlay Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 显示加载指示器覆盖层
              LightningOverlay.show(
                context,
                widget: Center(
                  child: CircularProgressIndicator(),
                ),
              );

              // 模拟异步操作,例如网络请求
              Future.delayed(Duration(seconds: 2), () {
                // 隐藏覆盖层
                LightningOverlay.hide(context);
              });
            },
            child: Text('Show Overlay'),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的 Flutter 应用,其中包含一个按钮。当按钮被点击时,将显示一个带有 CircularProgressIndicator 的加载指示器覆盖层。我们使用 Future.delayed 来模拟一个异步操作(例如网络请求),然后在 2 秒后隐藏覆盖层。

自定义覆盖层

你也可以自定义覆盖层的内容。例如,显示一个带有文本的消息对话框:

void _showMessageDialog() {
  LightningOverlay.show(
    context,
    widget: AlertDialog(
      title: Text('Info'),
      content: Text('This is a custom message dialog.'),
      actions: <Widget>[
        TextButton(
          onPressed: () {
            LightningOverlay.hide(context);
          },
          child: Text('OK'),
        ),
      ],
    ),
    // 设置点击背景时是否隐藏覆盖层,默认为 true
    dismissOnTap: true,
    // 设置覆盖层的背景颜色,默认为半透明的黑色
    backgroundColor: Colors.black54,
  );
}

你可以在按钮的 onPressed 回调中调用 _showMessageDialog 方法来显示这个自定义对话框:

ElevatedButton(
  onPressed: _showMessageDialog,
  child: Text('Show Message Dialog'),
),

通过这些示例代码,你可以快速了解如何在 Flutter 应用中使用 lightning_overlay 插件来实现覆盖层功能。根据你的需求,你可以进一步自定义覆盖层的内容和样式。

回到顶部