Skip to content

Commit 74c8b8c

Browse files
committed
Add MviComponent
1 parent cd656cc commit 74c8b8c

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

amvi-component-compose/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ tasks.withType<Test>().configureEach {
1212

1313
dependencies {
1414
implementation(compose.desktop.currentOs)
15+
api(project(":amvi-viewmodel"))
1516
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package ru.kode.amvi.component.compose
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.DisposableEffect
5+
import androidx.compose.runtime.LaunchedEffect
6+
import androidx.compose.runtime.collectAsState
7+
import androidx.compose.runtime.getValue
8+
import androidx.compose.runtime.remember
9+
import ru.kode.amvi.viewmodel.ViewIntents
10+
import ru.kode.amvi.viewmodel.ViewModel
11+
12+
@Composable
13+
fun <S : Any, I : ViewIntents> MviComponent(
14+
presenter: ViewModel<S, I>,
15+
intents: I,
16+
content: @Composable (state: S, intents: I) -> Unit,
17+
) {
18+
LifecycleEffect(presenter, intents)
19+
val state by presenter.viewStateFlow.collectAsState()
20+
content(state, intents)
21+
}
22+
23+
@Composable
24+
inline fun <reified VI : ViewIntents> rememberViewIntents(): VI {
25+
return remember { VI::class.java.getDeclaredConstructor().newInstance() }
26+
}
27+
28+
@Composable
29+
private fun <VI : ViewIntents, VM : ViewModel<*, VI>> LifecycleEffect(viewModel: VM, intents: VI) {
30+
LaunchedEffect(Unit) {
31+
viewModel.attach(intents)
32+
}
33+
DisposableEffect(Unit) {
34+
onDispose {
35+
viewModel.detach()
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)