Kotlin свойство расширения распознается в некоторых модулях приложения, а не в других - PullRequest
0 голосов
/ 31 марта 2020

Я делаю расширение приложения для моего модульного приложения 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')
}

1 Ответ

1 голос
/ 01 апреля 2020

Вы должны добавить модуль, содержащий расширение, в качестве зависимости от модуля, который хочет его использовать.

Таким образом, представляя расширение application.downloadManager в модуле :audioplayer, вы должны добавить зависимость с :audioplayer в модулях, которым требуется это расширение.

например

dependencies {
    // Or "api project" if you want to make that extension accessible from the modules which depend from this module.
    implementation project(":audioplayer")
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...