繁体   English   中英

Kotlin + Hilt:将活动上下文注入 object class

[英]Kotlin + Hilt: Injecting activity context to object class

我有一个 object 有很多屏幕相关的方法(我这里只放两个作为例子)如下:

object AWScreen {

    private lateinit var context: Context

    fun init(context: Context) {
        this.context = context
    }

    private fun getScreenHeightAlternative(oContext: Context): Int {
        val display = oContext.resources.displayMetrics
        return display.heightPixels
    }

    fun getScreenWidth(context: Context?): Int {
        val size = Point()
        var screenWidth = 0
        try {
            (context as Activity).windowManager.defaultDisplay.getRealSize(size)
            screenWidth = size.x
        } catch (e: NoSuchMethodError) {
            e.printStackTrace()
        }
        return screenWidth
    }
}

我正在尝试从应用程序 Class 初始化所有依赖项(在这种情况下只有上下文) - 当应用程序启动时 - 如下:

@HiltAndroidApp
class AWApplication : MultiDexApplication() {

    override fun onCreate() {
        super.onCreate()

        AWScreen.init(this)
    }
}

但是,正如您所看到的,这样我得到的是应用程序上下文而不是活动上下文(访问资源所需的内容)。

我可以这样做:

AWScreen.init(this)

在任何依赖 AWScreen onCreate 的活动中,但我试图避免这种情况,因为 AWScreen 在我的应用程序中被广泛使用,我不想重复代码,事实上这就是 Hilt(依赖注入)的意义所在。

在简历中,我有许多自定义类(对象),我需要一个活动上下文(而不是应用程序上下文)来访问资源(或任何其他 class,具体取决于上下文),但我不知道如何在使用 Hilt 的“依赖注入方式”,避免在每个活动中初始化该对象的依赖项。

编辑1:

正如@مصطفى نعمه 提到的,我可以使用任何上下文(活动上下文以及应用程序上下文)访问资源,但在我的 AWScreen class 中,有如下方法:

private fun getSoftButtonsBarHeight(oActivity: Activity): Int {
        val metrics = DisplayMetrics()
        oActivity.windowManager.defaultDisplay.getMetrics(metrics)
        val usableHeight = metrics.heightPixels
        oActivity.windowManager.defaultDisplay.getRealMetrics(metrics)
        val realHeight = metrics.heightPixels
        return if (realHeight > usableHeight) realHeight - usableHeight else 0
    }

我需要访问windowManager,而windowManager仅在活动上下文中可用,所以,要清楚,我需要知道的是如何将活动上下文注入自定义class。

我没有完全理解你的问题,但是

您通常可以像这样通过应用程序上下文访问资源:注入上下文后->->

val someString = context?.resources.getString(R.string.some_string) //context is nullable so "?" is needed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM