Flutter加载状态管理插件loading_state_handler的使用

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

Flutter加载状态管理插件loading_state_handler的使用

loading_state_handler 是一个强大的Flutter插件,用于管理UI状态,并内置了重试功能。这个插件优雅地处理了加载、错误、空数据和正常状态,并提供了可定制的重试机制和冷却支持。

特性

  • 🔄 智能状态管理(加载、错误、空数据、正常)
  • ⏲️ 内置重试机制与可配置冷却时间
  • 🎨 为每种状态完全自定义的部件
  • 🌐 全局默认配置
  • ⚡ 使用常量构造函数优化性能
  • 🎯 类型安全回调和构建器

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  loading_state_handler: ^1.3.3

快速开始

设置全局默认值(可选)

LoadingStateHandlerWidget.setDefaults(
  defaultRetryCooldown: const Duration(seconds: 5),
  defaultLoadingBuilder: (context, loadingMessage) =>
        const Center(child: CircularProgressIndicator()),
);

在你的组件中使用

LoadingStateHandlerWidget(
  currentState: CurrentStateEnum.error,
  errorMessage: 'Failed to load data',
  enableRetry: true,
  retryCooldown: const Duration(seconds: 3),
  onRetry: () => fetchData(),
  child: YourWidget(),
);

高级用法

重试机制

包含复杂的重试机制和冷却时间:

LoadingStateHandlerWidget(
  currentState: CurrentStateEnum.error,
  errorMessage: 'Network error occurred',
  enableRetry: true,
  retryCooldown: const Duration(seconds: 3),
  onRetry: () async {
    await refetchData();
  },
  child: ContentWidget(),
);

全局配置

设置所有实例的默认行为:

LoadingStateHandlerWidget.setDefaults(
  defaultRetryCooldown: const Duration(seconds: 5),
  defaultLoadingBuilder: (context, message) => CustomLoadingWidget(),
  defaultErrorBuilder: (context, message) => CustomErrorWidget(),
  defaultEmptyBuilder: (context, message) => CustomEmptyWidget(),
);

状态特定的回调

通过自定义回调处理不同状态:

LoadingStateHandlerWidget(
  loading: isLoading,
  error: hasError,
  empty: isEmpty,
  onLoading: (defaultCallback, context, message) {
    // 自定义加载行为
  },
  onError: (defaultCallback, context, message) {
    // 自定义错误处理
  },
  onEmpty: (defaultCallback, context, message) {
    // 自定义空状态处理
  },
  child: ContentWidget(),
);

禁用状态更改

细粒度控制小部件的行为:

LoadingStateHandlerWidget(
  disableWidgetChanges: false,
  disableErrorWidgetChanges: true,
  disableEmptyWidgetChanges: false,
  // ...其他属性
);

示例代码

以下是一个完整的示例应用,展示了如何使用 loading_state_handler 插件:

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

void main() {
  LoadingStateHandlerWidget.setDefaults(
    defaultOnData: (context, message) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(message ?? 'Default Got Data...')),
      );
    },
    defaultOnLoading: (context, message) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(message ?? 'Default Loading...')),
      );
    },
    defaultLoadingBuilder: (context, loadingMessage) =>
        const Center(child: CircularProgressIndicator()),
    defaultErrorBuilder: (context, errorMessage, retryWidget, retryCooldown, onRetry) => Center(
      child: Text('Custom Error: $errorMessage', style: const TextStyle(color: Colors.red)),
    ),
    defaultEmptyBuilder: (context, emptyMessage) => const Center(
      child: Text('No Data Available'),
    ),
  );

  runApp(const MyApp());
}

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

  @override
  HomeScreenState createState() => HomeScreenState();
}

class HomeScreenState extends State<HomeScreen> {
  bool empty = false;
  bool error = false;
  String? errorMessage;
  bool loading = true;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Loading State Handler Example')),
      body: LoadingStateHandlerWidget(
        loading: loading,
        onLoading: (defaultOnLoading, context, message) {
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text(message ?? 'Custom Loading...')),
          );
        },
        onData: (defaultOnData, context, message) {
          defaultOnData?.call(context, message);
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text(message ?? 'Custom Got Data...')),
          );
        },
        error: error,
        errorMessage: errorMessage,
        empty: empty,
        child: const Center(child: Text('Data Loaded Successfully!')),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    Future.delayed(const Duration(seconds: 2), () {
      setState(() {
        loading = false;
        // Uncomment to simulate an error
        // error = true;
        // errorMessage = "Failed to load data";
        // Uncomment to simulate an empty state
        // empty = true;
      });
    });
  }
}

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomeScreen(),
    );
  }
}

以上是 loading_state_handler 插件的基本介绍和使用示例,希望对您有所帮助!如果您需要进一步了解或贡献,请查看其GitHub仓库


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

1 回复

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


当然,以下是如何在Flutter应用中使用loading_state_handler插件进行加载状态管理的示例代码。这个插件允许你更方便地管理加载状态,比如在数据加载时显示加载指示器。

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

dependencies:
  flutter:
    sdk: flutter
  loading_state_handler: ^最新版本号  # 请替换为实际最新版本号

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

接下来,是一个简单的示例,展示如何使用loading_state_handler插件来管理加载状态:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with LoadingStateMixin<String> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Loading State Handler Example'),
      ),
      body: Center(
        child: LoadingStateBuilder<String>(
          state: loadingState,
          builder: (context, data, child) {
            if (loadingState.isLoading) {
              return CircularProgressIndicator();
            } else if (loadingState.hasError) {
              return Text('Error: ${loadingState.error}');
            } else {
              return Text('Data: $data');
            }
          },
          emptyWidget: Text('No Data'),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          setState(() {
            loadingState.setLoading();
          });
          
          try {
            // Simulate a network request or any asynchronous operation
            await Future.delayed(Duration(seconds: 2));
            String result = "Fetched Data";
            setState(() {
              loadingState.setSuccess(result);
            });
          } catch (e) {
            setState(() {
              loadingState.setError(e.toString());
            });
          }
        },
        tooltip: 'Fetch Data',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释:

  1. 依赖导入

    • 导入flutter/material.dart用于构建UI。
    • 导入loading_state_handler/loading_state_handler.dart来使用加载状态管理功能。
  2. 主应用

    • MyApp是一个简单的Material应用,包含主题和主页。
  3. 主页

    • MyHomePage是一个有状态的小部件,它使用LoadingStateMixin<String>来管理加载状态。泛型String表示加载成功时的数据类型。
  4. 构建UI

    • 使用LoadingStateBuilder来根据加载状态显示不同的内容。
      • 如果isLoading为真,显示CircularProgressIndicator
      • 如果hasError为真,显示错误信息。
      • 否则,显示加载的数据。
    • emptyWidget属性用于在没有数据时显示的内容。
  5. 浮动操作按钮

    • 点击按钮时,设置加载状态为isLoading,然后模拟一个异步操作(例如网络请求)。
    • 异步操作成功后,设置加载状态为setSuccess并传递数据。
    • 如果捕获到异常,设置加载状态为setError并传递错误信息。

通过这种方式,你可以非常方便地在Flutter应用中管理加载状态,提高用户体验。

回到顶部