Flutter本地存储插件flutter_app_preferences的使用
Flutter本地存储插件flutter_app_preferences的使用
flutter_app_preferences
是一个用于以类型安全的方式管理共享偏好设置(shared preferences)的插件。它允许你在偏好设置发生变化时接收通知。每个 Preference<T>
都扩展了 ValueNotifier<T>
,以最大限度地提高与现有解决方案的兼容性,并在使用 Flutter 时提供无缝体验。
状态
状态 | 备注 |
---|---|
当前稳定版 Flutter | |
当前测试版 Flutter | |
最低支持的 Flutter 版本 |
开始使用
- 将此包添加到你的依赖项中:
dependencies:
flutter_app_preferences: latest_version
- 获取依赖项:
flutter pub get
使用
- 创建一个包含你偏好的类:
import 'package:flutter_app_preferences/flutter_app_preferences.dart';
// 一个保存偏好设置的类。
class AppPreferences extends BaseAppPreferences {
// 示例:保存布尔值。
final highContrast = Preference('high-contrast', true);
// 示例:保存枚举。
final fontSize = Preference(
'font-size',
FontSize.medium,
values: FontSize.values,
);
// 示例:保存自定义对象。
final currentUser = Preference(
'current-user',
User.initialUser,
fromJson: User.fromJson,
toJson: (user) => user.toJson(),
);
// 提供所有应用偏好设置的列表,确保 `AppPreferences` 实例可以通知其监听器。
[@override](/user/override)
List<Preference<Object?>> get props => [
highContrast,
fontSize,
currentUser,
];
}
// 示例枚举。
enum FontSize {
small,
medium,
large,
}
// 示例自定义对象。
class User {
const User({required this.name});
factory User.fromJson(Map<String, Object?> json) =>
User(name: json['name']! as String);
Map<String, Object?> toJson() => {'name': name};
static const initialUser = User(name: '');
final String name;
}
- 初始化
AppPreferences
实例:
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = AppPreferences();
await prefs.initialize();
runApp(const MaterialApp());
}
- 在整个应用中提供并使用它:
- 使用
provider
:
// 提供
runApp(
ChangeNotifierProvider.value(
value: prefs,
child: const MaterialApp(),
),
);
// 读取所有
final prefs = context.watch<AppPreferences>();
// 读取单个
final fontSize = context.select<AppPreferences, FontSize>(
(prefs) => prefs.fontSize.value,
);
- 使用全局实例:
// 声明
class AppPreferences extends BaseAppPreferences {
static final i = AppPreferences();
}
// 初始化
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await AppPreferences.i.initialize();
runApp(const MaterialApp());
}
// 写入
AppPreferences.i.highContrast.value = true;
// 读取
print(AppPreferences.i.highContrast.value);
// 读取并响应变化
return ListenableBuilder(
listenable: AppPreferences.i.highContrast,
builder: (context, _) => Text(
'High contrast? ${AppPreferences.i.highContrast.value}',
),
);
其他信息
BaseAppPreferences
扩展了ChangeNotifier
并在任何Preference
发生更改时通知其监听器。Preference<T>
扩展了ValueNotifier<T>
并在其值发生更改时通知其监听器。- 在访问任何
Preference
之前,必须调用initialize
方法。 - 偏好设置由
SharedPreferencesWithCache
支持,这意味着如果你当前在项目中使用SharedPreferences.getInstance()
并希望迁移到此包,则需要指定带有flutter.
前缀的键,并且在 Android 上手动迁移它们。更多信息请参见 官方文档。 - 此插件需要至少 Flutter 3.24 版本才能运行。
- 如果有任何问题,请前往 GitHub Issues 报告错误。
维护者
- Nikodem Bernat
示例代码
以下是一个完整的示例代码,展示了如何使用 flutter_app_preferences
插件来管理偏好设置。
import 'package:example/app_preferences.dart';
import 'package:flutter/material.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await AppPreferences.i.initialize();
runApp(
MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
useMaterial3: true,
),
home: const MyHomePage(),
),
);
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('App Preferences Example'),
),
body: ListenableBuilder(
listenable: AppPreferences.i.counter,
builder: (context, _) => Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'${AppPreferences.i.counter.value}',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => AppPreferences.i.counter.value += 1,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
更多关于Flutter本地存储插件flutter_app_preferences的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地存储插件flutter_app_preferences的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_app_preferences
插件进行本地存储的示例代码。这个插件允许你以键值对的形式存储和检索数据。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加flutter_app_preferences
依赖:
dependencies:
flutter:
sdk: flutter
flutter_app_preferences: ^2.0.0 # 请使用最新版本
然后运行flutter pub get
来安装依赖。
2. 导入插件
在你的Dart文件中(例如main.dart
),导入插件:
import 'package:flutter/material.dart';
import 'package:flutter_app_preferences/flutter_app_preferences.dart';
3. 使用插件
以下是一个简单的示例,展示了如何使用flutter_app_preferences
来存储和检索数据:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter App Preferences Example'),
),
body: PreferencesScreen(),
),
);
}
}
class PreferencesScreen extends StatefulWidget {
@override
_PreferencesScreenState createState() => _PreferencesScreenState();
}
class _PreferencesScreenState extends State<PreferencesScreen> {
final FlutterAppPreferences preferences = FlutterAppPreferences();
String _value = '';
@override
void initState() {
super.initState();
// 尝试从本地存储中读取值
_readValue();
}
Future<void> _readValue() async {
final String? storedValue = await preferences.getString('my_key');
if (storedValue != null) {
setState(() {
_value = storedValue;
});
}
}
Future<void> _writeValue(String value) async {
await preferences.setString('my_key', value);
// 更新UI
setState(() {
_value = value;
});
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextField(
decoration: InputDecoration(
labelText: 'Enter a value',
),
value: _value,
onChanged: (newValue) {
// 直接更新UI状态,但不会保存到本地存储
setState(() {
_value = newValue;
});
},
onEditingComplete: () async {
// 当编辑完成时,保存到本地存储
await _writeValue(_value);
},
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
// 清空本地存储中的值
await preferences.remove('my_key');
// 更新UI
setState(() {
_value = '';
});
},
child: Text('Clear Value'),
),
],
),
);
}
}
解释
- 依赖添加:在
pubspec.yaml
文件中添加flutter_app_preferences
依赖。 - 导入插件:在Dart文件中导入
flutter_app_preferences
。 - 初始化状态:在
initState
方法中,尝试从本地存储中读取值。 - 读取值:使用
preferences.getString('my_key')
从本地存储中读取值。 - 写入值:使用
preferences.setString('my_key', value)
将值存储到本地存储中。 - UI更新:使用
setState
方法来更新UI状态。
这个示例展示了如何使用flutter_app_preferences
插件进行基本的键值对存储和检索。你可以根据需要扩展这个示例,添加更多的数据类型(如整数、布尔值等)以及更复杂的存储逻辑。