Ricardo C.
08/03/2020, 6:07 PMjim
08/03/2020, 6:08 PMZach Klippenstein (he/him) [MOD]
08/03/2020, 6:12 PMRicardo C.
08/03/2020, 6:16 PMRicardo C.
08/03/2020, 6:17 PMRicardo C.
08/03/2020, 6:25 PMAppContent(
navigationViewModel = navigationViewModel,
interestsRepository = appContainer.interestsRepository,
postsRepository = appContainer.postsRepository
)
From this point below it's manual.
I've been trying to do all of these automatically with dagger but always hit some issue that I don't know how to get aroundRicardo C.
08/03/2020, 6:27 PMRicardo C.
08/03/2020, 6:27 PMZach Klippenstein (he/him) [MOD]
08/03/2020, 6:28 PMRicardo C.
08/03/2020, 6:33 PMRicardo C.
08/03/2020, 6:34 PMAdrian Blanco
08/03/2020, 7:25 PMFudge
08/03/2020, 9:33 PMFudge
08/03/2020, 9:33 PMpopalay
08/04/2020, 4:32 AMJoost Klitsie
08/04/2020, 10:50 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
fun composeSubDI(
diBuilder: DI.MainBuilder.() -> Unit,
props: Any = EmptyProps,
content: @Composable() () -> Unit
) = Providers(
DIAmbient provides remember(
props,
calculation = { subDI(DIAmbient.current, init = diBuilder) }),
children = content
)
Usage is simple:
@Composable
fun loginComponent() {
composeSubDI(diBuilder = {
import(loginViewModule())
}) {
val viewModel by instance<LoginContract.ViewModel>()
val viewState = viewModel.viewState.collectAsState(AndroidUiDispatcher.Main).value
Column {
OutlinedTextField(value = viewState.userName, onValueChange = viewModel::updateUserName, label = {})
OutlinedTextField(value = viewState.password, onValueChange = viewModel::updatePassword, label = {})
OutlinedButton(onClick = viewModel::onLoginPressed) { Text("Login") }
}
}
}
Joost Klitsie
08/04/2020, 10:51 AMJoost Klitsie
08/04/2020, 10:52 AM