Комната не получает данные, когда androidx.paging.DataSource.Factory (с использованием LiveData + Kotlin Coroutines) - PullRequest
0 голосов
/ 01 марта 2019

У меня есть AmbassadorDAO, который имеет getAll() : List<Ambassador>, который правильно возвращает список послов.

Проблема возникает, когда я реорганизую свой существующий код , чтобы использовать DataSource.Factory для разбиения на страницы моегоlist

Вот код

Presation Module

Активность

class AmbassadorActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        val viewModel by viewModel<AmbassadorViewModel>()

        val adapter = AmbassadorAdapter(this)
        list_of_ambassadors.adapter = adapter

        viewModel.ambassadors.observe(this, Observer { adapter.submitList(it) })

        viewModel.listAmbassadors()

        ...
    }

    ...
}

Viewmodel

class AmbassadorViewModel(
    ...,
    private val getAllAmbassadorInteractor: GetAllAmbassadorInteractor
) : ViewModel() {

    ...

    // not working
    private val _ambassadors = MutableLiveData<PagedList<Ambassador>>()

    // it's working
    //private val _ambassadors = MutableLiveData<List<Ambassador>>()

    ...

    // not working
    val ambassadors : LiveData<PagedList<Ambassador>>
        get() =  _ambassadors

    // it's working
    //val ambassadors : LiveData<List<Ambassador>>
    //    get() =  _ambassadors

    ...

    fun listAmbassadors() {
        viewModelScope.launch {
            try {
                ...

                // not working
                // the data not return anything
                // the livedata is notified with null
                val data = getAllAmbassadorInteractor.exec()
                _ambassadors.value = LivePagedListBuilder(data, 20).build().value

                // it's working
                //_ambassadors.value = getAllAmbassadorInteractor.exec()

            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                ...
            }
        }
    }

}

Доменный модуль

Граница между ПРЕЗЕНТАЦИЕЙ (мой интерфейс использования)

interface GetAllAmbassadorInteractor {

    //suspend fun exec() : List<Ambassador>
    suspend fun exec() : DataSource.Factory<Int, Ambassador>

}

Реализация варианта использования

class GetAllAmbassadorInteractorImpl(
    private val repository: AmbassadorRepository
) : GetAllAmbassadorInteractor {

    override suspend fun exec() = withContext(Dispatchers.IO) { repository.getAll() }

}

Граница между данными (мой интерфейс хранилища)

interface AmbassadorRepository {

    ...

    //suspend fun getAll() : List<Ambassador>
    suspend fun getAll() : DataSource.Factory<Int, Ambassador>

    ...

}

Модуль данных

Реализация репозитория

class AmbassadorRepositoryImpl(
    private val ambassadorDAO: AmbassadorDAO
) : AmbassadorRepository {

    ...

    override suspend fun getAll() = ambassadorDAO.getAll().map { it.toDomain() }

    ...

}

Мой DAO

@Dao
interface AmbassadorDAO {

    ...

    @Query("SELECT * FROM ${AmbassadorEntity.TABLE_NAME} ORDER BY name DESC")
    fun getAll(): DataSource.Factory<Int, AmbassadorEntity>
    //fun getAll(): List<AmbassadorEntity>

    ...

}

Где я ошибаюсь?

1 Ответ

0 голосов
/ 01 марта 2019

Я полагаю, ваша ошибка в этой строке в AmbassadorViewModel классе:

_ambassadors.value = LivePagedListBuilder(data, 20).build().value

Вместо этого используйте:

_ambassadors.value = LivePagedListBuilder(data, 20).build()

Также см. Этот пост , может быть, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...