Flutter异步状态管理插件asyncstate的使用

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

Flutter异步状态管理插件asyncstate的使用

Async State 是一个用于Flutter应用的状态管理插件,旨在简化异步操作中的加载器和异常处理。以下是该插件的基本用法和示例代码。

基本用法

  1. 包裹你的MaterialAppCupertinoApp:使用AsyncStateBuilder来包裹你的应用程序。
  2. 获取并传递navigatorObserver:从AsyncStateBuilder的builder函数中获取navigatorObserver,并将其添加到你的组件的navigatorObservers列表中。
  3. 自定义加载器和异常处理器:你可以自定义默认加载器、启用或禁用日志、以及设置特定路由的异常处理器。

示例代码

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

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

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

  @override
  Widget build(BuildContext context) {
    return AsyncStateBuilder(
      customLoader: const GlobalLoading(), // 自定义全局加载器
      enableLog: true, // 启用日志
      exceptionHandlers: {
        '_': GlobalExceptionHandler(), // 全局异常处理器
        '/Home/Detail': DetailExceptionHandler(), // 特定路由的异常处理器
      },
      builder: (navigatorObserver) => MaterialApp(
        themeMode: ThemeMode.dark,
        theme: ThemeData.dark(),
        navigatorObservers: [navigatorObserver],
        initialRoute: '/Home',
        routes: {
          '/Home': (context) => const HomePage(),
          '/Home/Detail': (context) => const DetailPage(),
          '/Home/Detail/SecondDetail': (context) => const SecondDetailPage(),
        },
      ),
    );
  }
}

异步调用扩展方法

使用asyncState扩展方法可以在异步调用中自动管理加载器的打开和关闭:

Future<void> loginSuccess() async {
  final result = await _functionSuccess().asyncLoader();
  debugPrint('Login Success result: $result');
}

Future<void> loadMorePersonalized() async {
  await _functionFailure().asyncLoader(
    customLoader: HomeCustomLoaderSnackbar(),
    loaderType: LoaderType.snackBar,
  );
}

控制加载器

可以使用AsyncLoaderHandler来手动控制加载器的开启和关闭:

Future<void> loginSuccessHandler() async {
  final handler = AsyncLoaderHandler.start();
  final result = await _functionSuccess().asyncLoader();
  debugPrint('Login Success result: $result');
  handler.close();
}

// 在视图中使用
ElevatedButton(
  onPressed: () async {
    context.startAsyncStateLoader();
    await errorCall();
    context.closeAsyncStateLoader();
  },
  child: const Text('Loader Error by context'),
),

异常处理器

可以通过实现AsyncStateExceptionHandler接口来处理特定路由的异常:

class DetailExceptionHandler implements AsyncStateExceptionHandler {
  @override
  void onException(
    Object exception,
    StackTrace stackTrace,
    BuildContext context,
  ) {
    switch (exception.runtimeType) {
      case DetailException:
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(
              exception.toString(),
            ),
          ),
        );
      default:
        log(exception.toString());
        break;
    }
  }
}

在主函数中配置特定路由的异常处理器:

exceptionHandlers: {
  '_': GlobalExceptionHandler(),
  '/Home/Detail': DetailExceptionHandler(),
},

总结

通过使用Async State插件,开发者可以更轻松地管理Flutter应用中的异步操作,包括加载器和异常处理。更多详细信息和贡献指南,请访问GitHub项目页面

这个Markdown文档提供了关于如何使用Flutter异步状态管理插件`asyncstate`的详细说明和完整的示例代码。希望对你有所帮助!

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

1 回复

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


在Flutter开发中,管理异步状态是一个常见的需求,特别是在从网络获取数据或执行耗时操作时。async_state 是一个用于管理这些异步状态的插件,它提供了一种简洁且声明式的方式来处理异步操作的状态(如加载中、成功、失败等)。

以下是一个使用 async_state 插件的简单示例,展示了如何在 Flutter 应用中管理异步状态。

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

dependencies:
  flutter:
    sdk: flutter
  async_state: ^x.y.z  # 替换为最新版本号

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

接下来,我们编写一个示例应用,该应用从一个假设的 API 获取用户数据,并使用 async_state 来管理这个异步操作的状态。

import 'package:flutter/material.dart';
import 'package:async_state/async_state.dart';
import 'dart:async';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Async State Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: UserScreen(),
    );
  }
}

class UserScreen extends StatefulWidget {
  @override
  _UserScreenState createState() => _UserScreenState();
}

class _UserScreenState extends State<UserScreen> with AsyncStateMixin<User> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Async State Example'),
      ),
      body: AsyncStateBuilder<User>(
        state: asyncState,
        loadingBuilder: (context, state) {
          return Center(
            child: CircularProgressIndicator(),
          );
        },
        successBuilder: (context, state, user) {
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('User Name: ${user.name}'),
                Text('User Email: ${user.email}'),
              ],
            ),
          );
        },
        errorBuilder: (context, state, error) {
          return Center(
            child: Text('Error: $error'),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => loadUser(),
        tooltip: 'Load User',
        child: Icon(Icons.person),
      ),
    );
  }

  Future<void> loadUser() async {
    // 模拟一个异步操作,例如从API获取用户数据
    await Future.delayed(Duration(seconds: 2), () {
      // 这里可以替换为实际的API调用
      final user = User(name: 'John Doe', email: 'john.doe@example.com');
      setStateAsync(AsyncValue.data(user));
    }).onError((error, stackTrace) {
      setStateAsync(AsyncValue.error(error.toString()));
    });
  }
}

class User {
  final String name;
  final String email;

  User(this.name, this.email);
}

在这个示例中:

  1. 我们创建了一个 UserScreen 小部件,它扩展了 StatefulWidget 并混合了 AsyncStateMixin<User>
  2. build 方法中,我们使用 AsyncStateBuilder 来根据 asyncState 的当前状态构建不同的 UI。
    • loadingBuilder:当状态为加载中时显示一个进度指示器。
    • successBuilder:当状态为成功时显示用户信息。
    • errorBuilder:当状态为错误时显示错误信息。
  3. loadUser 方法模拟了一个异步操作,使用 Future.delayed 模拟网络延迟,并在 2 秒后通过 setStateAsync 更新 asyncState 的状态。

通过这种方式,async_state 插件帮助我们简化了异步状态管理的复杂性,并提供了清晰且可维护的代码结构。

回到顶部