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

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

特性

hydrated_notifierstate_notifier 库的一个扩展,它自动持久化和恢复基于 hive 构建的状态。

使用

初始化 HydratedStorage

首先,确保在应用程序启动时初始化 HydratedStorage。这可以通过以下方式完成:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化存储
  HydratedStateNotifier.storage = await HydratedStorage.build(
    storageDirectory: kIsWeb
        ? HydratedStorage.webStorageDirectory
        : await getTemporaryDirectory(),
  );

  runApp(App());
}
创建一个 HydratedStateNotifier

接下来,创建一个继承自 HydratedStateNotifier 的类,并实现状态的持久化逻辑。例如,创建一个计数器通知器:

import 'package:hydrated_state_notifier/hydrated_state_notifier.dart';
import 'package:flutter/foundation.dart';

class CounterNotifier extends HydratedStateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => state = state + 1;

  [@override](/user/override)
  int fromJson(Map<String, dynamic> json) => json['value'] as int;

  [@override](/user/override)
  Map<String, int> toJson(int state) => { 'value': state };
}

在这个例子中,CounterNotifier 类会自动保存和恢复状态。你可以增加计数器的值,然后重启应用或杀死进程,之前的状态会被保留下来。

完整示例 Demo

下面是一个完整的 Flutter 应用程序示例,展示了如何使用 hydrated_notifier 来管理状态并持久化它:

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

// 定义一个状态通知器
class CounterNotifier extends HydratedStateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => state = state + 1;

  [@override](/user/override)
  int fromJson(Map<String, dynamic> json) => json['value'] as int;

  [@override](/user/override)
  Map<String, int> toJson(int state) => { 'value': state };
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化存储
  HydratedStateNotifier.storage = await HydratedStorage.build(
    storageDirectory: kIsWeb
        ? HydratedStorage.webStorageDirectory
        : await getTemporaryDirectory(),
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

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

class _HomeScreenState extends State<HomeScreen> {
  final CounterNotifier _counterNotifier = CounterNotifier();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Hydrated Notifier Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            StreamBuilder<int>(
              stream: _counterNotifier.stream,
              initialData: _counterNotifier.state,
              builder: (context, snapshot) {
                return Text(
                  '${snapshot.data}',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _counterNotifier.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用hydrated_notifier插件进行持久化状态管理的代码示例。hydrated_notifierprovider状态管理生态系统的一部分,它允许你将状态持久化到设备上,比如使用SharedPreferences。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0 # 确保使用最新版本
  flutter_riverpod: ^1.0.0 # 确保使用最新版本
  hydrated_notifier: ^0.6.0 # 确保使用最新版本

步骤 2: 设置持久化存储

main.dart文件中,配置HydratedNotifierHydratedProvider。你需要创建一个HydratedNotifier类来管理你的状态,并实现toJsonfromJson方法。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hydrated_notifier/hydrated_notifier.dart';
import 'package:shared_preferences/shared_preferences.dart';

// 定义你的状态类
class CounterState extends HydratedNotifier<int> {
  CounterState() : super(0);

  void increment() {
    state++;
  }

  @override
  int fromJson(Map<String, dynamic> json) {
    return json['value'] ?? 0;
  }

  @override
  Map<String, dynamic> toJson(int state) {
    return {'value': state};
  }
}

// 创建HydratedProvider
final counterProvider = HydratedProvider<CounterState>(
  (ref) => CounterState(),
);

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final sharedPreferences = await SharedPreferences.getInstance();
  runApp(
    ProviderScope(
      overrides: [
        hydratedProviderFamily.overrideWithValue(
          hydratedProviderFamily.value,
          (key) => sharedPreferences,
        ),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: CounterPage(),
    );
  }
}

class CounterPage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final counter = ref.watch(counterProvider);
    return Scaffold(
      appBar: AppBar(title: Text('Hydrated Notifier Example')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counter.state}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counter.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

解释

  1. 定义状态类CounterState继承自HydratedNotifier<int>,其中int是状态的类型。你需要实现fromJsontoJson方法来序列化和反序列化状态。

  2. 创建HydratedProvider:使用HydratedProvider来包装你的状态类。这个Provider会自动处理状态的持久化和恢复。

  3. 配置持久化存储:在main函数中,你需要初始化SharedPreferences,并通过ProviderScopeoverrides参数将其传递给hydratedProviderFamily

  4. 使用状态:在CounterPage中,使用ConsumerWidgetref.watch来访问和监听状态的变化。

通过这种方式,hydrated_notifier允许你将应用状态持久化到设备存储中,并在应用重启时恢复这些状态。这对于需要保存用户数据或应用状态的场景非常有用。

回到顶部