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

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

ReactiveValue 在每次应用程序重启时都会重置为其初始值。要跨应用重启保持值,可以使用 PersistentValueNotifier 而不是 ValueNotifier

这个 Flutter 库扩展了 <a href="https://api.flutter.dev/flutter/foundation/ValueNotifier-class.html"><code>ValueNotifier&lt;T&gt;</code></a>,提供了 <code>PersistentValueNotifier</code>,该类将 <code>ValueNotifier</code><code>value</code> 存储在 <a href="https://pub.dev/packages/shared_preferences"><code>SharedPreferences</code></a> 中,从而使得 <code>value</code> 的更改在应用重启后仍然有效。

使用方法

(1) 在你的 <code>pubspec.yaml</code> 文件中添加对 <code>flutter_persistent_value_notifier</code> 的依赖(如果需要控制版本,请将 <code>any</code> 替换为最新版本),然后运行 <code>flutter pub get</code>

dependencies:
  flutter:
    sdk: flutter
  flutter_persistent_value_notifier: any

(2) 在你的 Flutter 项目中导入该包:

import 'package:flutter_persistent_value_notifier/'
        'flutter_persistent_value_notifier.dart';

(3) 在你的异步 <code>main</code> 方法中,初始化 <code>WidgetsFlutterBinding</code>,然后通过调用 <code>await initPersistentValueNotifier()</code> 来初始化 <code>persistent_value_notifier</code> 库,这会启动 <code>SharedPreferences</code> 并从 <code>SharedPreferences</code> 后台存储加载任何已持久化的值。

void main() async {
  // 下面两行是必需的,并且必须按此顺序执行
  WidgetsFlutterBinding.ensureInitialized();
  await initPersistentValueNotifier(prefix: 'com.myapp.');  // 为您的应用提供一个唯一的 SharedPreferences 前缀

  runApp(MainPage());
}

(4) 在代码中使用 <code>PersistentValueNotifier</code> 替换 <code>ValueNotifier</code>,如下所示:

final counter = PersistentValueNotifier<int>(
  sharedPreferencesKey: 'counter',
  initialValue: 0,
);

<code>counter.value</code> 将被设置为初始值 <code>0</code>,但如果在之前的应用运行中已经设置了值,则会从 <code>SharedPreferences</code> 中恢复之前的值,使用共享偏好键 <code>'counter'</code>

将来,每当设置 <code>counter.value</code> 时,不仅会更新底层 <code>ValueNotifier</code><code>value</code>,还会异步地将新值写入 <code>SharedPreferences</code>,使用相同的键。

变体

你也可以使用 <code>PersistentValueNotifierEnum</code> 来持久化存储枚举值:

enum Fruit { apple, pair, banana };

final fruit = PersistentValueNotifierEnum<Fruit>(
  sharedPreferencesKey: 'fruit',
  initialValue: Fruit.apple,
  nameToValueMap: Fruit.values.asNameMap(),
);

或者你可以使用 <code>PersistentValueNotifierJsonEncoded</code> 来持久化存储任意可序列化为 JSON 的类:

final fruit = PersistentValueNotifierJsonEncoded<UserProfile?>(
  sharedPreferencesKey: 'user-profile',
  initialValue: null,
  toJson: (u) => jsonEncode(u?.toJson()),
  fromJson: (jsonStr) => UserProfile.fromJson(jsonDecode(jsonStr)),
);

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_persistent_value_notifier插件来实现持久化数据通知的一个简单示例。flutter_persistent_value_notifier插件允许你将数据持久化到存储(如本地存储),并在数据变化时通知监听者。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_persistent_value_notifier: ^x.y.z  # 替换为最新版本号

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

2. 初始化插件

在你的应用入口文件(通常是main.dart)中,初始化PersistentValueNotifier

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PersistentValueNotifierProvider(
        storage: PersistentValueStorage.sharedPreferences, // 使用SharedPreferences存储
        child: MyHomePage(),
      ),
    );
  }
}

3. 创建和使用PersistentValueNotifier

接下来,创建一个PersistentValueNotifier实例,并在你的组件中使用它。

import 'package:flutter/material.dart';
import 'package:flutter_persistent_value_notifier/flutter_persistent_value_notifier.dart';
import 'package:provider/provider.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final valueNotifier = context.read<PersistentValueNotifier<String>>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Persistent Value Notifier Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Current Value: ${valueNotifier.value ?? "N/A"}',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 16),
            TextField(
              decoration: InputDecoration(labelText: 'Enter new value'),
              onChanged: (newValue) {
                context.read<PersistentValueNotifier<String>>().value = newValue;
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                valueNotifier.reset(); // 重置为默认值或null,根据配置
              },
              child: Text('Reset Value'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 配置默认值(可选)

你可以在PersistentValueNotifier初始化时设置默认值。例如,你可以在PersistentValueNotifierProvider中指定一个默认值:

PersistentValueNotifierProvider(
  storage: PersistentValueStorage.sharedPreferences,
  defaultValue: 'Default Value', // 设置默认值
  child: MyHomePage(),
)

这样,当应用首次运行时,如果之前没有存储过值,它将使用你提供的默认值。

5. 完整示例

将以上代码整合到一个完整的示例中:

import 'package:flutter/material.dart';
import 'package:flutter_persistent_value_notifier/flutter_persistent_value_notifier.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PersistentValueNotifierProvider(
        storage: PersistentValueStorage.sharedPreferences,
        defaultValue: 'Default Value', // 设置默认值
        child: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final valueNotifier = context.read<PersistentValueNotifier<String>>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Persistent Value Notifier Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Current Value: ${valueNotifier.value ?? "N/A"}',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 16),
            TextField(
              decoration: InputDecoration(labelText: 'Enter new value'),
              onChanged: (newValue) {
                context.read<PersistentValueNotifier<String>>().value = newValue;
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                valueNotifier.reset(); // 重置为默认值或null,根据配置
              },
              child: Text('Reset Value'),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何使用flutter_persistent_value_notifier插件来持久化字符串值,并在值变化时更新UI。你可以根据需要调整存储类型和值类型。

回到顶部