@@ -3,24 +3,36 @@ package com.example.fruitties.di.viewmodel
3
3
import androidx.lifecycle.ViewModel
4
4
import androidx.lifecycle.ViewModelProvider
5
5
import androidx.lifecycle.ViewModelStore
6
+ import androidx.lifecycle.ViewModelStoreOwner
6
7
import androidx.lifecycle.viewmodel.CreationExtras
7
8
import kotlinx.cinterop.BetaInteropApi
8
9
import kotlinx.cinterop.ObjCClass
9
10
import kotlinx.cinterop.getOriginalKotlinClass
10
11
import kotlin.reflect.KClass
11
12
13
+ /* *
14
+ * This function allows retrieving any ViewModel from Swift Code with generics.
15
+ * We only get [ObjCClass] type for the [modelClass], because the interop between Kotlin and Swift
16
+ * code doesn't preserve the generic class, but we can retrieve the original KClass in Kotlin.
17
+ */
12
18
@Suppress(" unused" ) // Android Studio is not aware of iOS usage.
13
19
@OptIn(BetaInteropApi ::class )
14
20
@Throws(IllegalStateException ::class )
15
21
fun ViewModelStore.getViewModel (
16
22
modelClass : ObjCClass ,
17
23
factory : ViewModelProvider .Factory ,
18
24
key : String? ,
19
- extras : CreationExtras ,
25
+ extras : CreationExtras ? = null ,
20
26
): ViewModel {
21
27
@Suppress(" UNCHECKED_CAST" )
22
28
val vmClass = getOriginalKotlinClass(modelClass) as ? KClass <ViewModel >
23
29
? : error(" modelClass isn't a ViewModel type" )
24
- val provider = ViewModelProvider .create(this , factory, extras)
30
+ val provider = ViewModelProvider .create(this , factory, extras ? : CreationExtras . Empty )
25
31
return key?.let { provider[key, vmClass] } ? : provider[vmClass]
26
32
}
33
+
34
+ /* *
35
+ * The ViewModelStoreOwner isn't used anywhere in the project, therefore it's not visible for Swift by default.
36
+ */
37
+ @Suppress(" unused" )
38
+ interface SwiftViewModelStoreOwner : ViewModelStoreOwner
0 commit comments