Flutter持久化状态管理插件redux_persist的使用

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

Flutter持久化状态管理插件 redux_persist 的使用

redux_persist 是一个用于在 Flutter 应用中实现 Redux 状态持久化的插件。它支持多种存储引擎(如 Flutter、Web、文件系统等),并且可以自定义序列化器和存储引擎。

特性

  • 支持多种存储引擎: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 提供了内置的序列化器,如 JsonSerializerStringSerializerRawSerializer。你也可以根据需要创建自己的序列化器。

例如,创建一个简单的整数序列化器:

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 方法中的字段来实现。例如,假设我们有一个包含 countername 字段的状态对象,但我们不想保存 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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用redux_persist插件进行持久化状态管理的示例代码。redux_persist插件允许你将Redux store的状态持久化到本地存储(如磁盘),从而在应用重启后能够恢复这些状态。

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

dependencies:
  flutter:
    sdk: flutter
  redux: ^5.0.0
  redux_persist: ^0.10.0  # 请注意版本号,这里使用的是示例版本号

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

接下来,按照以下步骤设置和使用redux_persist

  1. 定义你的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});
}
  1. 配置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对象。

  1. 创建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(),
      ),
    );
  }
}
  1. 在你的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中访问和更新状态。

回到顶部