Android LiveData: невозможно получать обновления на Observable? - PullRequest
0 голосов
/ 01 октября 2018

Я использую LiveData компонента архитектуры Android для уведомления пользовательского интерфейса, используя Observable LiveData, но он не запускается.ниже приведен фрагмент кода.

AuthRepository

    class AuthRepository(private val repository:Avails) {


    fun auth(mobile: String): LiveData<Boolean>{
        var data: MutableLiveData<Boolean> = MutableLiveData()
        repository.auth(prepareHeaders(), AuthRequest(mobile))
                .enqueue(object : Callback<AuthResponse>{

                    override fun onResponse(call: Call<AuthResponse>, response: Response<AuthResponse>) {
                        if(response.isSuccessful){

                            data.value = true
                        }
                    }

                    override fun onFailure(call: Call<AuthResponse>, t: Throwable) {
                            data.value = false
                    }
                })

        return data
    }
}

LoginViewModel

class LoginViewModel(private val repository: AuthRepository) : ViewModel() {

    var _showOtpScreen: MutableLiveData<Boolean> = MutableLiveData()

    fun auth(mobile: String){
        _showOtpScreen.value =  repository.auth(mobile).value
    }
}

LoginFragment

class LoginFragment : Fragment() {

    private lateinit var loginViewModel: LoginViewModel

    companion object {
        private const val sTag: String = "LoginFragment"
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        val authRepository = AuthRepository(AvailsClient.retrofit.create(Avails::class.java))
        loginViewModel = ViewModelProviders.of(this,LoginViewModelFactory(authRepository)).get(LoginViewModel::class.java)

        loginViewModel._showOtpScreen.observe(this, Observer {

            if(it != null){
                if(it){
                    Log.e(sTag,"OTP RECEIVED")
                    findNavController().navigate(R.id.action_loginFragment_to_verifyOtpFragment)
                }else{
                    Log.e(sTag,"Failed to get OTP")
                }
            }

        })
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_login, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)


        btnContinue.setOnClickListener {
            loginViewModel.auth(edtPhoneNumber.text.toString())

        }
    }

}

Приведенный выше код не может наблюдать _showOtpScreen, он вызывается только один раз со значением NULL и никогда не вызывается после завершения вызова службы.

1 Ответ

0 голосов
/ 05 октября 2018

Оболочка события - решение вышеуказанной проблемы.

...