Flutter偏好设置管理插件katana_prefs的使用
Flutter偏好设置管理插件katana_prefs的使用
Katana Prefs
[GitHub] | [YouTube] | [Packages] | [Twitter] | [Threads] | [LinkedIn] | [mathru.net]
简介
Shared Preferences 是一个非常有用的插件。
我认为这个插件是存储应用程序简单数据的最佳方式。
然而,在使用系统时,我有以下抱怨:
- 需要记住键,因为键将是字符串类型。
- 要检索的值的类型也取决于键,并且必须记住。
- SharedPreferences 的实例需要异步获取。
在大多数情况下,我认为它们被封装在一个单独的类中或类似的东西中,以便更易于使用。
为了消除上述问题,我创建了以下包:
- 使用类似于 Freezed 的标记自动生成读取/写入 SharedPreferences 数据的类
- 参数类型和键是预定义的,允许类型安全的实现
- 缓存 SharedPreferences 实例,以便可以同步获取数据
- 继承自
ChangeNotifier
,因此可以检测值的变化并执行某些操作
例如,使用以下语句:
[@prefs](/user/prefs)
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
}
当运行 build_runner 时,将自动生成一个可以读取和写入 SharedPreferences 数据的类。
通过定义这一点,可以在任何地方读取和写入数据。
final appPrefs = PrefsValue(volumeSetting: 0.5);
class PrefsPage extends StatefulWidget {
const PrefsPage({super.key});
[@override](/user/override)
State<StatefulWidget> createState() => PrefsPageState();
}
class PrefsPageState extends State<PrefsPage> {
[@override](/user/override)
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
appPrefs.load();
}
[@override](/user/override)
Widget build(BuildContext context, WidgetRef ref){
final volumeSetting = appPrefs.volumeSetting.get();
~~~~
appPrefs.volumeSetting.set(1.0); // 在此,appPrefs 也会收到更改通知并重新更新小部件。
~~~~
}
}
安装
导入以下包以使用 build_runner 进行代码生成。
flutter pub add katana_prefs
flutter pub add --dev build_runner
flutter pub add --dev katana_prefs_builder
实现
创建类
创建一个类如下:
添加 part '(filename).prefs.dart';
。
使用 [@prefs](/user/prefs)
注解定义的类,并混入 _$(定义的类名)
和 ChangeNotifier
。
构造函数在 factory
中创建,并定义参数中要使用的值。
(必需的值用 required
标记;如果没有标记为必需,则保留原样。)
在构造函数之后,写入 = _(定义的类名)
。
// prefs_value.dart
import 'package:flutter/material.dart';
import 'package:katana_prefs/katana_prefs.dart';
part 'prefs_value.prefs.dart';
[@prefs](/user/prefs)
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
}
代码生成
通过输入以下命令进行自动代码生成。
flutter pub run build_runner build --delete-conflicting-outputs
如何使用
全局定义值。
创建对象时,输入在 <code>required</code>
中指定的值。这将成为初始值。
final appPrefs = PrefsValue(volumeSetting: 0.5);
在加载第一个值之前,调用 <code>load()</code>
方法并等待其完成。
(也可以通过监视 <code>loading</code>
字段来等待结束。)
@Override
void initState() {
super.initState();
appPrefs.load();
}
如果需要,可以通过 <code>addListener</code>
监视状态。
@Override
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
appPrefs.load();
}
可以通过 <code>appPrefs.(定义的值).get()</code>
从 SharedPreferences 中检索数据。
final volumeSetting = appPrefs.volumeSetting.get();
可以通过 <code>appPrefs.(定义的值).set(value)</code>
将数据存储到 SharedPreferences。
保存完成后,将调用 <code>notifyListeners()</code>
以执行由 <code>addListener</code>
监视的回调。
appPrefs.volumeSetting.set(1.0);
GitHub 赞助者
赞助者永远受欢迎。感谢您的支持!
https://github.com/sponsors/mathrunet
示例代码
// Flutter imports:
import 'package:flutter/material.dart';
// Package imports:
import 'package:katana_prefs/katana_prefs.dart';
part 'main.prefs.dart';
[@prefs](/user/prefs)
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
PrefsValue._();
}
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: const PrefsPage(),
title: "Flutter Demo",
theme: ThemeData(
primarySwatch: Colors.blue,
),
);
}
}
class PrefsPage extends StatefulWidget {
const PrefsPage({super.key});
[@override](/user/override)
State<StatefulWidget> createState() => PrefsPageState();
}
class PrefsPageState extends State<PrefsPage> {
final prefs = PrefsValue(volumeSetting: 0.5);
[@override](/user/override)
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
prefs.load();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Flutter Demo")),
body: ListView(
children: [
ListTile(
title: TextField(
controller: TextEditingController(text: prefs.userToken.get()),
onChanged: (val) async {
await prefs.userToken.set(val);
},
),
),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Text("Volume Settings"),
),
ListTile(
title: Slider(
value: prefs.volumeSetting.get(),
onChanged: (val) {
prefs.volumeSetting.set(val);
},
),
trailing: Text(
"${prefs.volumeSetting.get().toStringAsFixed(1)}/1.0",
),
),
],
),
);
}
}
更多关于Flutter偏好设置管理插件katana_prefs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter偏好设置管理插件katana_prefs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用katana_prefs
插件进行偏好设置管理的代码示例。katana_prefs
是一个用于简化偏好设置(如用户设置、应用状态等)管理的Flutter插件。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加katana_prefs
的依赖:
dependencies:
flutter:
sdk: flutter
katana_prefs: ^最新版本号 # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 初始化KatanaPrefs
在你的主文件(通常是main.dart
)中,你需要初始化KatanaPrefs
:
import 'package:flutter/material.dart';
import 'package:katana_prefs/katana_prefs.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 初始化KatanaPrefs
KatanaPrefs.init(context);
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
3. 使用KatanaPrefs进行偏好设置管理
接下来,你可以在你的页面或组件中使用KatanaPrefs
来保存和读取偏好设置。以下是一个简单的示例,展示如何保存和读取一个布尔值偏好设置:
import 'package:flutter/material.dart';
import 'package:katana_prefs/katana_prefs.dart';
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _isDarkMode = false;
@override
void initState() {
super.initState();
// 从偏好设置中读取isDarkMode的值
KatanaPrefs.getBool('isDarkMode').then((value) {
if (value != null) {
setState(() {
_isDarkMode = value;
});
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('KatanaPrefs Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Dark Mode: $_isDarkMode',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
setState(() {
_isDarkMode = !_isDarkMode;
// 保存isDarkMode的值到偏好设置
KatanaPrefs.setBool('isDarkMode', _isDarkMode);
});
},
child: Text('Toggle Dark Mode'),
),
],
),
),
);
}
}
4. 运行应用
现在,你可以运行你的Flutter应用,并看到一个可以切换“Dark Mode”的按钮。当你切换开关并重新启动应用时,你会看到之前保存的设置值。
这个示例展示了如何使用katana_prefs
插件来管理简单的布尔值偏好设置。同样的方法也可以用于保存和读取其他类型的数据,如字符串、整数、浮点数、列表和映射。只需使用KatanaPrefs
提供的相应方法(如getString
、setInt
、setDouble
、setList
、setMap
等)即可。