Flutter持久化状态管理插件redux_persist的使用
Flutter持久化状态管理插件 redux_persist
的使用
redux_persist
是一个用于在 Flutter 应用中实现 Redux 状态持久化的插件。它支持多种存储引擎(如 Flutter、Web、文件系统等),并且可以自定义序列化器和存储引擎。
特性
- 支持多种存储引擎:Flutter、Web、文件系统或自定义存储引擎。
- 类型安全。
- 在加载和保存时可以转换状态和原始数据。
- 自定义序列化器。
- 易于集成,几分钟内即可将其集成到你的代码库中。
存储引擎
使用示例
状态设置
首先,我们需要定义一个包含 toJson
方法的状态类:
class AppState {
final int counter;
AppState({this.counter = 0});
AppState copyWith({int? counter}) =>
AppState(counter: counter ?? this.counter);
static AppState fromJson(dynamic json) => AppState(counter: json["counter"]);
dynamic toJson() => {'counter': counter};
}
创建 Persistor 和 Store
接下来,创建 Persistor
、存储引擎和 Store
,然后加载上次保存的状态。通常这会在 main
函数中完成:
import 'dart:io';
import 'package:redux/redux.dart';
import 'package:redux_persist/redux_persist.dart';
import 'package:redux_persist_flutter/redux_persist_flutter.dart'; // 如果使用 Flutter 存储引擎
void main() async {
// 创建 Persistor
final persistor = Persistor<AppState>(
storage: FileStorage(File("state.json")), // 或者使用其他存储引擎
serializer: JsonSerializer<AppState>(AppState.fromJson), // 或者使用其他序列化器
);
// 加载初始状态
final initialState = await persistor.load();
// 创建 Store 并添加 Persistor 中间件
final store = Store<AppState>(
reducer,
initialState: initialState ?? AppState(),
middleware: [persistor.createMiddleware()],
);
// 运行应用
runApp(MyApp(store: store));
}
// 定义 Reducer
AppState reducer(AppState state, dynamic action) {
if (action is IncrementCounterAction) {
return state.copyWith(counter: state.counter + 1);
}
return state;
}
// Action 类
class IncrementCounterAction {}
// 示例 MyApp 组件
class MyApp extends StatelessWidget {
final Store<AppState> store;
MyApp({required this.store});
@override
Widget build(BuildContext context) {
return StoreProvider(
store: store,
child: MaterialApp(
title: 'Redux Persist Demo',
home: MyHomePage(),
),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final store = StoreProvider.of<AppState>(context);
return Scaffold(
appBar: AppBar(
title: Text('Redux Persist Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('You have pushed the button this many times:'),
StoreConnector<AppState, String>(
converter: (store) => store.state.counter.toString(),
builder: (context, count) => Text(
'$count',
style: Theme.of(context).textTheme.headline4,
),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => store.dispatch(IncrementCounterAction()),
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
存储引擎
你可以选择不同的存储引擎来适应不同类型的应用程序:
- Flutter: 使用
redux_persist_flutter
包中的FlutterStorage
。 - Web: 使用
redux_persist_web
包中的LocalStorage
。 - 文件系统: 使用
FileStorage
。
例如,使用文件系统存储:
final persistor = Persistor<AppState>(
storage: FileStorage(File("path/to/state")),
);
序列化器
redux_persist
提供了内置的序列化器,如 JsonSerializer
、StringSerializer
和 RawSerializer
。你也可以根据需要创建自己的序列化器。
例如,创建一个简单的整数序列化器:
class IntSerializer implements StateSerializer<int> {
@override
int decode(Uint8List data) {
return ByteData.view(data.buffer).getInt64(0);
}
@override
Uint8List encode(int state) {
final data = Uint8List(8);
ByteData.view(data.buffer).setInt64(0, state);
return data;
}
}
白名单/黑名单
如果你只想保存部分状态,可以通过省略 toJson
方法中的字段来实现。例如,假设我们有一个包含 counter
和 name
字段的状态对象,但我们不想保存 counter
:
class AppState {
final int counter;
final String name;
AppState({this.counter = 0, required this.name});
static AppState fromJson(dynamic json) =>
AppState(name: json["name"]); // 不加载 counter,默认值为 0
Map<String, dynamic> toJson() => {'name': name}; // 不保存 counter
}
调试与节流
Persistor
提供了调试模式和节流功能,以防止频繁写入磁盘:
final persistor = Persistor<AppState>(
debug: true,
throttleDuration: Duration(seconds: 2),
);
总结
通过 redux_persist
插件,我们可以轻松地将 Redux 状态持久化到本地存储中,并在应用重启后恢复状态。这个插件提供了丰富的功能,包括多种存储引擎、自定义序列化器、白名单/黑名单等功能,能够满足大多数应用的需求。
完整的示例代码可以在 GitHub 上找到。
更多关于Flutter持久化状态管理插件redux_persist的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter持久化状态管理插件redux_persist的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用redux_persist
插件进行持久化状态管理的示例代码。redux_persist
插件允许你将Redux store的状态持久化到本地存储(如磁盘),从而在应用重启后能够恢复这些状态。
首先,确保你已经在pubspec.yaml
文件中添加了redux
和redux_persist
依赖:
dependencies:
flutter:
sdk: flutter
redux: ^5.0.0
redux_persist: ^0.10.0 # 请注意版本号,这里使用的是示例版本号
然后,运行flutter pub get
来安装这些依赖。
接下来,按照以下步骤设置和使用redux_persist
:
- 定义你的Redux Store和State:
import 'package:redux/redux.dart';
// 定义你的应用状态
class AppState {
final String someData;
AppState({required this.someData});
AppState copyWith({String? someData}) {
return AppState(
someData: someData ?? this.someData,
);
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is AppState &&
runtimeType == other.runtimeType &&
someData == other.someData;
@override
int get hashCode => someData.hashCode;
}
// 定义你的Reducer
AppState appReducer(AppState state, action) {
if (action is UpdateDataAction) {
return state.copyWith(someData: action.newData);
}
return state;
}
// 定义你的Action
class UpdateDataAction {
final String newData;
UpdateDataAction({required this.newData});
}
- 配置
redux_persist
:
import 'package:redux/redux.dart';
import 'package:redux_persist/redux_persist.dart';
import 'package:redux_persist_flutter_storage/redux_persist_flutter_storage.dart';
import 'package:path_provider/path_provider.dart';
// 创建持久化存储
Future<Persistor<AppState>> buildPersistor() async {
final storage = FlutterStorage(
keyPrefix: 'myapp_',
storageDirectory: (await getApplicationDocumentsDirectory()).path,
);
final persistor = Persistor<AppState>(
storage: storage,
serializer: JsonSerializer<AppState>(AppState.fromJson),
deserializer: JsonDeserializer<AppState>(),
blacklist: [], // 你可以在这里添加不需要持久化的字段
whitelist: null, // 或者在这里添加需要持久化的字段,如果设置了whitelist,则只有这些字段会被持久化
);
return persistor;
}
注意:AppState.fromJson
方法需要你自己实现,用于从JSON反序列化AppState
对象。
- 创建Store并应用持久化:
import 'package:flutter/material.dart';
import 'package:redux/redux.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:redux_persist/redux_persist.dart';
void main() async {
final store = await StoreProvider.create<AppState>(
store: Store<AppState>(
appReducer,
initialState: AppState(someData: 'Initial Data'),
middleware: [],
),
persistor: await buildPersistor(),
);
runApp(MyApp(store: store));
}
class MyApp extends StatelessWidget {
final StoreProvider<AppState> store;
MyApp({required this.store});
@override
Widget build(BuildContext context) {
return StoreProvider<AppState>(
store: store.store,
child: MaterialApp(
home: MyHomePage(),
),
);
}
}
- 在你的UI中使用Store:
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'action.dart'; // 导入你的Action文件
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Redux Persist Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Current Data: ${_getCurrentData(context)}'),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
_updateData(context, 'Updated Data');
},
child: Text('Update Data'),
),
],
),
),
);
}
String _getCurrentData(BuildContext context) {
return StoreProvider.of<AppState>(context).state.someData;
}
void _updateData(BuildContext context, String newData) {
StoreProvider.of<AppState>(context).dispatch(UpdateDataAction(newData: newData));
}
}
这样,你就完成了在Flutter项目中使用redux_persist
插件进行持久化状态管理的设置。这个示例展示了如何定义状态、创建持久化存储、配置Store,并在UI中访问和更新状态。