deviant
10/22/2021, 10:50 AMviewModel
helper factory available only for android projects. so we use the factory
extension temporarily. but it recreates viewModel each time.wbertan
10/22/2021, 11:07 AMBaseViewModel
expect abstract class BaseViewModel()
And we create an actual
for Android and another for iOS:
Android:
actual abstract class BaseViewModel : ViewModel()
Which the Android extends androidx.lifecycle.ViewModel
, which will work nicely with the Lifecycles.
And the iOS just the simple one:
actual abstract class BaseViewModel
deviant
10/22/2021, 11:09 AMwbertan
10/22/2021, 11:10 AMviewModel
method, but for iOS we had to make it a factory
.deviant
10/22/2021, 11:11 AMwbertan
10/22/2021, 11:11 AMexpect inline fun <reified T : BaseViewModel<*, *>> Module.viewModelDefinition(
qualifier: Qualifier? = null,
noinline definition: Definition<T>
): Pair<Module, InstanceFactory<T>>
While then for Android the implementation will call the Koin `viewModel`:
actual inline fun <reified T : BaseViewModel<*, *>> Module.viewModelDefinition(
qualifier: Qualifier?,
noinline definition: Definition<T>,
): Pair<Module, InstanceFactory<T>> = viewModel(qualifier = qualifier, definition = definition)
And for iOS will use a `factory`:
actual inline fun <reified T : BaseViewModel<*, *>> Module.viewModelDefinition(
qualifier: Qualifier?,
noinline definition: Definition<T>,
): Pair<Module, InstanceFactory<T>> = factory(qualifier = qualifier, definition = definition)
deviant
10/22/2021, 11:15 AMVladimir Vasic
07/22/2022, 8:30 AMactual inline fun <reified T : BaseViewModel> Module.viewModelDefinition(
qualifier: Qualifier?,
noinline definition: Definition<T>,
): Pair<Module, InstanceFactory<T>> = viewModel(qualifier = qualifier, definition = definition)
Also when I want to use this inside a fragment, how am I calling it?Vladimir Vasic
07/22/2022, 8:30 AMwbertan
07/22/2022, 8:46 AMBaseViewModel
? Do you have any generics there as well?
In the fragment we just do
private val viewModel: MyViewModel by viewModel()
That viewModel
is from Koin:
import org.koin.androidx.viewmodel.ext.android.viewModel
Vladimir Vasic
07/22/2022, 9:17 AMopen class BaseViewModel : ViewModel() {
open fun onViewCreated() {}
open fun onViewResumed() {}
open fun onViewPaused() {}
open fun onViewStopped() {}
}
I use no generics.
Soo I still use the same implementation with koin in module right?
val loginModule = module {
viewModel {
LoginViewModel(get())
}
}
wbertan
07/22/2022, 10:12 AMopen class Asas : ViewModel() {
open fun onViewCreated() {}
open fun onViewResumed() {}
open fun onViewPaused() {}
open fun onViewStopped() {}
}
inline fun <reified T : Asas> Module.viewModelDefinition(
qualifier: Qualifier?,
noinline definition: Definition<T>
): Pair<Module, InstanceFactory<T>> = viewModel(qualifier = qualifier, definition = definition)
In the Koin Module, you should then not use the viewModel
, but instead that viewModelDefinition
val loginModule = module {
viewModelDefinition {
MyViewModel()
}
}
wbertan
07/22/2022, 10:13 AMkoin = "3.2.0"
const val agp = "7.2.1"
const val kotlin = "1.7.0"
Vladimir Vasic
07/22/2022, 12:23 PM