Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tfcporciuncula/flow-preferences
Kotlin Flow version of rx-preferences -- Coroutines support for Android SharedPreferences
https://github.com/tfcporciuncula/flow-preferences
android coroutines flow kotlin kotlin-coroutines kotlin-flow preferences
Last synced: about 1 month ago
JSON representation
Kotlin Flow version of rx-preferences -- Coroutines support for Android SharedPreferences
- Host: GitHub
- URL: https://github.com/tfcporciuncula/flow-preferences
- Owner: tfcporciuncula
- License: apache-2.0
- Created: 2019-10-20T20:57:50.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2023-10-16T10:36:30.000Z (about 1 year ago)
- Last Synced: 2024-08-07T22:33:32.784Z (5 months ago)
- Topics: android, coroutines, flow, kotlin, kotlin-coroutines, kotlin-flow, preferences
- Language: Kotlin
- Homepage:
- Size: 326 KB
- Stars: 250
- Watchers: 4
- Forks: 20
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-list - tfcporciuncula/flow-preferences - Kotlin Flow version of rx-preferences -- Coroutines support for Android SharedPreferences (Kotlin)
README
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.fredporciuncula/flow-preferences/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.fredporciuncula/flow-preferences)
[![Build Status](https://github.com/tfcporciuncula/flow-preferences/workflows/CI/badge.svg)](https://github.com/tfcporciuncula/flow-preferences/actions?query=workflow%3ACI)
[![ktlint](https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg)](https://ktlint.github.io/)# Flow Preferences
This is the [Kotlin Flow](https://kotlinlang.org/docs/reference/coroutines/flow.html) version of
[rx-preferences](https://github.com/f2prateek/rx-preferences). It follows pretty much the same API and
should feel familiar to anyone with experience there. But instead of RxJava,
we have [Coroutines](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html) -- mainly Flows.## Download
```groovy
repositories {
mavenCentral()
}dependencies {
implementation 'com.fredporciuncula:flow-preferences:1.9.1'
}
```## How it looks like
Start with the regular `SharedPreferences`:
```kotlin
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
```Create an instance of `FlowSharedPreferences` from that:
```kotlin
val flowSharedPreferences = FlowSharedPreferences(sharedPreferences)
```Get a preference:
```kotlin
val myPref = flowSharedPreferences.getInt("key", defaultValue = 10)
```Go with the Flow:
```kotlin
myPref.asFlow().onEach { print(it) }.launchIn(scope)```
## Extras
### Set and commit support
Preferences expose the regular `get()` and `put()` (named as `set()`) functions from `SharedPreferences`.
But in addition to that, they also expose the `suspend` `setAndCommit()` function that puts the value and performs a
commit in case you must ensure the preference is persisted right away. There's also a `deleteAndCommit()`.### Collector support
You can call `asCollector()` to ask a
[`FlowCollector`](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-flow-collector/)
from a preference. You can then persist values from a Flow directly to the preference:```kotlin
val flow = flow { emit(1) }scope.launch {
myPref.asCollector().emitAll(flow)
}
```You can use `asSyncCollector()` if you want to put **and commit** the value (like `setAndCommit()`) on each emission.
### Enum support
Enum classes work out of the box and are persisted as strings based on their `name` value (so make sure you `@Keep` them
if you're using R8):```kotlin
enum class MyEnum { A, B, C }val myPref = flowSharedPreferences.getEnum("key", defaultValue = MyEnum.A)
```### Object support
Arbitrary objects are also supported as long as an instance of `ObjectPreference.Serializer` is provided:
```kotlin
class TestObject(val id: Int)val serializer =
object : ObjectPreference.Serializer {
override fun deserialize(serialized: String) = TestObject(serialized.toInt())
override fun serialize(value: TestObject) = value.id.toString()
}val myPref = flowSharedPreferences.getObject("key", serializer, defaultValue = TestObject(0))
```### Explicit nullability support
By default, strings, objects, enums and sets can never be `null`, so consumers don't ever have to worry about
`null` checks. If you want to support nullable values, you can explicitly opt in by asking for the
nullable-friendly preference types:```kotlin
val nullableStringPreference = flowSharedPreferences.getNullableString("key", defaultValue = null)
```# ⁕