katana_prefs_annotation 2.1.9 copy "katana_prefs_annotation: ^2.1.9" to clipboard
katana_prefs_annotation: ^2.1.9 copied to clipboard

The annotation part of the package for type-safe use of retrieving and storing Shared Preferences values, defining data in a Freezed-like fashion.

Masamune logo

Katana Prefs

Follow on Twitter Follow on Threads Maintained with Melos

GitHub Sponsor


[GitHub] | [YouTube] | [Packages] | [Twitter] | [Threads] | [LinkedIn] | [mathru.net]


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);

GitHub Sponsors #

Sponsors are always welcome. Thank you for your support!

https://github.com/sponsors/mathrunet

0
likes
150
pub points
7%
popularity

Publisher

verified publishermathru.net

The annotation part of the package for type-safe use of retrieving and storing Shared Preferences values, defining data in a Freezed-like fashion.

Homepage
Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

katana

More

Packages that depend on katana_prefs_annotation