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<T></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
更多关于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。你可以根据需要调整存储类型和值类型。