Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用
Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用
这个包允许你像处理带有值获取器、设置器和变化流的字段一样来处理共享偏好设置。
这个包依赖于field_delegate。它是一个抽象的可变字段委托,可以用作访问不同数据源的接口。
使用
要创建一个SharedPreferencesField
,你需要创建一个SharedPreferencesFieldFactory
并调用一个方法,该方法具有所需类型,并传递可以通过该键从共享偏好设置请求值的键。例如SharedPreferencesFieldFactory().int('key')
。
final fieldFactory = SharedPreferencesFieldFactory(sharedPreferences);
Field<int?> intField = factory.int(intFieldKey);
int value = intField.get();
Future<void> result = intField.set(1);
Stream<int> changes = intField.onChanged;
SharedPreferencesField
有一个泛型类型,默认情况下它是可空的,但你可以添加一个默认值使其成为非可空的Field
。
Field<int?> intNullableField;
Field<int> notNullableField = Field.notNullable(
source: nullableFiled,
defaultValue: 0,
);
你可以使用Field.map
函数将Field
的值映射到其他类型。
Field<int> intField;
Field<String> mappedField = Field.map<int, String>(
source: intField,
mapToSource: (value) => int.parse(value),
mapFromSource: (value) => value.toString(),
);
SharedPreferencesFieldFactory
有一个dispose方法,用于取消此工厂创建的字段的流。
final fieldFactory = SharedPreferencesFieldFactory(sharedPreferences);
Field<int?> intField = factory.int(intFieldKey);
//...
fieldFactory.dispose();
完整示例
以下是一个完整的示例,展示了如何使用shared_preferences_field_delegate
。
示例代码
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:shared_preferences_field_delegate/shared_preferences_field_delegate.dart';
late Field<int> counterSharedPreferencesField;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final sharedPreferences = await SharedPreferences.getInstance();
final fieldFactory = SharedPreferencesFieldFactory(sharedPreferences);
counterSharedPreferencesField = Field.notNullable(
source: fieldFactory.int('counterSharedPreferencesField'),
defaultValue: 0,
);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
set _counter(int value) {
counterSharedPreferencesField.set(value);
}
int get _counter => counterSharedPreferencesField.get();
void _incrementCounter() {
setState(() {
_counter++;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
更多关于Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,shared_preferences
是一个常用的插件,用于在本地存储简单的键值对数据。而 shared_preferences_field_delegate
是一个基于 shared_preferences
的插件,它通过字段委托的方式简化了数据的存储和读取操作。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 shared_preferences
和 shared_preferences_field_delegate
插件的依赖:
dependencies:
flutter:
sdk: flutter
shared_preferences: ^2.0.6
shared_preferences_field_delegate: ^1.0.0
然后运行 flutter pub get
以安装依赖。
2. 基本使用
2.1 导入包
在你的 Dart 文件中导入所需的包:
import 'package:shared_preferences/shared_preferences.dart';
import 'package:shared_preferences_field_delegate/shared_preferences_field_delegate.dart';
2.2 创建 SharedPreferences 实例和 Field Delegate
首先,你需要获取 SharedPreferences
的实例,然后使用它来创建 SharedPreferencesFieldDelegate
实例:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
final delegate = SharedPreferencesFieldDelegate(prefs);
runApp(MyApp(delegate: delegate));
}
2.3 使用 Field Delegate 存储和读取数据
你可以使用 delegate
来存储和读取数据。SharedPreferencesFieldDelegate
提供了多种类型的字段委托,例如 StringFieldDelegate
、IntFieldDelegate
、BoolFieldDelegate
等。
class MyApp extends StatelessWidget {
final SharedPreferencesFieldDelegate delegate;
MyApp({required this.delegate});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SharedPreferences Field Delegate Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
// 存储字符串
await delegate.setString('username', 'JohnDoe');
},
child: Text('Store Username'),
),
ElevatedButton(
onPressed: () async {
// 读取字符串
String? username = delegate.getString('username');
print('Username: $username');
},
child: Text('Read Username'),
),
ElevatedButton(
onPressed: () async {
// 存储布尔值
await delegate.setBool('isLoggedIn', true);
},
child: Text('Store Login Status'),
),
ElevatedButton(
onPressed: () async {
// 读取布尔值
bool? isLoggedIn = delegate.getBool('isLoggedIn');
print('Is Logged In: $isLoggedIn');
},
child: Text('Read Login Status'),
),
],
),
),
),
);
}
}
3. 高级用法
shared_preferences_field_delegate
还支持更高级的用法,比如使用 EnumFieldDelegate
来存储和读取枚举值。
enum ThemeMode { light, dark }
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final prefs = await SharedPreferences.getInstance();
final delegate = SharedPreferencesFieldDelegate(prefs);
runApp(MyApp(delegate: delegate));
}
class MyApp extends StatelessWidget {
final SharedPreferencesFieldDelegate delegate;
MyApp({required this.delegate});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SharedPreferences Field Delegate Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
// 存储枚举值
await delegate.setEnum('theme', ThemeMode.dark);
},
child: Text('Store Theme Mode'),
),
ElevatedButton(
onPressed: () async {
// 读取枚举值
ThemeMode? theme = delegate.getEnum('theme', ThemeMode.values);
print('Theme Mode: $theme');
},
child: Text('Read Theme Mode'),
),
],
),
),
),
);
}
}