katana_prefs_builder 2.1.19 copy "katana_prefs_builder: ^2.1.19" to clipboard
katana_prefs_builder: ^2.1.19 copied to clipboard

Building system for katana prefs packages. 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;
}
copied to clipboard

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.
    ~~~~
  }
}
copied to clipboard

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
copied to clipboard

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;
}
copied to clipboard

Code Generation #

Automatic code generation is performed by entering the following command.

flutter pub run build_runner build --delete-conflicting-outputs
copied to clipboard

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);
copied to clipboard

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();
}
copied to clipboard

The state can be monitored with addListener if necessary.

@override
void initState() {
  super.initState();
  prefs.addListener(() {
    setState(() {});
  });
  appPrefs.load();
}
copied to clipboard

It is possible to retrieve data from SharedPreference with appPrefs.(defined value).get().

final volumeSetting = appPrefs.volumeSetting.get();
copied to clipboard

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);
copied to clipboard

GitHub Sponsors #

Sponsors are always welcome. Thank you for your support!

https://github.com/sponsors/mathrunet

1
likes
140
points
468
downloads

Publisher

verified publishermathru.net

Weekly Downloads

2024.07.29 - 2025.02.10

Building system for katana prefs packages. 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

analyzer, build, code_builder, dart_style, katana, katana_builder, katana_prefs_annotation, source_gen

More

Packages that depend on katana_prefs_builder