【问题标题】:kotlin pass context to static constructorkotlin 将上下文传递给静态构造函数
【发布时间】:2020-04-02 19:17:50
【问题描述】:

我想将上下文传递给我的自定义类意味着某些功能的 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()
        }
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    你可以这样做:

    object Utils {
        lateinit var context: Context
            set(value) { field = value.applicationContext }
    
        fun show(){
            Toast.makeText(context,message,Toast.LENGTH_SHORT).show()
        }
    }
    

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

    您必须在应用的入口点设置Utils.context 参数。如果它只有一个任务根Activity,你可以把它放在那个Activity的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()
    

    【讨论】:

    • 谢谢你的回答,但我们不能作为一个班级来做这个?以及如何调用这个对象并使用它?
    • 在对象引用上调用它的函数,例如Utils.context = contextUtils.show()。您可以使用单例模式对一个类执行此操作,因此您可以在同伴中保留对它的引用对象,但这只是获得相同结果的一种更复杂的方式。
    • 你能把完整的代码发给我吗?一个类以及如何调用它,谢谢
    • 哪一部分?你想用更复杂的方式来做吗?
    • 没有,我就是不明白怎么用,怎么叫
    猜你喜欢
    • 2019-04-25
    • 2013-12-23
    • 2012-02-21
    • 2016-03-17
    • 2022-08-14
    • 2015-03-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多