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

标签 android mvvm android-room android-livedata android-viewmodel

在使用 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/

相关文章:

php - 保护android和php之间的连接

android - 无法解决Gradle中的依赖关系

c# - 是否可以将数据上下文的属性绑定(bind)到另一个数据上下文的属性

android - MVVM:复杂 View / View 模型-> 多个 LiveData 对象?

Android OpenGL .OBJ 文件加载器

java - 通过应用程序从服务访问全局对象

wpf - MVVM 绑定(bind)到 InkCanvas

android - : Landroid/arch/core/executor/AppToolkitTaskExecutor 解析失败

mysql - 多个字段有相同的columnName Android Room

android - 使用 Kotlin Flow 在房间数据库更改后实时更新 UI 状态