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

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

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

这是一个针对网络请求的不同状态对应的UI页面封装,对某一个widget快速添加不同请求状态的UI页面,方便快速开发。

安装

要使用此包,请将以下内容添加到您的pubspec.yaml文件中:

dependencies:
  pd_load_state: ^<last version>

执行以下命令以获取依赖项:

flutter pub get

用法

对于使用示例参考/example文件夹中的代码。

引用pd_load_state库:

import 'package:pd_load_state/pd_load_state.dart';

简单的使用

// 如果想让这个组件展示加载状态,可以按照下面的方式实现。
class SimpleExample extends StatefulWidget {
  const SimpleExample({super.key});

  @override
  State<SimpleExample> createState() => _SimpleExampleState();
}

class _SimpleExampleState extends State<SimpleExample> {
  // 初始化组件状态控制对象
  // 控制对象默认会执行加载中状态.
  final PDLoadState loadState = PDLoadState('SimpleExample');

  @override
  Widget build(BuildContext context) {
    // 使用[PDLoadStateLayout]包裹某一个组件.
    return PDLoadStateLayout(
      // 必传 绑定的[PDLoadState] 用来控制组件的状态切换。
      loadState: loadState,
      // 在加载状态时执行的回调, 在这里发送网络请求.
      onLoading: network,
      // 必传 加载状态成功时要执行的函数, 返回一个要展示的ui组件。
      builder: (context) {
        return const Center(
          child: Text('Simple example'),
        );
      },
    );
  }

  /// 模仿一次网络请求。
  void network() {
    Future.delayed(const Duration(seconds: 3)).then((_) {
      if (Random().nextBool()) {
        // 模拟请求成功, loadState.success() 会让页面回到加载成功状态
        // 默认情况下 每次调用这个函数都会刷新[PDLoadStateLayout]包裹的组件
        loadState.success();
      } else {
        loadState.error();
      }
    });
  }
}

组件状态控制对象说明

// 初始化组件状态控制对象
// 控制对象默认会执行加载中状态.
final PDLoadState loadState = PDLoadState('SimpleExample');
// 状态枚举属性
loadState.state;
// 如果是请求错误时的自定义错误文本
loadState.errorMessage;
// 控制对象的身份标识, 用来区分多个组件的状态切换
loadState.identifier;
// 是否刷新[PDLoadStateLayout]包裹的组件.
// 为`true`时, 每次调用函数`loadState.success();`都会刷新[PDLoadStateLayout]包裹的组件
loadState.isRefreshSubviews;

如何切换页面的不同状态?

// 调用函数切换

// 网络请求成功
loadState.success();
// 网络请求失败
loadState.error();
// 网络请求加载中
loadState.loading();

或者用状态枚举直接赋值,内部重写了statusset方法实现刷新:

set status(PDLoadStateEnum newValue) {
    _update(newValue);
}

// 网络请求成功
loadState.state = PDLoadStateStatus.success;
// 网络请求失败
loadState.state = PDLoadStateStatus.error;
// 网络请求加载中
loadState.state = PDLoadStateStatus.loading;
loadState.state = PDLoadStateStatus.reload; // 重新加载

各个状态页面的UI级别说明

示例 Example loadingWidget

通过[PDLoadStateLayout]类中参数loadingWidgetBuilder设置的UI,优先级最高:

PDLoadStateLayout(
  loadState: loadState,
  onLoading: network,
  builder: (context) {
    return const Center();
  },
  /// 优先级最高
  loadingWidgetBuilder: (context) {
    return const Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        mainAxisSize: MainAxisSize.min,
        children: [
          Text('loading...'),
        ],
      ),
    );
  },
)

PdLoadStateConfigure类配置,设置一次全局使用。优先级中等:

/// 自定义加载中页面
PdLoadStateConfigure.instance.loadingWidgetBuilder = (context) {
   return SizedBox(
     width: MediaQuery.of(context).size.width,
     child: const Center(
       child: Row(
         mainAxisAlignment: MainAxisAlignment.center,
         children: [
           CircularProgressIndicator(),
           Text('加载中...'),
         ],
       ),
     ),
   );
};

如果上面两种都没有设置,则使用默认加载中页面,优先级最低:

PDLoadStateDefaultWidgets(backgroundColor: backgroundColor).loadingView;

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

1 回复

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


当然,以下是如何在Flutter中使用pd_load_state插件进行加载状态管理的代码示例。这个插件通常用于处理异步数据加载,并在UI中显示相应的加载、成功或错误状态。

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

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

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

接下来是一个完整的示例,展示如何使用pd_load_state进行状态管理:

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

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> {
  final _pdLoadController = PdLoadController();

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  @override
  void dispose() {
    _pdLoadController.dispose();
    super.dispose();
  }

  Future<void> _fetchData() async {
    // 模拟异步数据加载
    await Future.delayed(Duration(seconds: 2));

    // 模拟数据加载成功
    _pdLoadController.successData("Data Loaded Successfully!");

    // 如果想模拟加载失败,可以使用下面的代码代替上面的successData调用
    // _pdLoadController.errorState("Failed to load data");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('pd_load_state Demo'),
      ),
      body: Center(
        child: PdLoadStateBuilder<String>(
          controller: _pdLoadController,
          builder: (context, state) {
            if (state is PdLoadStateSuccess<String>) {
              return Text(state.data!);
            } else if (state is PdLoadStateLoading) {
              return CircularProgressIndicator();
            } else if (state is PdLoadStateError) {
              return Text(state.message ?? "An unknown error occurred");
            } else {
              return Container(); // 默认状态,通常不会发生
            }
          },
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖添加:在pubspec.yaml中添加pd_load_state依赖。
  2. 控制器初始化:在_MyHomePageState类中初始化PdLoadController
  3. 数据加载:在initState方法中调用_fetchData函数模拟异步数据加载。使用Future.delayed模拟网络延迟。
  4. 状态处理:使用PdLoadStateBuilder根据加载状态显示不同的UI组件。
    • 成功状态:显示加载的数据。
    • 加载状态:显示CircularProgressIndicator
    • 错误状态:显示错误信息。
  5. 资源释放:在dispose方法中释放PdLoadController资源。

这样,你就可以在Flutter应用中轻松地使用pd_load_state插件进行加载状态管理了。

回到顶部