LiveData в модели представления не устанавливается и имеет значение null - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть следующее ViewModel

class MainViewModel  @Inject constructor(private val mainRepository: MainRepository) : ViewModel(){
    private var _user: LoggedInUser? = null

    val allProjects: MutableLiveData<Array<Project>> = MutableLiveData()


    fun setUser(loggedInUser: LoggedInUser){
        _user = loggedInUser
        getAllProjects()
    }

    fun getAllProjects(): LiveData<Array<Project>> {
        println("MVM: In get all projects")
        allProjects.value = mainRepository.getAllProjects(_user!!.token).value
        println(" AFTER ${Arrays.toString(allProjects.value)}")
        return mainRepository.getAllProjects(_user!!.token)
    }
}

Когда я звоню setUser() или getAllProjects(), данные не устанавливаются. И в операторе печати После я получаю ноль.

MainRepository:

@Singleton
class MainRepository {
    var job: CompletableJob? = null

    fun getAllProjects(auth: String): LiveData<Array<Project>> {
        println("REPO: In get all projects")
        val data = MutableLiveData<Array<Project>>()
        var job = Job()
        job?.let {theJob ->
            CoroutineScope(context = Dispatchers.IO + theJob).launch {
                val projects = RetrofitBuilder.apiService.getAllProjects("Bearer " + auth)
                withContext(Dispatchers.Main){
                    data.value = projects
                    println("INSIDE: ${Arrays.toString(projects)}")
                    theJob.complete()
                }
            }
            println("getAllProjects DATA: ${Arrays.toString(data.value)}")
            return data
        }
    }

    fun cancelJobs(){
        job?.cancel()
    }
}

Здесь оператор печати INSIDE печатает данные в то время как getAllProjects DATA печатает ноль. В моей деятельности у меня обоих есть наблюдатель, который запускается при изменении LiveData, который также выводит ноль (я сделал это для отладки, не беспокоясь о вызовах asyn c), и у меня также есть кнопка, которая распечатывает живые данные - это также ноль.

Кто-нибудь знает, как я могу заставить это работать?

1 Ответ

0 голосов
/ 08 февраля 2020

Использовать postValue. Я предполагаю, что вы используете setValue не в основном потоке

...