Я новичок в разработке 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)
}
}