Scott Whitman
12/24/2020, 1:19 PMKClass.objectInstance
doesn't seem to be available on JS or Native, only JVM. Are there any workarounds or libraries that I can use with expext/actual to accomplish something similar to T::class.objectInstance
Mustafa Ozhan
12/24/2020, 3:30 PMkoin
, you will need to make the object singleton
example:
single { SomeObject() }
then hold this method in commonMain
fun <T> Koin.getDependency(clazz: KClass<*>): T {
return get(clazz, null) { parametersOf(clazz.simpleName) } as T
}
this will be used for JS,Android and JVM
in same module add this method in iosMain
fun <T> Koin.getForIOS(objCClass: ObjCClass): T? = getOriginalKotlinClass(objCClass)?.let {
getDependency(it)
}
you will call this method from Swift code like this,
koin.getForIOS(objCClass: SomeObject.self) as! SomeObject
and from JVM, Android and JS
val someObject: SomeObject by lazy {
koin.getDependency(SomeObject::class)
}
Scott Whitman
12/24/2020, 3:48 PM// common
public expect inline fun <reified T: Any> KClass<T>.objectInstance(): T?
// JVM
//public actual inline fun <reified T: Any> KClass<T>.objectInstance(): T? = T::class.objectInstance
// JS & Native
//public actual inline fun <reified T: Any> KClass<T>.objectInstance(): T? = TODO()
public sealed class KlassInstance<T : Any>(public open val value: Any) {
public data class Klass<T : Any, R: T>(override val value: KClass<R>) : KlassInstance<T>(value)
public data class Instance<T : Any, R: T>(override val value: R) : KlassInstance<T>(value)
public companion object {
public inline fun <T : Any, reified R: T> create(instance: R? = null): KlassInstance<T> {
instance?.let { return Instance(it) }
R::class.objectInstance()?.let{ return Instance(it) }
return Klass(R::class)
}
}
}
Robert Jaros
12/24/2020, 8:51 PMkClass.js.createInstance()
Scott Whitman
12/24/2020, 10:23 PMScott Whitman
12/25/2020, 12:51 AMKClass.js
? Is there a dependency I can add to get it?Robert Jaros
12/25/2020, 2:35 AMcreateInstance
function is in fact my own function 🙂 But feel free to use it:
fun <T> Any?.createInstance(vararg args: dynamic): T {
val jsClassConstructor = this
val argsArray = (listOf<dynamic>(null) + args).toTypedArray()
return js("new (Function.prototype.bind.apply(jsClassConstructor, argsArray))").unsafeCast<T>()
}
Robert Jaros
12/25/2020, 2:36 AMJsClass<T>
extension for your need