Я делаю расширение приложения для моего модульного приложения 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)
И в одном модуле (назовем это core) я определяю базу данных как таковую:
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)
)
}
I Я могу «видеть» это из любого места в моих четырех модулях, а не только в «основном» модуле. (Doing a Application.db) появляется в моем списке вариантов в Android studio. Тем не менее, в другом модуле (назовите его аудиоплеером) я определяю 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')
}