Kotlin 扩展 属性 在某些应用程序模块中被识别,而在其他应用程序模块中不被识别

Kotlin extension property is recognized in some app modules and not others

我正在为我的模块化 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)
   )
}

我可以 "see" 我的四个模块中的任何地方,而不仅仅是 "core" 模块。 (做一个 Application.db)出现在我在 Android 工作室的选择列表中。但是,在另一个模块(称为音频播放器)中,我定义了一个 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 的依赖项。

例如

dependencies {
    // Or "api project" if you want to make that extension accessible from the modules which depend from this module.
    implementation project(":audioplayer")
    ...
}