Flutter数据持久化与通知插件persist_notifier的使用

Flutter数据持久化与通知插件persist_notifier的使用

pub package

PersistNotifier 封装了平台特定的持久化存储,用于简单的数据存储(在iOS和macOS上为NSUserDefaults,在Android上为SharedPreferences等)。它通过现有的ValueNotifier方法以及定义的新方法来实现额外的功能。数据可以异步或同步地持久化到磁盘。

支持的数据类型包括intdoubleboolStringList<String>

关于值存储的信息,请参阅SharedPreferences文档

使用

要使用此插件,需要将persist_notifier作为依赖项添加到你的pubspec.yaml文件中。

dependencies:
  persist_notifier: ^x.y.z

示例

以下是展示如何使用API的小示例。

定义

// 定义为静态变量或成员变量
PersistNotifier pn = PersistNotifier("com.example.test", 0);

void example() async {
    // 异步定义
    var pn = PersistNotifier("com.example.test", 0);
    // 同步定义
    var pn = await PersistNotifier.create("com.example.test", 0);
}

读取数据

// 读取默认值或存储的值
PersistNotifier pn = await PersistNotifier.create("com.example.test", 0);
final int counter = pn.value;

// 如果底层值已更改,则强制同步存储的值。
// 这应该只发生在用相同键的不同变量更改时。
pn.resync();

写入数据

// 读取默认值或存储的值
PersistNotifier pn = await PersistNotifier.create("com.example.test", 0);
pn.value = 7; // 异步存储更新
bool success = await pn.set(7); // 同步存储更新

删除条目

// 将值重置回默认值
PersistNotifier pn = await PersistNotifier.create("com.example.test", 0);
pn.value = 7;
pn.reset();
// pn.value == 0

扩展提供的设置管理器

class SettingsManager extends PersistNotifierManager {
    // 创建一个单例以方便访问
    ...
    PersistNotifier pn = PersistNotifier("com.example.test", 0);
    PersistNotifier pnBoo = PersistNotifier("com.example.boo", 7);

    SettingsManager() {
        add(pn);
        add(pnBoo, group: "boo");
    }
}

void example() {
    SettingsManager manager = SettingsManager();
    manager.reset(group: "boo"); // 仅重置"boo"组
    manager.reset(); // 重置所有组
    List<PersistNotifier> list;
    list = manager.getAll(group: "boo"); // 获取"boo"组的所有条目
    list = manager.getAll(); // 获取所有组合的条目
}

更多关于Flutter数据持久化与通知插件persist_notifier的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据持久化与通知插件persist_notifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,数据持久化和状态管理是两个常见的需求。persist_notifier 是一个结合了数据持久化和状态管理的插件,它允许你将状态持久化到本地存储(如SharedPreferences或Hive),并在状态变化时自动更新UI。

1. 安装依赖

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

dependencies:
  flutter:
    sdk: flutter
  persist_notifier: ^1.0.0

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

2. 使用 PersistNotifier

PersistNotifier 是一个抽象类,你可以通过继承它来创建自己的持久化状态管理类。

2.1 创建持久化状态管理类

假设我们想要持久化一个简单的计数器状态:

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

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

  void increment() {
    state++;
    save();
  }

  void decrement() {
    state--;
    save();
  }

  [@override](/user/override)
  Future<void> load() async {
    // 从本地存储加载数据
    // 例如使用 SharedPreferences 或 Hive
    // 这里我们假设从 SharedPreferences 加载
    final prefs = await SharedPreferences.getInstance();
    state = prefs.getInt('counter') ?? 0;
  }

  [@override](/user/override)
  Future<void> save() async {
    // 将数据保存到本地存储
    // 例如使用 SharedPreferences 或 Hive
    // 这里我们假设保存到 SharedPreferences
    final prefs = await SharedPreferences.getInstance();
    prefs.setInt('counter', state);
  }
}

2.2 在应用中使用 PersistNotifier

你可以使用 PersistNotifierProvider 来在应用中使用 CounterNotifier

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

void main() {
  runApp(
    PersistNotifierProvider(
      create: (_) => CounterNotifier(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Persist Notifier Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('You have pushed the button this many times:'),
              Consumer<CounterNotifier>(
                builder: (context, counter, child) {
                  return Text(
                    '${counter.state}',
                    style: Theme.of(context).textTheme.headline4,
                  );
                },
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            // 使用 context.read<CounterNotifier>() 来访问 CounterNotifier
            context.read<CounterNotifier>().increment();
          },
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}
回到顶部