katana_prefs 2.0.2 katana_prefs: ^2.0.2 copied to clipboard
The base part of the package for type-safe use of retrieving and storing Shared Preferences values, defining data in a Freezed-like fashion.
Katana Prefs
[YouTube] | [Packages] | [Twitter] | [LinkedIn]
Introduction #
Shared Preferences is a useful plugin.
I think this plugin is the best way to store simple data for the application.
However, I have the following complaints when using the system.
- Need to remember the key because the key will be a String type.
- The type of value to be retrieved also depends on the key and must be remembered.
- Instances of SharedPreferences need to be retrieved asynchronously
In most cases, I think they are wrapped in a separate class or something to make them easier to use.
I have created the following package to solve the above problems.
- Automatic generation of classes to read/write SharedPreferences data with Freezed-like notation
- Parameter types and keys are predefined, allowing type-safe implementation
- Cache instances of SharedPreferences so that data can be retrieved synchronously
- Inherits from
ChangeNotifier
, so it is possible to detect a change in value and do something with it.
For example, the following statement is used
@prefs
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
}
When build_runner is run with this, a class that can read and write SharedPreferences data is automatically generated.
By defining this, data can be read and written anywhere.
final appPrefs = PrefsValue(volumeSetting: 0.5);
class PrefsPage extends StatefulWidget {
const PrefsPage({super.key});
@override
State<StatefulWidget> createState() => PrefsPageState();
}
class PrefsPageState extends State<PrefsPage> {
@override
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
appPrefs.load();
}
@override
Widget build(BuildContext context, WidgetRef ref){
final volumeSetting = appPrefs.volumeSetting.get();
~~~~
appPrefs.volumeSetting.set(1.0); // At this time, appPrefs is also notified of the change and the widget is re-updated.
~~~~
}
}
Installation #
Import the following package for code generation using build_runner.
flutter pub add katana_prefs
flutter pub add --dev build_runner
flutter pub add --dev katana_prefs_builder
Implementation #
Make a Class #
Create a class as follows
Add part '(filename).prefs.dart';
.
Annotate the defined class with @prefs
and mixin _$(defined class name)
and ChangeNotifier
.
The constructor is created in the factory
and defines the values to be used in the parameters.
(Required values are marked required
; if required is not marked, leave it as it is.)
After the constructor, write = _(defined class name)
.
// prefs_value.dart
import 'package:flutter/material.dart';
import 'package:katana_prefs/katana_prefs.dart';
part 'prefs_value.prefs.dart';
@prefs
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
}
Code Generation #
Automatic code generation is performed by entering the following command.
flutter pub run build_runner build --delete-conflicting-outputs
How to use #
Define values globally.
When creating an object, enter the value specified in required
. This will be the initial value.
final appPrefs = PrefsValue(volumeSetting: 0.5);
Before loading the first value, it executes the load()
method and waits for it to finish.
(It is also possible to wait for the end by monitoring the loading
field.)
@override
void initState() {
super.initState();
appPrefs.load();
}
The state can be monitored with addListener
if necessary.
@override
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
appPrefs.load();
}
It is possible to retrieve data from SharedPreference with appPrefs.(defined value).get()
.
final volumeSetting = appPrefs.volumeSetting.get();
Data can be stored in SharedPreference with appPrefs.(defined value).set(value)
.
When the save is complete, notifyListeners()
is called to execute the callback monitored by addListener.
appPrefs.volumeSetting.set(1.0);