kotlin将上下文传递给静态构造函数

时间:2019-12-09 16:35:42

标签: kotlin constructor static android-context companion-object

我想将上下文传递给我的自定义类意味着某些函数使用Utils。我要创建我的自定义Toast以显示消息。为此,我需要上下文,但我的Toast函数是静态的,不能使用它,因为我们可以获取非静态函数中的静态变量。如何将上下文传递给Utils类并在Utils类的静态函数中使用上下文? 我知道我可以在show中获取上下文,而不是在Utils类中获取上下文,但是我想在Utils类中获取上下文并将其也用于其他功能。 在我的代码中,显示功能无法访问

class Utils(var context:Context){
    companion object{
        fun show(){
            Toast.makeText(context,message,Toast.LENGTH_SHORT).show()
        }
    }
}

1 个答案:

答案 0 :(得分:0)

要使上下文可用于多个静态或顶级功能,必须将其存储在静态属性中。这意味着您将必须通过一些静态函数或属性设置器而不是类构造函数来初始化函数。

您可以执行以下操作:

object Utils {
    lateinit var context: Context
        set(value) { field = value.applicationContext }

    fun show(){
        Toast.makeText(context,message,Toast.LENGTH_SHORT).show()
    }
}

像在上面的设置器中所做的那样,将上下文分解为应用程序上下文很重要,这样您就不会泄漏任何Activity或Context的其他子类。这是因为静态属性将超过所有“活动”或视图的生命周期。

您必须在应用程序的入口点设置Utils.context参数。如果它只有一个任务根活动,则可以将其放在该活动的onCreate中。如果您的应用程序有多个入口点,那么您可能想对Application进行子类化,然后将其放在Application的onCreate中。

或者,这样做可能更安全,因此您不可能创建未捕获的异常:

object Utils {
    var context: Context
        set(value) { field = value.applicationContext }

    fun show(){
        context?.let {
            Toast.makeText(it,message,Toast.LENGTH_SHORT).show()
        } ?: Log.e("Utils", "Called show() before setting the context.")
    }
}

示例:

// In the main entry point to your app (the launcher Activity):
override fun onCreate() {
    super.onCreate()
    Utils.context = this

    //...
}

// And when you want to call one of its functions:
Utils.show()