gpt4 book ai didi

android - ViewModel 中的实例成员 LiveData 变量?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:35 25 4
gpt4 key购买 nike

在使用 Android 几年后,我试图了解 Android 架构组件。阅读官方文档和一些博客后,让我感到困惑的一件事是在哪里创建 LiveData 变量。

在下面的第一个变体中,我只在存储库类中创建了一个 livedata 变量,而在两个变体中的第二个变体中存储库和 View 模型类。两种变体都有效。

第一个变体:

public class ScoreViewModel extends AndroidViewModel {

private ScoreRepositorDB scoreRepo;

public ScoreViewModel(Application application) {
super(application);
scoreRepo = new ScoreRepositorDB(application);
}

public LiveData<Score> getScore(){
return scoreRepo.getScore();
}
...
}

第二种变体:

public class ScoreViewModel extends AndroidViewModel {

private ScoreRepositorDB scoreRepo;
private LiveData<Score> score ;

public ScoreViewModel(Application application) {
super(application);
scoreRepo = new ScoreRepositorDB(application);
score = scoreRepo.getScore();
}

public LiveData<Score> getScore(){
// return scoreRepo.getScore();
return score;

}
...
}

两种变体的存储库:

private LiveData<Score> score ;

ScoreRepositorDB(Application application) {
ScoreRoomDatabase db = ScoreRoomDatabase.getDatabase(application);
scoreDao = db.scoreDao();
score = scoreDao.getScore(1);
}

public LiveData<Score> getScore(){
return score;
}
...

在这个例子中,我应该创建:

 private LiveData<Score> score ;

在 ViewModel 中?更一般地说,我应该将实例 LiveData/MutableLiveData 变量放在哪里,为什么?

最佳答案

我先回答你的一般问题:

And more generally , where should I put instance LiveData/MutableLiveData variable and why?

简短的回答是视情况而定。通常,如果您只使用 LiveData,您会将来自存储库的 LiveData 直接传递给 ViewModel,而 ViewModel 会简单地将它公开给 View,而无需在 ViewModel 中创建它的实例。

但是,如果出于任何原因您需要修改 ViewModel 中的 LiveData,您应该在 ViewModel 中保留对它的引用,您可以在这个 google sample 中清楚地看到它。 :

 public LiveData<ProductEntity> loadProduct(final int productId) {
return mDatabase.productDao().loadProduct(productId);
}

存储库只是获取 Room Library 提供的 LiveData 并将其公开。 View 模型,获取 LiveData 并将其公开给 View:

public ProductViewModel(@NonNull Application application, DataRepository repository,
final int productId) {
super(application);
mProductId = productId;
mObservableProduct = repository.loadProduct(mProductId);
}

public LiveData<ProductEntity> getObservableProduct() {
return mObservableProduct;
}

您可以保留对结果 LiveData 的引用,如上所示。但您可以直接将其传递给 View :

public LiveData<ProductEntity> getObservableProduct() {
return repository.loadProduct(mProductId);
}

我最近看到的是,如果您正在使用 Retrofit 和远程存储库(甚至是 Room),您可以使用 RxJava(或 Retrofit 的 native 回调),这样您就需要一个 LiveData 实例在你的 View 模型中。

所以不同之处在于,如果您只使用 LiveData(从数据源到 View ),您可以在 ViewModel 中保存对实时数据的引用。如果您只工作到一半,您必须在 View 模型中有一个 LiveData。

最后,在您的情况下,您可以像在 google 示例中一样保留引用。

关于android - ViewModel 中的实例成员 LiveData 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50794726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com