Репозиторий CoroutineLiveData Builder не вызывается - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь использовать новый конструктор liveData, указанный здесь , чтобы извлечь мои данные, а затем преобразовать их в модели представления. Тем не менее, мой код репозитория не вызывается (по крайней мере, я не вижу его запуска при использовании моего отладчика). Разве я не должен использовать двух liveData{ ... } строителей? (один в моем хранилище, один в моем представлении модели)?

class MyRepository @Inject constructor() : Repository {

    override fun getMyContentLiveData(params: MyParams): LiveData<MyContent> =
    liveData {

        val myContent = networkRequest(params) // send network request with params
        emit(myContent)
    }
}


class MyViewModel @Inject constructor(
    private val repository: MyRepository
) : ViewModel() {

    val viewModelList = liveData(Dispatchers.IO) {
        val contentLiveData = repository.getContentLiveData(keyParams)
        val viewModelLiveData = contentToViewModels(contentLiveData)
        emit(viewModelLiveData)
}

    private fun contentToViewModels(contentLiveData: LiveData<MyContent>): LiveData<List<ViewModel>> {
        return Transformations.map(contentLiveData) { content ->
            //perform some transformation and return List<ViewModel>
        }
    }
}

class MyFragment : Fragment() {

    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory
    val myViewModel: MyViewModel by lazy {
        ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
    }

    lateinit var params: MyParams

    override fun onAttach(context: Context) {
        AndroidSupportInjection.inject(this)
        super.onAttach(context)
        myViewModel.params = params
        myViewModel.viewModelList.observe(this, Observer {
            onListChanged(it) 
        })

    }

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы можете попробовать с emitSource:

val viewModelList = liveData(Dispatchers.IO) {
    emitSource(
        repository.getContentLiveData(keyParams).map {
            contentToViewModels(it)
        }
}
0 голосов
/ 04 ноября 2019

Разместите свой полный код класса фрагмента. и почему вы используете карту? чтобы вернуть aliveata , предполагается, что вы используете switchMap () для возврата liveData

...