nrobi
10/08/2020, 7:30 AMJoost Klitsie
10/08/2020, 8:15 AMval DIAmbient = ambientOf { DI {} }
@Composable
inline fun <reified T : Any> instance(): DIProperty<T> = DIAmbient.current.instance()
@Composable
inline fun <reified A : Any, reified T : Any> instance(arg: A?): DIProperty<T> = arg?.let {
DIAmbient.current.instance<A, T>(arg = it)
} ?: instance()
object EmptyProps
@Composable
inline fun composeSubDI(
crossinline diBuilder: DI.MainBuilder.(scope: CoroutineScope) -> Unit,
props: Any = EmptyProps,
noinline content: @Composable () -> Unit
) {
val currentDi = DIAmbient.current
val composedScope = remember(props) {
CoroutineScope(Dispatchers.Main)
}
onDispose {
composedScope.cancel()
}
Providers(
DIAmbient provides remember(props) {
subDI(currentDi) { diBuilder(composedScope) }
},
children = content
)
}
fun exampleComponentBuilder(): DI.MainBuilder.(scope: CoroutineScope) -> Unit = {
import(exampleModule())
}
@Composable
fun exampleComponent() {
composeSubDI(diBuilder = exampleComponentBuilder()) {
val viewModel by instance<ExampleContract.ViewModel>()
val viewState = viewModel.viewState.collectAsState(AndroidUiDispatcher.Main).value
OutlinedButton(onClick = viewModel::onButtonClicked) {
Text(viewState.buttonText, color = MaterialTheme.colors.primary)
}
}
}