Flutter异步加载插件df_async_loader的使用

Flutter异步加载插件df_async_loader的使用

df_async_loader 是一个 Flutter 包,它提供了一个静态方法,用于在执行异步任务时显示加载对话框。它通过提供内置的用户反馈来简化处理异步任务的方式,帮助你在应用程序中无缝管理加载状态。

特性

  • 异步任务执行:运行任何异步函数,并在任务执行期间自动显示加载对话框。
  • 简单集成:轻松实现到你的 Flutter 项目中,确保在长时间运行的操作期间提供流畅的用户体验。
  • 可自定义回调:使用提供的回调在异步任务完成后触发操作。

示例

基础示例

DfAsyncLoader.showLoader<String>(
  context: context,
  callback: () async {
    // 模拟延迟并返回字符串结果。
    await Future.delayed(const Duration(seconds: 2));
    return "RESULT!";
  },
  onFinished: (res) {
    // 当任务完成时,显示包含结果的消息。
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text("CALLED STRING FUNCTION result = $res")),
    );
  },
);

自定义加载小部件示例

DfAsyncLoader.showLoader<EgObject>(
  context: context,
  customBody: const SizedBox(
    height: 12,
    child: LinearProgressIndicator(),
  ),
  callback: () async {
    // 模拟延迟并返回自定义对象。
    await Future.delayed(const Duration(seconds: 2));
    return const EgObject(
      value1: "Value 1",
      value2: false,
    );
  },
  onFinished: (res) {
    // 当任务完成时,显示包含对象值的消息。
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(
          "CALLED OBJECT FUNCTION values = ${res.value1} & ${res.value2}",
        ),
      ),
    );
  },
);

安装

在你的 pubspec.yaml 文件中添加 df_async_loader

dependencies:
  df_async_loader: ^1.0.0

然后运行:

flutter pub get

使用

调用 DfAsyncLoader.showLoader<T>() 方法,传入你的 context,异步 callback 以及 onFinished 函数以处理任务完成后的结果。

完整示例代码

import 'package:flutter/material.dart';

import '/eg_object.dart';
import 'package:df_async_loader/df_async_loader.dart';

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

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

  /// 示例方法,模拟等待一个 `void` 函数完成的同时显示加载对话框。
  ///
  /// 一旦操作完成,会显示一条消息。
  void _waitForVoidFunction(BuildContext context) {
    DfAsyncLoader.showLoader<void>(
      context: context,
      callback: () async {
        // 模拟延迟以模仿异步任务。
        await Future.delayed(const Duration(seconds: 2));
      },
      onFinished: (_) {
        // 当任务完成时,显示一条消息。
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text("CALLED VOID FUNCTION")),
        );
      },
    );
  }

  /// 示例方法,模拟等待一个 `int` 函数完成的同时显示加载对话框。
  ///
  /// 一旦操作完成,会显示一条包含结果的消息。
  void _waitForIntFunction(BuildContext context) {
    DfAsyncLoader.showLoader<int>(
      context: context,
      callback: () async {
        // 模拟延迟并返回整数结果。
        await Future.delayed(const Duration(seconds: 2));
        return 5;
      },
      onFinished: (res) {
        // 当任务完成时,显示一条包含结果的消息。
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("CALLED INT FUNCTION result = $res")),
        );
      },
    );
  }

  /// 示例方法,模拟等待一个 `String` 函数完成的同时显示加载对话框。
  ///
  /// 一旦操作完成,会显示一条包含结果的消息。
  void _waitForStringFunction(BuildContext context) {
    DfAsyncLoader.showLoader<String>(
      context: context,
      callback: () async {
        // 模拟延迟并返回字符串结果。
        await Future.delayed(const Duration(seconds: 2));
        return "RESULT!";
      },
      onFinished: (res) {
        // 当任务完成时,显示一条包含结果的消息。
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("CALLED STRING FUNCTION result = $res")),
        );
      },
    );
  }

  /// 示例方法,模拟等待一个 `EgObject` 完成的同时显示自定义加载对话框。
  ///
  /// 一旦操作完成,会显示一条包含对象值的消息。
  void _waitForObjectFunction(BuildContext context) {
    DfAsyncLoader.showLoader<EgObject>(
      context: context,
      customBody: const SizedBox(
        height: 12,
        child: LinearProgressIndicator(),
      ),
      callback: () async {
        // 模拟延迟并返回自定义对象。
        await Future.delayed(const Duration(seconds: 2));
        return const EgObject(
          value1: "Value 1",
          value2: false,
        );
      },
      onFinished: (res) {
        // 当任务完成时,显示一条包含对象值的消息。
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(
              "CALLED OBJECT FUNCTION values = ${res.value1} & ${res.value2}",
            ),
          ),
        );
      },
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: MaterialApp(
        builder: (ctx, __) => Scaffold(
          body: SizedBox(
            width: double.infinity,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: () {
                    _waitForVoidFunction(ctx);
                  },
                  child: const Text("调用 Void 函数"),
                ),
                const SizedBox(
                  height: 8,
                ),
                ElevatedButton(
                  onPressed: () {
                    _waitForIntFunction(ctx);
                  },
                  child: const Text("调用 Int 函数"),
                ),
                const SizedBox(
                  height: 8,
                ),
                ElevatedButton(
                  onPressed: () {
                    _waitForStringFunction(ctx);
                  },
                  child: const Text("调用 String 函数"),
                ),
                const SizedBox(
                  height: 8,
                ),
                ElevatedButton(
                  onPressed: () {
                    _waitForObjectFunction(ctx);
                  },
                  child: const Text("调用 Object 函数(带自定义加载)"),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter异步加载插件df_async_loader的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,下面是一个关于如何在Flutter中使用df_async_loader插件进行异步加载的示例代码。df_async_loader插件通常用于按需加载插件或模块,以提高应用的启动速度和性能。

首先,确保你的pubspec.yaml文件中已经添加了df_async_loader依赖:

dependencies:
  flutter:
    sdk: flutter
  df_async_loader: ^最新版本号 # 替换为当前最新版本号

然后运行flutter pub get来获取依赖。

接下来,我们编写一个示例来展示如何使用df_async_loader进行异步加载。

1. 创建一个异步加载的插件或服务

假设我们有一个简单的插件,它返回一个字符串。首先,我们创建一个模拟插件的类:

// my_plugin.dart
class MyPlugin {
  Future<String> getMessage() async {
    // 模拟一个异步操作,比如网络请求或文件读取
    await Future.delayed(Duration(seconds: 2));
    return 'Hello from MyPlugin!';
  }
}

2. 使用df_async_loader进行异步加载

接下来,我们使用df_async_loader来异步加载这个插件。

// main.dart
import 'package:flutter/material.dart';
import 'package:df_async_loader/df_async_loader.dart';
import 'my_plugin.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('df_async_loader Example'),
        ),
        body: Center(
          child: AsyncLoaderWidget(),
        ),
      ),
    );
  }
}

class AsyncLoaderWidget extends StatefulWidget {
  @override
  _AsyncLoaderWidgetState createState() => _AsyncLoaderWidgetState();
}

class _AsyncLoaderWidgetState extends State<AsyncLoaderWidget> {
  late AsyncValue<MyPlugin> _pluginAsyncValue;

  @override
  void initState() {
    super.initState();
    // 使用df_async_loader进行异步加载
    _pluginAsyncValue = AsyncValue.loading<MyPlugin>();
    loadMyPlugin();
  }

  Future<void> loadMyPlugin() async {
    // 模拟异步加载插件
    final plugin = MyPlugin();
    // 更新状态为加载完成
    setState(() {
      _pluginAsyncValue = AsyncValue.data(plugin);
    });
  }

  @override
  Widget build(BuildContext context) {
    return AsyncValueBuilder<MyPlugin>(
      asyncValue: _pluginAsyncValue,
      builder: (context, asyncSnapshot) {
        if (asyncSnapshot.hasError) {
          // 处理加载错误
          return Text('Error: ${asyncSnapshot.error}');
        } else if (asyncSnapshot.isData) {
          // 插件加载完成,使用插件
          return FutureBuilder<String>(
            future: asyncSnapshot.data!.getMessage(),
            builder: (context, snapshot) {
              if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else {
                return Text('Plugin Message: ${snapshot.data!}');
              }
            },
          );
        } else {
          // 正在加载中
          return CircularProgressIndicator();
        }
      },
    );
  }
}

解释

  1. MyPlugin: 模拟了一个简单的插件,它有一个异步方法getMessage
  2. AsyncLoaderWidget: 使用df_async_loaderAsyncValueAsyncValueBuilder来管理异步加载状态。
  3. initState: 在组件初始化时,开始加载插件,并将加载状态设置为AsyncValue.loading
  4. loadMyPlugin: 模拟异步加载插件,并在加载完成后更新状态为AsyncValue.data
  5. build: 使用AsyncValueBuilder来构建UI,根据加载状态显示不同的内容(加载中、加载完成、加载错误)。

这个示例展示了如何使用df_async_loader插件来管理异步加载状态,并在UI中显示相应的内容。你可以根据自己的需求进行扩展和修改。

回到顶部