【问题标题】:Instance member LiveData variable in ViewModel?ViewModel 中的实例成员 LiveData 变量?
【发布时间】:2018-11-20 12:38:30
【问题描述】:

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

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

第一个变体:

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 变量放在哪里?为什么?

【问题讨论】:

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


    【解决方案1】:

    我会先回答你的一般性问题:

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

    简短的回答是视情况而定。通常,如果您只使用 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 的引用,如上所示。但是您可以直接将其传递给视图:

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

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

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

    最后,在你的情况下,你可以像在谷歌示例中一样持有参考。

    【讨论】:

    • 谢谢李维。我需要时间来试验和理解你的想法。
    猜你喜欢
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多