Функция репозитория onActive не вызывается с помощью Retrofit и LiveData - PullRequest
0 голосов
/ 31 января 2020

Я новичок в разработке Android и пытаюсь реализовать форму входа. У меня есть вход в систему, в котором есть поле для имени пользователя и пароля: оно выглядит следующим образом:

class LoginActivity : AppCompatActivity() {

    lateinit var viewModel: MainViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        val button: Button = findViewById(R.id.button)
        button.setOnClickListener { onButtonClick() }
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        viewModel.userLogin.observe(this, Observer{ user ->
            print("Debug: ${user}")
        })
    }

    fun onButtonClick(){
        var username: EditText = findViewById(R.id.username)
        var password: EditText = findViewById(R.id.password)
        println(username.text.toString())
        println(password.text.toString())
        viewModel.loadUser(username.text.toString(), password.text.toString())
    }
}

После нажатия кнопки вызывается функция loaduser в модели представления.

Мой MainViewModel выглядит следующим образом (я думаю, что здесь ошибка):

class MainViewModel : ViewModel(){

    var userLogin: MutableLiveData<LoggedInUser> = MutableLiveData()


    fun getUser(): LiveData<LoggedInUser> {
        return userLogin
    }

    fun loadUser(username: String, password: String) {
        println("loading user")
        userLogin.value =  MainRepository.authenticateUser(username, password).value
    }
}

Я почти уверен, что моя ViewModel не реализована правильно, но loading user печатает в консоли loadUser затем вызывает authenticateUser в моем репозитории, где у меня есть следующий код:

object MainRepository {
    var job: CompletableJob? = null
    fun authenticateUser(username: String, password: String): LiveData<LoggedInUser>{
        println("in MainRepo")
        return object: LiveData<LoggedInUser>(){
            override fun onActive() {
                println("in MainRepo 2")
                super.onActive()
                job?.let { theJob ->
                    CoroutineScope(context = IO + theJob).launch {
                        println("in MainRepo 3")
                        val user = RetrofitBuilder.apiService.login(username, password)
                        withContext(Main){
                            value = user
                            theJob.complete()
                        }
                    }
                }
            }
        }
    }

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

Функция onActive никогда не вызывается, то есть запрос REST API никогда не выполняется. Я знаю это, потому что вижу, что println("in MainRepo") вызывается, а два других оператора печати не println("in MainRepo2")' && println("in MainRepo3")

. Любая помощь будет принята!

РЕДАКТИРОВАТЬ добавлено класс дооснащения

object RetrofitBuilder{

    const val BASE_URL = "https://database.herokuapp.com/"

    val retrofitBuilder: Retrofit.Builder by lazy {
        println(BASE_URL)
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
    }
    val apiService: ApiService by lazy {
        retrofitBuilder
            .build()
            .create(ApiService::class.java)
    }
}
...