Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/amma-family/keemun
https://github.com/amma-family/keemun
android android-architecture coroutines elm-architecture kotlin kotlin-multiplatform multiplatform mvi mvi-architecture mvu unidirectional-data-flow
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/amma-family/keemun
- Owner: AMMA-Family
- License: mit
- Created: 2020-12-09T09:46:20.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2022-06-20T00:18:26.000Z (over 2 years ago)
- Last Synced: 2023-10-20T16:57:52.790Z (over 1 year ago)
- Topics: android, android-architecture, coroutines, elm-architecture, kotlin, kotlin-multiplatform, multiplatform, mvi, mvi-architecture, mvu, unidirectional-data-flow
- Language: Kotlin
- Homepage:
- Size: 243 KB
- Stars: 14
- Watchers: 7
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/family.amma/keemun/badge.svg?style=plastic)](https://maven-badges.herokuapp.com/maven-central/family.amma/keemun)
# Keemun
Keemun is multiplatform Tea library.Add the library to your `build.gradle.kts` file.
```kotlin
implementation("family.amma:keemun:1.3.0")
```## Multiplatform part
### Entities
```kotlin
data class State(
val user: User?
)sealed class Msg {
data class UserWasLoaded(val user: User) : Msg()
}sealed class Effect {
object LoadUser : Effect()
}
```### An example of creating `FeatureParams`:
```kotlin
typealias SomeFeatureParams = FeatureParams
typealias SomeFeatureEffectHandler = EffectHandlerinternal fun someFeatureParams(effectHandler: SomeFeatureEffectHandler): SomeFeatureParams =
FeatureParams(
init = init,
update = updater,
effectHandler = effectHandler
)val init = InitFeature { previous ->
val state = previous ?: State(user = null)
state to setOf(Effect.LoadUser)
}val updater = Update { msg, state ->
when (msg) {
is Msg.UserWasLoaded -> state.copy(user = msg.user) to emptySet()
}
}fun effectHandler(repo: UserRepository) = SomeFeatureEffectHandler { effect, dispatch ->
when (effect) {
Effect.LoadUser -> {
val user = repo.loadUser()
dispatch(Msg.UserWasLoaded(user))
}
}
}
```## Platform part (Android)
```kotlin
data class ViewState(
// Example
// English - "Age: 30"
// Russian - "Возраст: 30"
// etc
val localizedAge: String?
)// StateTransform = suspend (State) -> ViewState
private fun stateTransform(getContext: () -> Context) = StateTransform { state ->
ViewState(
localizedAge = state.user?.age?.let { getContext().getString(R.string.age, it) }
)
}
```### Add to your Fragment/Activity
```kotlin
class SomeFragment(featureParams: () -> SomeFeatureParams) : Fragment(R.layout.fragment_some) {
private val feature by androidConnectors(featureParams, getStateTransform = { stateTransform(::requireContext) })override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
feature.render(this) { viewState ->
ageTextView.text = viewState.localizedAge
}
// OR
// feature.collectWithLifecycle(viewLifecycleOwner, Lifecycle.State.STARTED) { viewState -> }
}
}
```### Send messages to change state
```kotlin
feature dispatch Msg.Foo
feature syncDispatch Msg.Bar
```