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

kotlin pass context to static constructor

我想将上下文传递给我的自定义 class 意味着 Utils 对于一些 functions.I 想要创建我的自定义 Toast 来显示我的 messages.for 我需要上下文但是我的 toast 函数是静态的并且不能使用它,因为我们可以在静态中获取非静态变量 functions.how 可以将上下文传递给 Utils class 并在 Utils class 中的静态函数中使用上下文? 我知道我可以在 show 而不是 Utils class 中获取上下文,但我想在 Utils class 中获取上下文并将其用于其他功能。 在我的代码中,上下文在 show function

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

要使 Context 可用于多个静态或顶级函数,您必须将其存储在静态 属性 中。这意味着您将必须通过一些静态函数或 属性 setter,而不是 class 构造函数来初始化您的函数。

你可以这样做:

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

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

像我在上面 setter 中所做的那样,将上下文剥离到应用程序上下文很重要,这样您就不会泄漏任何活动或上下文的其他子class。这是因为静态 属性 将超过任何 Activity 或视图的生命周期。

您必须在应用的入口点设置 Utils.context 参数。如果它只有一个任务根 Activity,你可以把它放在那个 Activity 的 onCreate 中。如果您的应用程序有多个入口点,那么您可能想要子class 应用程序并将其放入应用程序的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()