KMM中解决Koin InstanceCreationException实例创建异常问题
问题背景
我正在用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

