代码之家  ›  专栏  ›  技术社区  ›  Ashesh Bharadwaj

如何从Repository>ViewModel>Fragment传播Livedata

  •  3
  • Ashesh Bharadwaj  · 技术社区  · 8 年前

    getMoreData()

    fetchMore() in Repository返回一个LiveData LoadingStatus

    我如何设置 loadingStatus 变量,以便片段可以正确地观察到它?

    getMoreData() 当用户向下滚动时,可以多次调用ViewModel。

    ViewModel{
        val loadingStatus
    
        fun getMoreData(){
            repository.fetchMore()
        }
    }
    
    Repository{
        fun fetchMore() : LiveData<LoadingStatus>{
    
        }
    }
    
    Fragment{
        viewModel.loadingStatus.observe()
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Bam    7 年前

    问题是需要一个 生命周期所有者 用于观察存储库中的LiveData。

    LiveData<LoadingStatus> 每一次 fetchMore() 被称为。每次都会创建一个新的LiveData。最好的情况下,你会想要的功能 获取更多()

    Repository{
        val status = LiveData<LoadingStatus>()
    
        fun fetchMore() {
            status.postValue(LOADING)
    
            // Pseudo code for actually loading more items
    
            status.postValue(FINISHED LOADING)
        }
    }
    

    然而,你将有一个问题,观察 status ViewModel

    我的建议是这样的:

    ViewModel{
        val loadingStatus: MutableLiveData<LoadingStatus>
    
        init{
            repository.observeStatus()
                .subscribe( event -> loadingStatus.postValue(event))
        }
    
        fun getMoreData(){
            repository.fetchMore()
        }
    }
    
    Repository{
        val status = BehaviorSubject.create<LoadingStatus>()
    
        fun observeStatus(): Observable<LoadingStatus> {
            return status
        }
    
        fun fetchMore(){
            status.onNext(LOADING)
    
            // Pseudo code for actually loading more items
    
            status.onNext(FINISHED LOADING)
        }
    }
    
    Fragment{
        viewModel.loadingStatus.observe()
    }
    


    请注意,所有这些都是伪代码,应该比这更干净。

    推荐文章