观察变量和函数有什么区别

Whats the difference between observing a variable and a function

当我从片段 A 观察我的视图模型中的一个变量时

val fetchTopicsList = liveData(Dispatchers.IO) {
        emit(Resource.Loading())
        try {
            emit(repo.getIdeas())
        }catch (e:Exception){
            emit(Resource.Failure(e))
        }
    }

然后我导航到片段 B 并返回到片段 A,观察者将再次触发,但不会获取新数据。

现在,如果我将该声明更改为函数声明

fun fetchTopicsList() = liveData(Dispatchers.IO) {
        emit(Resource.Loading())
        try {
            emit(repo.getIdeas())
        }catch (e:Exception){
            emit(Resource.Failure(e))
        }
    }

当我做同样的事情时(从片段 A 到片段 B 然后回来)观察者将再次触发并再次从服务器拉取数据。

为什么函数再次触发而变量只保留第一个获取的数据?

您可能实际上想要 MutableLiveData 的单个实例,它会在某些交互中发出,但我想直接解决您的问题:

有了这个函数,每次调用都会给你一个新的 LiveData 实例,而使用 属性 初始化器会实例化+将它设置为 LiveData 的单个实例,当你class 被实例化。这意味着,如果您的 属性 在 ViewModel 上,它将在配置更改和暂停/恢复周期中存活,直到它被销毁。

如果您更喜欢 属性 语法,您可以通过重写 getter 使其与每次重新调用函数时做同样的事情,但老实说,这里的函数在语法上更准确.

这就是使用 属性 语法实现相同功能的方法:

val fetchTopicsList: LiveData<..>
  get() = liveData(Dispatchers.IO) {
     emit(Resource.Loading())
     try {
       emit(repo.getIdeas())
     } catch (e:Exception){
       emit(Resource.Failure(e))
     }
  }

同样,更好的方法可能是单个 MutableLiveData 并在 ViewModel 上公开一个函数来发出请求和 post 任何订阅者的价值。