我是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()
答案 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"
...>