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

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 插件来实现覆盖层功能。根据你的需求,你可以进一步自定义覆盖层的内容和样式。

回到顶部