Flutter异步工具插件flutter_async_utils的使用

Flutter异步工具插件flutter_async_utils的使用

flutter_async_utils 是一组用于简化与 StreamsFutures 工作的工具。查看运行示例:示例 (源码)

StreamSubscriberMixin

目前,它主要是一个从 flutter/plugins 中提取的 StreamSubscriberMixin 版本。

FutureTaskStateMixin

此混入类用于提供异步回调以显示进度并防止重复点击。

Work In Progress

该库正在积极开发中。你可以查看 AuthPass 这个应用,它大量使用了这些简单的类。例如,在 _SelectFileWidgetState 中的应用。

示例代码

import 'dart:async';

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

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

// 模拟一个异步任务
Future<void> _wait(int seconds) async {
  await Future<void>.delayed(Duration(seconds: seconds));
}

class _MyAppState extends State<MyApp> with FutureTaskStateMixin {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: SizedBox(
          width: double.infinity,
          child: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              const SizedBox(height: 160),
              const Text('示例应用 ;-)\n'),
              // 使用FutureTaskStateMixin来处理异步操作
              ElevatedButton(
                onPressed: asyncTaskCallback((progress) async {
                  await _wait(1);
                  progress.progressLabel = '正在做更多工作';
                  await _wait(2);
                  progress.progressLabel = '还在继续做更多。';
                  await _wait(3);
                }),
                child: const Text('点击我。'),
              ),
              // 显示任务状态
              ...?withTask((task) => [
                    const CircularProgressIndicator(),
                    Text(task.progressLabel ?? ''),
                  ]),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_async_utils插件的一些示例代码。flutter_async_utils插件提供了一些实用的工具来处理异步操作,特别是在管理多个异步任务时非常有用。

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

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

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

示例代码

1. 使用AsyncMemoizer来缓存异步结果

AsyncMemoizer允许你缓存一个异步函数的结果,这样当多次调用该函数时,只有在第一次调用时会执行异步操作,后续调用将直接返回缓存的结果。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AsyncMemoizer Example'),
        ),
        body: Center(
          child: FutureBuilder<String>(
            future: _fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return Text('Data: ${snapshot.data}');
              }
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // Simulate fetching data multiple times
            setState(() {});
          },
          tooltip: 'Fetch Data',
          child: Icon(Icons.refresh),
        ),
      ),
    );
  }

  final AsyncMemoizer<Future<String>> _memoizer = AsyncMemoizer<Future<String>>();

  Future<String> _fetchData() {
    return _memoizer.runOnce(() async {
      // Simulate a network request
      await Future.delayed(Duration(seconds: 2));
      return 'Fetched Data';
    });
  }
}

2. 使用AsyncCache来管理多个缓存的异步操作

AsyncCache允许你缓存多个不同的异步结果,并且可以根据键来检索这些结果。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AsyncCache Example'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FutureBuilder<String>(
              future: _fetchData('user1'),
              builder: (context, snapshot) {
                return Text('User1 Data: ${snapshot.data ?? 'Loading...'}');
              },
            ),
            SizedBox(height: 20),
            FutureBuilder<String>(
              future: _fetchData('user2'),
              builder: (context, snapshot) {
                return Text('User2 Data: ${snapshot.data ?? 'Loading...'}');
              },
            ),
          ],
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // Simulate fetching data multiple times
            setState(() {});
          },
          tooltip: 'Fetch Data',
          child: Icon(Icons.refresh),
        ),
      ),
    );
  }

  final AsyncCache<String, Future<String>> _cache = AsyncCache<String, Future<String>>();

  Future<String> _fetchData(String userId) {
    return _cache.get(userId, () async {
      // Simulate a network request based on userId
      await Future.delayed(Duration(seconds: 2));
      return 'Data for $userId';
    });
  }
}

以上示例展示了如何使用flutter_async_utils中的AsyncMemoizerAsyncCache来管理和缓存异步操作的结果。这在实际应用中可以显著提高性能,尤其是在处理网络请求或昂贵的计算任务时。

回到顶部