Skip to content

Instantly share code, notes, and snippets.

@CompileConnected
Created September 11, 2023 15:52
Show Gist options
  • Select an option

  • Save CompileConnected/57a3f504c04e277afdf071eed53a6999 to your computer and use it in GitHub Desktop.

Select an option

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
@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())
}
}
}
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()
}
}
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)
}
)
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)
}
)
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