Hello, I've experiencing an unused import issue wi...
# coroutines
j
Hello, I've experiencing an unused import issue with
<http://Dispatchers.IO|Dispatchers.IO>
in KMP common. The import
import <http://kotlinx.coroutines.IO|kotlinx.coroutines.IO>
(from core-ios) is marked as "unused", when I am configuring the project to target android only (excluding all iOS targets for faster build). As far as I understood, it uses
import kotlinx.coroutines.Dispatchers
when targetting JVM (from core-jvm) to reference the IO Dispatcher. But when I am configuring the project to target both Android and iOS, the imports in common
import <http://kotlinx.coroutines.IO|kotlinx.coroutines.IO>
as well as
import kotlinx.coroutines.Dispatchers
are now required, because: I don't really understand why there are different IO paths to import iOS/Android IO Dispatcher. Anyone could help me out to fix this unused import, when I just want to target Android? See 🧵 for more TLDR: android target only requires
import kotlinx.coroutines.Dispatchers
, android + ios requires
import kotlinx.coroutines.Dispatchers
and
import <http://kotlinx.coroutines.IO|kotlinx.coroutines.IO>
Copy code
// JVM implementation
public actual object Dispatchers {

    @JvmStatic
    public actual val Default: CoroutineDispatcher = DefaultScheduler

    @JvmStatic
    public actual val Main: MainCoroutineDispatcher get() = MainDispatcherLoader.dispatcher

    @JvmStatic
    public actual val Unconfined: CoroutineDispatcher = kotlinx.coroutines.Unconfined

    @JvmStatic
    public val IO: CoroutineDispatcher = DefaultIoScheduler // The  reference of IO Dispatcher for JVM

    @DelicateCoroutinesApi
    public fun shutdown() {
        DefaultExecutor.shutdown()
        DefaultScheduler.shutdown()
    }
}

@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
@Deprecated(message = "Should not be used directly", level = DeprecationLevel.HIDDEN)
public actual val <http://Dispatchers.IO|Dispatchers.IO>: CoroutineDispatcher get() = <http://Dispatchers.IO|Dispatchers.IO> // Conflict??
JVM Implemtatio referencing the
<http://Dispatchers.IO|Dispatchers.IO>
from object, as you can see the actual val is shadowed..
Copy code
// iOS implementation
public actual object Dispatchers {
    public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
    public actual val Main: MainCoroutineDispatcher
        get() = injectedMainDispatcher ?: mainDispatcher
    public actual val Unconfined: CoroutineDispatcher get() = kotlinx.coroutines.Unconfined // Avoid freezing

    private val mainDispatcher = createMainDispatcher(Default)

    private var injectedMainDispatcher: MainCoroutineDispatcher? = null

    @PublishedApi
    internal fun injectMain(dispatcher: MainCoroutineDispatcher) {
        injectedMainDispatcher = dispatcher
    }

    internal val IO: CoroutineDispatcher = DefaultIoScheduler
}

internal object DefaultIoScheduler : CoroutineDispatcher() {
    ... // omitted
}


@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
public actual val <http://Dispatchers.IO|Dispatchers.IO>: CoroutineDispatcher get() = IO // The reference of IO dispatcher for Kotlin/Native targets

internal expect fun createMainDispatcher(default: CoroutineDispatcher): MainCoroutineDispatcher
Kotlin/Native implementation, reference is now a shadowed field