Kotlin在全局类中设置全局变量



我是Kotlin的新手。我需要一个我无法理解java和kotlin的帮助。

对于Java,我做到了。但是对于kotlin,我做不到问题是,我创建了一个Global kotlin类公共类Global:Application((

在MainFest上,我宣布android:name=".Global">

在全局类I中声明了一个变量:

public class Global : Application() {
open var homeAPIResponse: String = "defaultValue"
}

当我为这个全局变量设置任何值时,它都不会保存,当我获取值时,总是显示默认值。我无法理解kotlin中的java类型getter和setter方法。请帮帮我。

我试过了:

global = Global()
global.homeAPIResponse  = "2nd Text"
Log.d("testingTag", "Testing modified response >>>> " + global.homeAPIResponse)

在日志中,它总是显示默认值。

=========================================================================伙计们,我的目的是在全球范围内保存一些价值,在将一项活动转移到另一项活动后,这些价值不会被抹去。

请帮我举一个恰当的例子,因为我搜索了很多关于堆栈溢出的内容。却拿不到。

提前感谢

也许可以这样尝试:

public class Global : Application() {
companion object {
@JvmField
var homeAPIResponse: String = "defaultValue"
}
}

在其他活动中:

Global.homeAPIResponse = "new value"

您似乎正在手动创建Global()应用程序;你不应该这么做。

当您的应用程序启动时,会自动创建一个Application类。

你想把它作为一个全局变量吗?按照建议回答:

companion object {
var globalVariable = "initial value"
}

把它放在Global()类中。不要手动创建新的Global()实例。相反,在您的活动中,只需调用Global.globalVariable = "your new value"

此外,您还可以将其设置为kotlin所称的"顶级变量"。在全局类声明之上声明它,如下所示:

var yourGlobalVariable = "default text"
class Global : Application () {
// etc.

这可以在任何地方使用。开始在您的应用程序中键入它(没有Global,只有它自己(,它就会导入。

编辑

如果您的目的是在活动之间保留一个全局变量,那么使用类(甚至是应用程序类(确实是不可取的。

你考虑过SharedPreferences吗?

使用

PreferenceManager.getDefaultSharedPreferences(context).getString("key to access with", "default value")

并使用存储

PreferenceManager.getDefaultSharedPreferences(context).edit().putString("key to access with", "your new value").apply()

你知道吗?你可以在一个简单的kt文件中创建你的全局变量,如下所示:

var homeAPIResponse = "defaultValue"

有了这个,你可以在任何地方更新它,就像这样:

homeAPIResponse = "2nd Text"

希望它能帮助你

您也可以这样做。

const val homeAPIResponse: String = "defaultValue"

当你想使用它时,只需在任何地方键入homeAPIResponse

常量是编译时常量。这意味着它们的值必须在编译时分配,不像vals那样可以在运行时分配。

这意味着,const永远不能分配给函数或任何类构造函数,而只能分配给String或基元。

为此,我在Kotlin中使用以下选项:

  • 观察者模式
  • Singleton对象

观察者模式可能需要更多的时间来实现,但最终您将从中受益。有很多灵活性,任何人都可以订阅数据,并且类可以注入新数据。一个很好的例子是:https://www.youtube.com/watch?v=5WIS-GydJmw&t=620s观察者的最大优势是通知程序可以立即处理传入的数据,例如放在屏幕上。

另一种选择是生成一个对象而不是一个类,这相当于一个单例。我喜欢将其用于数据库,在对象内部我将使用lateinit-var,因此只有在使用时才会创建对象。当数据只在少数地方使用时,不要使用singleton。

这里的例子:

object SqlData {
init {
}    
public lateinit var sql_item: SqlItem
public lateinit var sql_alamat: SqlAlamat
public lateinit var sql_floor_table: SqlFloorTable

访问单例的代码:

override fun getItemCount(): Int {
return SqlData.sql_floor_table.getSize()
}

最新更新