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
存储error
,initial
和processing
为空。
一个使用示例可以是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
更多关于Flutter通用状态管理插件generic_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
generic_state
是一个用于 Flutter 的通用状态管理插件,它旨在简化状态管理的复杂性,并提供一种灵活的方式来管理应用程序的状态。虽然 generic_state
并不是 Flutter 官方推荐的状态管理解决方案(如 Provider
、Riverpod
、Bloc
等),但它为开发者提供了一种替代方案。
1. 安装 generic_state
首先,你需要在 pubspec.yaml
文件中添加 generic_state
依赖:
dependencies:
flutter:
sdk: flutter
generic_state: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 基本用法
generic_state
的核心思想是通过 GenericState
类来管理状态,并通过 GenericStateBuilder
或 GenericStateListener
来监听状态的变化。
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
还支持状态的持久化。你可以通过实现 GenericState
的 saveState
和 loadState
方法来保存和加载状态:
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;
}
}