rx_shared_preferences 2.0.0-nullsafety.0 rx_shared_preferences: ^2.0.0-nullsafety.0 copied to clipboard
Rxdart streaming shared preferences. Reactive stream rxdart wrapper around SharedPreferences. A stream based wrapper over shared_preferences, allowing reactive key-value storage.
rx_shared_preferences #
Author: Petrus Nguyễn Thái Học #
- Shared preference with
rxdart
Stream observation. - Reactive shared preferences for
Flutter
. - Reactive stream wrapper around SharedPreferences.
- This package provides reactive shared preferences interaction with very little code. It is designed specifically to be used with Flutter and Dart.
Note #
Since version 1.3.4
, this package is an extension of rx_storage package.
More detail about returned Stream
#
-
It's a single-subscription stream (ie. it can only be listened once).
-
Stream
will emit the value or error as its first event when it is listen to (emitnull
when value is not set). -
It will automatic emits value when value associated with key was changed successfully (emit
null
when value associated with key wasremoved
or set tonull
). -
When read value is invalid type (ie. wrong type):
- If value is present (ie. not
null
), the stream will emitTypeError
error . - Otherwise, the stream will emit
null
(this occurred becausenull
can be cast to any type).
- If value is present (ie. not
-
Can emit two consecutive data events that are equal. You should use Rx operator like
distinct
(More commonly known asdistinctUntilChanged
in other Rx implementations) to create anStream
where data events are skipped if they are equal to the previous data event.
Getting Started #
In your flutter project, add the dependency to your pubspec.yaml
dependencies:
...
rx_shared_preferences: ^1.3.2
Usage #
1. Import and instance #
Import rx_shared_preferences
and shared_preferences
import 'package:rx_shared_preferences/rx_shared_preferences.dart';
import 'package:shared_preferences/shared_preferences.dart';
Wrap your SharedPreferences
in a RxSharedPreferences
.
final rxPrefs = RxSharedPreferences(await SharedPreferences.getInstance());
final rxPrefs = RxSharedPreferences(SharedPreferences.getInstance()); // await is optional
final rxPrefs = RxSharedPreferences.getInstance(); // default singleton instance
// via extension.
final rxPrefs = (await SharedPreferences.getInstance()).rx;
2. Can add a logger #
You can add logger optional parameter to RxSharedPreferences
constructor.
Logger will log messages about operations (such as read, write) and stream events
final rxPrefs = RxSharedPreferences(
SharedPreferences.getInstance(),
const DefaultLogger(),
);
You can custom Logger
by implements Logger
, or extends class LoggerAdapter
(with empty implementations)
class MyLogger extends LoggerAdapter {
const MyLogger();
@override
void readValue(Type type, String key, value) {
// do something
}
}
final rxPrefs = RxSharedPreferences(
SharedPreferences.getInstance(),
const MyLogger(),
);
3. Select stream and use #
- And then, just listen
Stream
, transformStream
through operators such as (map
,flatMap
, etc...). - If you need listen to this
Stream
many times, you can use broadcast operators such asshare
,shareValue
,publish
,publishValue
, etc...
// Listen
rxPrefs.getStringListStream('KEY_LIST').listen(print); // [*]
// Broadcast stream
rxPrefs.getStringListStream('KEY_LIST').share();
rxPrefs.getStringListStream('KEY_LIST').shareValue();
rxPrefs.getStringListStream('KEY_LIST').asBroadcastStream();
// Transform stream
rxPrefs.getIntStream('KEY_INT')
.map((i) => /* Do something cool */)
.where((i) => /* Filtering */)
...
// must **use same rxPrefs** instance when set value and select stream
rxPrefs.setStringList('KEY_LIST', ['Cool']); // [*] will print ['Cool']
-
In the previous example we re-used the RxSharedPreferences object
rxPrefs
for set operations. All set operations must go through this object in order to correctly notify subscribers. -
In flutter, you:
- Can create global
RxSharedPreferences
instance. - Using singleton instance
RxSharedPreferences.getInstance()
- Can use
InheritedWidget
/Provider
to provide aRxSharedPreferences
instance (create it inmain
function) for all widgets (recommended). See example/main, example/provider.
- Can create global
rxPrefs1.getStringListStream('KEY_LIST').listen(print); // [*]
rxPrefs2.setStringList('KEY_LIST', ['Cool']); // [*] will not print anything
The previous example is wrong usage.
4. Get and set methods like to SharedPreferences
#
RxSharedPreferences
is like to SharedPreferences
, it provides read, write functions:
- Future<bool> containsKey(String key);
- Future<dynamic> get(String key);
- Future<bool> getBool(String key);
- Future<double> getDouble(String key);
- Future<int> getInt(String key);
- Future<Set<String>> getKeys();
- Future<String> getString(String key);
- Future<List<String>> getStringList(String key);
- Future<bool> clear();
- Future<void> reload();
- Future<bool> commit();
- Future<bool> remove(String key);
- Future<bool> setBool(String key, bool value);
- Future<bool> setDouble(String key, double value);
- Future<bool> setInt(String key, int value);
- Future<bool> setString(String key, String value);
- Future<bool> setStringList(String key, List<String> value);
5. Dispose RxSharedPreferences
#
You can dispose RxSharedPreferences
when is no longer needed. Just call rxPrefs.dispose()
. Usually you call this method on dispose
of a State
Example demo #
Simple authentication app with BLoC rxdart pattern |
Build ListView from Stream using RxSharedPreferences |
Change theme and locale (language) runtime |
---|---|---|
License #
Copyright (c) 2019 Petrus Nguyễn Thái Học