如何在内部定义带有 sharedPreferences 的顶级函数?

How to define top-level function with sharedPreferences inside?

我试图让所有文件都可以访问这个函数,但是如果我在 Kotlin 文件的 class 之外定义它,它会显示 getSharedPreferencesunresolved reference 的错误。我认为这是我的 answer 但我不知道如何声明顶级函数。怎么做到的?

package com.example.app
    fun retrieveData() {
        val mypref = getSharedPreferences ("mypref", Context.MODE_PRIVATE)
        val radiotext=mypref.getString("data","")
    }

声明顶级函数就像不将其放在 class 声明的大括号 { } 中一样简单。

只能从 Android 上下文中检索 SharedPreferences。使您的函数成为 Context 的扩展:

fun Context.retrieveData() { //...

然后您可以在任何上下文类型对象中使用它,例如从您的 Activity 中的某个函数调用它。如果从片段(它本身不是上下文对象)调用它,则必须在上下文中调用它:context.retrieveData().

将其作为扩展函数只是一种重新排列调用方式的方式。您还可以定义您的函数以获取上下文参数:

fun retrieveData(context: Context) {
    val mypref = context.getSharedPreferences("mypref", Context.MODE_PRIVATE)
    val radiotext=mypref.getString("data","")
}

在这种情况下,您总是需要传递一个上下文。如果你在 Activity 中,你可以传递 this 或传递 context,这是 Activity 的 属性。

我看到两个选项:

  1. 更改函数以将 SharedPreferences 作为参数:
package com.example.app

    fun retrieveData(shPref: SharedPreferences): String {
        val radioText = shPref.getString("data", "")
        return radioText
    }
  1. 将函数更改为 SharedPreferences 对象的扩展,将 SharedPreferences 作为参数:
package com.example.app

    fun SharedPreferences.retrieveData(): String {
        val radioText = this.getString("data", "")
        return radioText
    }

而且您显然需要事先获取 SharedPreference 对象才能使用此功能。