Created
September 11, 2023 15:52
-
-
Save CompileConnected/57a3f504c04e277afdf071eed53a6999 to your computer and use it in GitHub Desktop.
This is how to implement Koin Viewmodel using Moco ViewModel + Voyager Navigation targeted for KMM Composables
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @Composable | |
| fun App( | |
| darkTheme: Boolean, | |
| dynamicColor: Boolean, | |
| nativeModules: List<Module> = listOf(), //i usually not using this, but other can try :D | |
| ) { | |
| AppTheme( | |
| darkTheme = darkTheme, | |
| dynamicColor = dynamicColor | |
| ) { | |
| KoinApplication(modules = { | |
| listOf([YourModules]) + nativeModules | |
| }) { | |
| Navigator(LoginScreen()) | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import androidx.compose.runtime.Composable | |
| import androidx.compose.runtime.CompositionLocalProvider | |
| import androidx.compose.runtime.compositionLocalOf | |
| import org.koin.core.Koin | |
| import org.koin.core.annotation.KoinInternalApi | |
| import org.koin.core.module.Module | |
| import org.koin.dsl.koinApplication | |
| import org.koin.mp.KoinPlatformTools | |
| private fun getKoinContext() = KoinPlatformTools.defaultContext().get() | |
| @Composable | |
| fun Koin(): Koin = LocalKoinApplication.current | |
| val LocalKoinApplication = compositionLocalOf { getKoinContext() } | |
| @OptIn(KoinInternalApi::class) | |
| val LocalKoinScope = compositionLocalOf { getKoinContext().scopeRegistry.rootScope } | |
| @OptIn(KoinInternalApi::class) | |
| @Composable | |
| fun KoinApplication( | |
| modules: () -> List<Module>, | |
| content: @Composable () -> Unit | |
| ) { | |
| val koinApplication = koinApplication { modules(modules()) } | |
| CompositionLocalProvider( | |
| LocalKoinApplication provides koinApplication.koin, | |
| LocalKoinScope provides koinApplication.koin.scopeRegistry.rootScope | |
| ) { | |
| content() | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import androidx.compose.runtime.Composable | |
| import dev.icerock.moko.mvvm.compose.getViewModel | |
| import dev.icerock.moko.mvvm.compose.viewModelFactory | |
| import dev.icerock.moko.mvvm.viewmodel.ViewModel | |
| import org.koin.core.Koin | |
| @Composable | |
| internal inline fun<reified R : ViewModel> Koin.viewModelOf( | |
| key: String , | |
| crossinline constructor: () -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import androidx.compose.runtime.Composable | |
| import dev.icerock.moko.mvvm.compose.getViewModel | |
| import dev.icerock.moko.mvvm.compose.viewModelFactory | |
| import dev.icerock.moko.mvvm.viewmodel.ViewModel | |
| import org.koin.core.Koin | |
| @Composable | |
| internal inline fun<reified R : ViewModel> Koin.viewModelOf( | |
| key: String , | |
| crossinline constructor: () -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) | |
| @Composable | |
| internal inline fun<reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10> Koin.viewModelOf( | |
| key: String, | |
| crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, | |
| ): R = getViewModel( | |
| key = key, | |
| factory = viewModelFactory { | |
| new(constructor) | |
| } | |
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class LoginScreen : Screen { | |
| override val key: ScreenKey | |
| get() = uniqueScreenKey | |
| @Composable | |
| override fun Content() { | |
| val api = Koin().get<LoginApi>() | |
| val viewModel = Koin().viewModelOf("login-screen", ::LoginViewModel) | |
| //your compose code | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment