Flutter通用状态管理插件generic_state的使用

Flutter通用状态管理插件generic_state的使用

一个包含预定义状态的小型包,这些状态可以独立于任何状态管理解决方案使用(主要基于流,因为包含了预定义的可返回流的状态突变)。

DataEntity

DataEntity表示可以由状态自身包含的任何对象。

数据操作状态 (Data Action State)

数据操作状态是一种异步状态类型,用于对数据执行某些操作,该操作可以成功或不成功,并通知监听者。

它有四种变化形式——processing(处理中)、idle(空闲)、successful(成功)和error(错误)。每个状态都有一个data获取器,返回数据,而error状态除了data外还有一个error获取器。

一个使用示例可以是任何能够向监听者传达变化的功能,如身份验证和成功登录后反应的按钮。

// 空闲状态
const factory DataActionState.idle({
  required DataEntity? data,
}) = DataActionState$Idle;

// 处理中状态
const factory DataActionState.processing({
  required DataEntity? data,
}) = DataActionState$Processing;

// 成功状态
const factory DataActionState.successful({
  required DataEntity? data,
}) = DataActionState$Successful;

// 错误状态
const factory DataActionState.error({
  required DataEntity? data,
  required Object error,
}) = DataActionState$Error;

示例代码

以下是一个完整的示例,展示如何在Flutter应用中使用DataActionState

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Generic State Example')),
        body: Center(child: DataActionExample()),
      ),
    );
  }
}

class DataActionExample extends StatefulWidget {
  [@override](/user/override)
  _DataActionExampleState createState() => _DataActionExampleState();
}

class _DataActionExampleState extends State<DataActionExample> {
  DataActionState<String> _state = DataActionState.idle(data: null);

  void _performAction() async {
    setState(() {
      _state = DataActionState.processing(data: null);
    });

    try {
      // 模拟异步操作
      await Future.delayed(Duration(seconds: 2));
      setState(() {
        _state = DataActionState.successful(data: "操作成功");
      });
    } catch (e) {
      setState(() {
        _state = DataActionState.error(data: null, error: e);
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _performAction,
          child: Text('执行操作'),
        ),
        SizedBox(height: 20),
        Text(_state.when(
          idle: () => '点击按钮开始操作',
          processing: () => '正在处理...',
          successful: (data) => '操作成功: $data',
          error: (error) => '操作失败: $error',
        )),
      ],
    );
  }
}

数据交互状态 (Data Interaction State)

数据交互状态是一种异步状态类型,用于与内部数据进行交互并修改数据。

它有三种变化形式——processing(处理中)、idle(空闲)和error(错误)。每个状态都有一个data获取器,返回数据,而error状态除了data外还有一个error获取器。

一个使用示例可以是应用程序设置的状态——它们从一开始就存在并在整个应用中可用,可以被加载、处于空闲状态或出错。

// 空闲状态
const factory DataInteractionState.idle({
  required DataEntity? data,
}) = DataInteractionState$Idle;

// 处理中状态
const factory DataInteractionState.processing({
  required DataEntity? data,
}) = DataInteractionState$Processing;

// 错误状态
const factory DataInteractionState.error({
  required DataEntity? data,
  required Object error,
}) = DataInteractionState$Error;

示例代码

以下是一个完整的示例,展示如何在Flutter应用中使用DataInteractionState

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Generic State Example')),
        body: Center(child: DataInteractionExample()),
      ),
    );
  }
}

class DataInteractionExample extends StatefulWidget {
  [@override](/user/override)
  _DataInteractionExampleState createState() => _DataInteractionExampleState();
}

class _DataInteractionExampleState extends State<DataInteractionExample> {
  DataInteractionState<String> _state = DataInteractionState.idle(data: null);

  void _loadData() async {
    setState(() {
      _state = DataInteractionState.processing(data: null);
    });

    try {
      // 模拟异步操作
      await Future.delayed(Duration(seconds: 2));
      setState(() {
        _state = DataInteractionState.successful(data: "数据加载成功");
      });
    } catch (e) {
      setState(() {
        _state = DataInteractionState.error(data: null, error: e);
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _loadData,
          child: Text('加载数据'),
        ),
        SizedBox(height: 20),
        Text(_state.when(
          idle: () => '点击按钮加载数据',
          processing: () => '正在加载数据...',
          successful: (data) => '数据加载成功: $data',
          error: (error) => '数据加载失败: $error',
        )),
      ],
    );
  }
}

操作状态 (Operation State)

操作状态是一种异步操作类型,包含通过此操作获得的数据。

它有四种变化形式——initial(初始)、processing(处理中)、success(成功)和error(错误)。success存储data,而error存储errorinitialprocessing为空。

一个使用示例可以是HTTP请求的结果阶段。

// 初始状态
const factory OperationState.initial() = OperationState$Initial;

// 处理中状态
const factory OperationState.processing() = OperationState$Processing;

// 成功状态
const factory OperationState.successful({
  required DataEntity? data,
}) = OperationState$Successful;

// 错误状态
const factory OperationState.error({
  required Object error,
}) = OperationState$Error;

示例代码

以下是一个完整的示例,展示如何在Flutter应用中使用OperationState

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Generic State Example')),
        body: Center(child: OperationExample()),
      ),
    );
  }
}

class OperationExample extends StatefulWidget {
  [@override](/user/override)
  _OperationExampleState createState() => _OperationExampleState();
}

class _OperationExampleState extends State<OperationExample> {
  OperationState<String> _state = OperationState.initial();

  void _performOperation() async {
    setState(() {
      _state = OperationState.processing();
    });

    try {
      // 模拟异步操作
      await Future.delayed(Duration(seconds: 2));
      setState(() {
        _state = OperationState.successful(data: "操作成功");
      });
    } catch (e) {
      setState(() {
        _state = OperationState.error(error: e);
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _performOperation,
          child: Text('执行操作'),
        ),
        SizedBox(height: 20),
        Text(_state.when(
          initial: () => '点击按钮开始操作',
          processing: () => '正在处理...',
          successful: (data) => '操作成功: $data',
          error: (error) => '操作失败: $error',
        )),
      ],
    );
  }
}

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

1 回复

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


generic_state 是一个用于 Flutter 的通用状态管理插件,它旨在简化状态管理的复杂性,并提供一种灵活的方式来管理应用程序的状态。虽然 generic_state 并不是 Flutter 官方推荐的状态管理解决方案(如 ProviderRiverpodBloc 等),但它为开发者提供了一种替代方案。

1. 安装 generic_state

首先,你需要在 pubspec.yaml 文件中添加 generic_state 依赖:

dependencies:
  flutter:
    sdk: flutter
  generic_state: ^1.0.0  # 请使用最新版本

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

2. 基本用法

generic_state 的核心思想是通过 GenericState 类来管理状态,并通过 GenericStateBuilderGenericStateListener 来监听状态的变化。

2.1 创建一个状态类

首先,你需要创建一个继承自 GenericState 的状态类:

import 'package:generic_state/generic_state.dart';

class CounterState extends GenericState {
  int count = 0;

  void increment() {
    count++;
    notifyListeners(); // 通知监听器状态已更改
  }
}

2.2 在 Widget 中使用状态

你可以在你的 Widget 中使用 GenericStateBuilder 来监听状态的变化,并在状态变化时重建 Widget

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

class CounterApp extends StatelessWidget {
  final CounterState counterState = CounterState();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Counter App')),
        body: Center(
          child: GenericStateBuilder(
            state: counterState,
            builder: (context, state) {
              return Text('Count: ${state.count}');
            },
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            counterState.increment();
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

2.3 使用 GenericStateListener

如果你只想在某些状态变化时执行一些操作,而不是重建整个 Widget,你可以使用 GenericStateListener

GenericStateListener(
  state: counterState,
  listener: (context, state) {
    // 在状态变化时执行某些操作
    print('Count changed to ${state.count}');
  },
  child: Text('Count: ${counterState.count}'),
);

3. 状态持久化

generic_state 还支持状态的持久化。你可以通过实现 GenericStatesaveStateloadState 方法来保存和加载状态:

class CounterState extends GenericState {
  int count = 0;

  void increment() {
    count++;
    notifyListeners();
  }

  [@override](/user/override)
  Map<String, dynamic> saveState() {
    return {'count': count};
  }

  [@override](/user/override)
  void loadState(Map<String, dynamic> state) {
    count = state['count'] ?? 0;
  }
}
回到顶部