You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM中解决Koin InstanceCreationException实例创建异常问题

解决Kotlin Multiplatform中Koin创建TrackerRepository实例异常问题

问题背景

我正在用Kotlin Multiplatform开发SDK,需实现网络连通性检查功能并编写单元测试,采用MVVM架构。

定义的expect类如下:

expect class Connectivity {
    fun isInternetConnected(): Boolean
}

Android平台的actual实现类:

actual class Connectivity(val context: Context) {
    actual fun isInternetConnected(): Boolean {
        val connectivityManager =
            context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val capabilities =
            connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)

        if (capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true) {
            PlatformLogger("Internet").logI("NetworkCapabilities.TRANSPORT_CELLULAR", null)
            return true
        } else if (capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true) {
            PlatformLogger("Internet").logI("NetworkCapabilities.TRANSPORT_WIFI", null)
            return true
        } else if (capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) == true) {
            PlatformLogger("Internet").logI("NetworkCapabilities.TRANSPORT_ETHERNET", null)
            return true
        }
        PlatformLogger("Internet").logI("No Internet available", null)

        return false
    }
}

iOS平台的actual实现类:

actual class Connectivity {
    @OptIn(ExperimentalForeignApi::class)
    actual fun isInternetConnected(): Boolean {
        memScoped {
            val reachability = SCNetworkReachabilityCreateWithName(null, "www.google.com")
            val flags = alloc<UIntVar>()
            val gotFlags = SCNetworkReachabilityGetFlags(reachability, flags.ptr)
            if (!gotFlags) {
                PlatformLogger("Network-IOS").logI("Could not fetch the network reachability flags")
                return false
            }
            return (flags.value and kSCNetworkReachabilityFlagsReachable) != 0u
        }
    }
}

通过Koin依赖注入创建TrackerRepository的配置:

single<TrackerRepository> {
    TrackerRepository(
        local = get<TrackerLocalDataSource>(),
        network = get<TrackerNetworkDataSource>(),
        connectivity = get<Connectivity>(),
    )
}

此时出现错误:

org.koin.core.error.InstanceCreationException: Could not create instance for '[Singleton:'com.autodesk.adp_mobile_sdk.tracker.data.repository.TrackerRepository']'

已在Android模块中添加配置:

single<Connectivity>{Connectivity(get())}

解决方案

1. 补充iOS平台的Koin配置

Koin在KMP中需要为每个平台单独注册依赖,你已经配置了Android端的Connectivity单例,但iOS模块缺少对应的配置。在iOS模块的Koin初始化代码中添加:

single<Connectivity> { Connectivity() }

iOS的Connectivity无构造参数,直接实例化即可。

2. 确认Koin模块加载顺序

确保平台特定的Koin模块(如Android的appModule、iOS的iosModule)优先于通用模块加载,或者将通用模块的依赖(如TrackerRepository)放在平台模块中引用,避免Koin找不到平台专属的Connectivity实现。

3. 验证完整依赖链

错误提示是创建TrackerRepository失败,除了Connectivity,另外两个依赖TrackerLocalDataSource和TrackerNetworkDataSource也可能未正确注册。确保这两个类都在Koin中配置了实例:

// 示例配置,需根据实际实现调整
single<TrackerLocalDataSource> { TrackerLocalDataSourceImpl(get()) }
single<TrackerNetworkDataSource> { TrackerNetworkDataSourceImpl(get()) }

4. 开启Koin日志排查

在Koin初始化时启用日志,查看具体的依赖注入失败细节:

// Android端示例
startKoin {
    androidLogger(Level.DEBUG)
    modules(appModule, commonModule)
}

// iOS端示例
startKoin {
    logger(KoinLogger())
    modules(iosModule, commonModule)
}

日志会输出哪个依赖无法创建,帮助精准定位问题。

5. 检查Android端Context的注入

Android的Connectivity依赖Context,确保Koin中已正确提供上下文实例。如果在Application类中初始化Koin,可通过以下方式配置:

startKoin {
    androidContext(this@MyApplication)
    modules(appModule)
}

这样get<Context>()才能正确获取到上下文对象。

内容的提问来源于stack exchange,提问作者Priyanka Kadam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:35:11