Flutter加载覆盖层插件flutter_loading_overlay的使用

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

Flutter加载覆盖层插件flutter_loading_overlay的使用

pub package

FlutterLoadingOverlay 提供了一种简单且灵活的方式来管理 Flutter 应用中的加载覆盖层。无需繁琐的上下文传递或重复代码!通过全局获取器,您可以轻松地使用 startLoadingstopLoading 开始和停止加载覆盖层,无需添加括号。此外,您还可以轻松自定义覆盖层的外观。

✨ 特性

  • 全局访问:使用 startLoadingstopLoading 全局访问,无需调用它们为方法。
  • 无需上下文:无需传递 BuildContext;该包会为您处理。
  • 可定制覆盖层:更改覆盖层的不透明度、颜色,甚至可以传递一个自定义小部件以完全控制其外观。
  • 手势支持:轻松添加自己的 GestureDetector 或使用默认的加载动画,无需麻烦。
  • 最小化设置:使用单行代码即可启动和停止加载覆盖层。

💡 安装

在您的 pubspec.yaml 文件中包含以下内容以将此包添加到项目中:

dependencies:
  flutter_loading_overlay: ^latest

然后运行:

flutter pub get

🎉 快速开始

忘记手动管理上下文或复杂的加载动画。使用 FlutterLoadingOverlay,只需调用 startLoadingstopLoading —— 不需要添加括号!

1. 基本示例

这是使用 FlutterLoadingOverlay 的最简单方式。触发时,它会自动显示一个简单的非交互式加载动画。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

    // 初始化覆盖层并设置默认值
    FlutterLoadingOverlay().init(navigatorKey: navigatorKey);

    return MaterialApp(
      navigatorKey: navigatorKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('加载覆盖层示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 调用 startLoading,无需括号
              startLoading;
              
              Future.delayed(const Duration(seconds: 2), () {
                // 调用 stopLoading,无需括号
                stopLoading;
              });
            },
            child: const Text('显示加载覆盖层'),
          ),
        ),
      ),
    );
  }
}

2. 自定义不透明度和覆盖层颜色

您可以自定义覆盖层背景的不透明度和颜色,以适应您的应用主题。以下是实现方法:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

    // 使用自定义不透明度和颜色初始化
    FlutterLoadingOverlay().init(
      navigatorKey: navigatorKey,
      opacity: 0.8, // 自定义不透明度
      overlayColor: Colors.blue.withOpacity(0.5), // 自定义覆盖层颜色
    );

    return MaterialApp(
      navigatorKey: navigatorKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('自定义加载覆盖层示例'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 调用 startLoading,无需括号
              startLoading;
              
              Future.delayed(const Duration(seconds: 2), () {
                // 调用 stopLoading,无需括号
                stopLoading;
              });
            },
            child: const Text('显示自定义加载覆盖层'),
          ),
        ),
      ),
    );
  }
}

3. 高级示例(带有 GestureDetector)

对于更高级的用例,FlutterLoadingOverlay 允许您传递一个自定义小部件,如 GestureDetector,并处理各种手势,例如点击、双击或长按。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

    // 使用自定义 GestureDetector 小部件初始化
    FlutterLoadingOverlay().init(
      navigatorKey: navigatorKey,
      customChild: GestureDetector(
        onTap: () => print('覆盖层被点击!'),
        onDoubleTap: () => print('覆盖层被双击!'),
        onLongPress: () => print('覆盖层被长按!'),
        child: const CircularProgressIndicator(),
      ),
    );

    return MaterialApp(
      navigatorKey: navigatorKey,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('带有手势检测器的加载覆盖层'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              startLoading; // 启动覆盖层
              Future.delayed(const Duration(seconds: 2), () {
                stopLoading; // 停止覆盖层
              });
            },
            child: const Text('显示加载覆盖层'),
          ),
        ),
      ),
    );
  }
}

📚 API 参考

init 方法

void init({
  required GlobalKey<NavigatorState> navigatorKey,
  Widget? customChild,
  double opacity = 0.5,
  Color overlayColor = Colors.black,
})

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用flutter_loading_overlay插件的示例代码。这个插件允许你在应用上显示一个加载覆盖层,通常在执行耗时操作时非常有用。

首先,确保你的pubspec.yaml文件中包含flutter_loading_overlay依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_loading_overlay: ^0.6.0  # 请检查最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下方式使用flutter_loading_overlay

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoadingOverlayWidget(),
    );
  }
}

class LoadingOverlayWidget extends StatefulWidget {
  @override
  _LoadingOverlayWidgetState createState() => _LoadingOverlayWidgetState();
}

class _LoadingOverlayWidgetState extends State<LoadingOverlayWidget> {
  final LoadingOverlayController _loadingOverlayController = LoadingOverlayController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Loading Overlay Example'),
      ),
      body: LoadingOverlay(
        isLoading: _loadingOverlayController.isLoading,
        child: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 显示加载覆盖层
              _loadingOverlayController.show();

              // 模拟耗时操作
              await Future.delayed(Duration(seconds: 3));

              // 隐藏加载覆盖层
              _loadingOverlayController.hide();
            },
            child: Text('Show Loading Overlay'),
          ),
        ),
        overlay: CircularLoadingOverlay(
          // 自定义覆盖层样式
          color: Colors.black.withOpacity(0.5),
          progressIndicator: CircularProgressIndicator(
            valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
          ),
        ),
        controller: _loadingOverlayController,
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当点击按钮时,会显示一个加载覆盖层,并在3秒后隐藏。

代码解释

  1. 依赖项:确保pubspec.yaml中包含flutter_loading_overlay
  2. 控制器LoadingOverlayController用于控制加载覆盖层的显示和隐藏。
  3. LoadingOverlay Widget
    • isLoading:绑定到控制器的isLoading属性。
    • child:子部件,这里是一个按钮。
    • overlay:自定义的加载覆盖层样式,这里使用了CircularLoadingOverlay并设置了颜色和进度指示器。
    • controller:绑定到LoadingOverlayController
  4. 按钮点击事件
    • 调用_loadingOverlayController.show()显示加载覆盖层。
    • 使用Future.delayed模拟耗时操作。
    • 调用_loadingOverlayController.hide()隐藏加载覆盖层。

这个示例展示了如何使用flutter_loading_overlay插件在Flutter应用中添加加载覆盖层,并根据需要进行自定义。

回到顶部