我正在为我的模块化android应用程序(具有4个模块)进行应用程序扩展。我正在使用以下实用程序代码来初始化应用程序扩展:
class ApplicationLazy<out T>(private val initializer: Application.() -> T) : ReadOnlyProperty<Application, T> {
private var value: T? = null
override fun getValue(thisRef: Application, property: KProperty<*>): T =
(value ?: initializer(thisRef).also {
value = it
})
}
fun <T : Any> appLazy(initializer: Application.() -> T) = ApplicationLazy(initializer)
并且在一个模块(称为核心)中,我这样定义数据库:
val Application.db by appLazy {
Database(
AndroidSqliteDriver(Database.Schema, this, "luminary.db"),
HomeItemDto.Adapter(SectionIdColumnAdapter, EnumColumnAdapter(), EnumColumnAdapter()),
HomeSectionDto.Adapter(SectionIdColumnAdapter, EnumColumnAdapter()),
MediaItem.Adapter(MediaIdColumnAdapter, LocalDateTimeColumnAdapter, LocalDateTimeColumnAdapter)
)
}
我可以在我的四个模块中的任何地方“看到”,而不仅仅是“核心”模块。 (正在执行Application.db)显示在我在Android Studio中的选择列表中。但是,在另一个模块(称为audioplayer)中,我正在这样定义Exoplayer DataManager:
val Application.downloadManager: DownloadManager by appLazy {
val downloadIndex = DefaultDownloadIndex(databaseProvider)
upgradeActionFile(DOWNLOAD_ACTION_FILE, downloadIndex, false)
upgradeActionFile(DOWNLOAD_TRACKER_ACTION_FILE, downloadIndex, true)
val downloaderConstructorHelper = DownloaderConstructorHelper(downloadCache, dataSource(this,
SwaggerApiClient.userAgent))
DownloadManager(this, downloadIndex, DefaultDownloaderFactory(downloaderConstructorHelper)).apply {
requirements = Requirements(Requirements.NETWORK_UNMETERED)
}
}
我在编译时在另一个模块中调用application.downloadManager,编译器抱怨并说这是一个未解决的引用。为什么在一个模块而不是另一个模块中定义此方法有效?
编辑这是调用此扩展的模块的依赖关系。
dependencies { //core
api project(":network")
}
dependencies { //app
}
dependencies { //network
}
dependencies { //audioplayer
implementation project(':core')
}
您必须添加包含扩展名的模块作为要使用它的模块的依赖项。
因此,假设扩展名application.downloadManager
在模块:audioplayer
中,您应该在需要该扩展名的模块中将依赖项与:audioplayer
添加在一起。