如何将上下文作为参数传递

时间:2018-06-08 18:52:58

标签: java android kotlin

我是kotlin的初学者,我试图传递上下文作为参数,但是没有工作...... 这些是我的代码:

功能saveDatabase

    private fun saveDatabase(context : Context){
    val fightersName = Match(1, fighter1.toString(), fighter2.toString(),
            minute.toInt(), round.toInt())

    val db = DBContract(context)
    db.insertData(fightersName)
    }

致电职能

   saveDatabase(context)

警告

  

Typemismatch   必需:上下文   发现:上下文?

此类是一个片段,它扩展了Fragment()

4 个答案:

答案 0 :(得分:1)

您在Kotlin中作为context属性访问的getContext方法具有可空类型Context? - 因为当您null时它会返回Fragment 1}}未附加到Activity

处理错误的一种方法是首先获取其值,然后在调用函数之前执行空值检查:

val context = context
if (context != null) {
    saveDatabase(context)
}

同样的支票using let,有两种不同的形式:

context?.let { ctx -> saveDatabase(ctx) }
context?.let { saveDatabase(it) }

如果您完全确定Fragment已附加到Activity,则还可以使用requireContext - 这会返回不可为空的Context,或者会引发异常如果没有可用的话。

saveDatabase(requireContext())

答案 1 :(得分:0)

您的函数需要非null Context对象,而您使用可空且可变的Context对象调用它。如果您确定您的上下文不为空,请致电

saveDatabase(context!!)

!! 表示您保证该对象为非空

或者您可以检查您的功能是否安全,然后将功能更改为

private fun saveDatabase(context : Context?){
    if(context != null){
    val fightersName = Match(1, fighter1.toString(), fighter2.toString(),
            minute.toInt(), round.toInt())

    val db = DBContract(context)
    db.insertData(fightersName)
    }
    }

答案 2 :(得分:0)

这很容易。请尝试以下

private fun saveDatabase(context : Context?){
    val fightersName = Match(1, fighter1.toString(), fighter2.toString(),
            minute.toInt(), round.toInt())

    val db = DBContract(context)
    db.insertData(fightersName)
}

答案 3 :(得分:0)

如果你是使用kotlin的Android新手,你肯定需要一个"始终可用"上下文。这就是:

class App : Application() {
companion object {
    lateinit var instance: App
}

override fun onCreate() {
    super.onCreate()
    instance = this
}

}

然后你只需要通过:

val db = DBContract(App.instance)

确保修改清单:

 <application
    android:name=".App"
    ...>