首页 > 解决方案 > 使用 GithubBrowserSample 在 vi​​ewmodel 中进行存储库方法调用而不使用 transformation.switchmap

问题描述

Google 的GithubBrowserSample基于是否进行了搜索,以便调用结果。在我的场景中,没有任何搜索,我只想在片段加载时调用它。但是,我不知道该怎么做。利用断点和反复试验,我似乎无法将其标记为进入我选择的存储库方法。任何提示将不胜感激。

我的一些代码片段:

public class CategoryViewModel extends ViewModel {

    private final LiveData<Resource<List<Category>>> categories;

    @Inject
    CategoryViewModel(@NonNull CategoryRepository categoryRepository){
        categories = categoryRepository.getDBCategories();
    }

样本中的等价物:

public class SearchViewModel extends ViewModel {

    private final MutableLiveData<String> query = new MutableLiveData<>();

    private final LiveData<Resource<List<Repo>>> results;

    private final NextPageHandler nextPageHandler;

    @Inject
    SearchViewModel(RepoRepository repoRepository) {
        nextPageHandler = new NextPageHandler(repoRepository);
        results = Transformations.switchMap(query, search -> {
            if (search == null || search.trim().length() == 0) {
                return AbsentLiveData.create();
            } else {
                return repoRepository.search(search);
            }
        });
    }

标签: androidmvvmdagger-2android-architecture-componentsandroid-livedata

解决方案


对于同一条船上的其他人,通过简单地修改 SearchViewModel 构造函数以对查询进行硬编码,我很快就发现即使在示例应用程序上也可以立即加载,因为在搜索片段上观察到数据。

于是我上交了 SearchViewModel:

@Inject
SearchViewModel(RepoRepository repoRepository) {
    nextPageHandler = new NextPageHandler(repoRepository);
    results = Transformations.switchMap(query, search -> {
        if (search == null || search.trim().length() == 0) {
           return AbsentLiveData.create();
        } else {
            return repoRepository.search(search);
        }
    });
}

@Inject
SearchViewModel(RepoRepository repoRepository) {
    results = repoRepository.search("shadow");
    nextPageHandler = new NextPageHandler(repoRepository);
}

希望这对其他人有帮助。


推荐阅读