InsertKoinIO / koin

Koin - a pragmatic lightweight dependency injection framework for Kotlin & Kotlin Multiplatform
https://insert-koin.io
Apache License 2.0
8.75k stars 694 forks source link

Support androidx SavedStateHandle for kotlin multiplatform #1878

Open aminshojaei13 opened 1 month ago

aminshojaei13 commented 1 month ago

Describe the bug org.koin.core.error.NoBeanDefFoundException: No definition found for type 'androidx.lifecycle.SavedStateHandle'.

Koin module and version:

Snippet or Sample project to help reproduce

// commonMain
class RegisterViewModel(
    private val savedStateHandle: SavedStateHandle,
    ...
) : ViewModel() {
}

// commonMain
@OptIn(KoinExperimentalAPI::class)
@Composable
@NonRestartableComposable
fun RegisterScreen() {
    ScreenContent(
        viewModel = koinViewModel<RegisterViewModel>()
    )
}

// commonMain
expect val viewModelModule: Module

// androidMain
actual val viewModelModule: Module = module {
    viewModelOf(::RegisterViewModel)
}

// iosMain
actual val viewModelModule: Module = module {
    factoryOf(::RegisterViewModel)
}
Navidhp commented 1 month ago

1- I couldn't wait for the update, this temporary route works for now 2- And another problem that exists is that arguments are not saved in SavedStateHandle

composable(
    route = Screen.MyScreen.route + myArgument(),
) {
    MyScreen(
        parametersHolder = parametersOf(SavedStateHandle.createHandle(null, it.arguments))
    )
}
@Composable
fun MyScreen(
    modifier: Modifier = Modifier,
    parametersHolder: ParametersHolder,
    viewModel: MyViewModel = koinViewModel<MyViewModel>(parameters = { parametersHolder })
) {
 // Screen
}