Запутался насчет LiveData Observe - PullRequest
0 голосов
/ 14 февраля 2019

Моя ситуация: когда пользователь вводит загрузочный фрагмент, отметьте LoggedIn, true перейдите прямо к MainFragment, false перейдите к LoginFramgnet.вот LoadingFragment:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        Logger.t(LoadingFragment::class.java.simpleName).i("onCreateView")
        val binding = LoadingFragmentBinding.inflate(inflater, container, false)
        subscribeUi()
        return binding.root
    }

    fun subscribeUi(){
        val factory: LoadingViewModelFactory = InjectorUtils.provideLoadingViewModelFactory()
        val viewModel: LoadingViewModel = ViewModelProviders.of(this, factory).get(LoadingViewModel::class.java)
        Logger.t(LoadingFragment::class.java.simpleName).i("viewModel = " + viewModel.toString())
        viewModel.checkLogin()
        viewModel.isToLogin.observe(viewLifecycleOwner, Observer {
            if (it){
                findNavController().navigate(R.id.action_loading_fragment_to_garden_fragment)
            }else{
                Logger.t(LoadingFragment::class.java.simpleName).i("to start login")
                findNavController().navigate(R.id.start_login)
            }
        })

    }

вот LoadingViewModel:

class LoadingViewModel(
        private val loadingRepository: LoadingRepository
) : ViewModel() {

    val isToLogin: MediatorLiveData<Boolean> = MediatorLiveData()

    fun checkLogin(){
        isToLogin.addSource(loadingRepository.checkLogin()) {
            isToLogin.value = it
        }
    }
}

вот загрузочный репозиторий:

fun checkLogin() : MutableLiveData<Boolean> {
        val data: MutableLiveData<Boolean> = MutableLiveData()
        api.httpGet(SDBUrl.CHECK_LOGIN).enqueue(object : Callback<Map<String, Any>>{
            override fun onFailure(call: Call<Map<String, Any>>, t: Throwable) {
                data.value = false
            }

            override fun onResponse(call: Call<Map<String, Any>>, response: Response<Map<String, Any>>) {
                val result = response.body()
                if (result != null && result.containsKey("success")){
                    val isLogin = result["success"] as Boolean
                    data.value = isLogin
                }else{
                    data.value = false
                }
            }
        })
        return data
    }

при входе в систему, popback to LoadingFragment, isToLogin наблюдать за выполнениемеще сразу, LoginFragment начать agagin.когда я отлаживаю, подожди некоторое время на LoginFragment popBackStack, затем вернись к загрузке фрагмента, isToLogin наблюдает за выполнением true. Так что я очень запутался, как мне это исправить.

1 Ответ

0 голосов
/ 15 февраля 2019

Наконец, я решил эту проблему следующим образом.

class LoadingViewModel(
        private val loadingRepository: LoadingRepository
) : ViewModel() {

    fun checkLogin(): MediatorLiveData<Boolean> {
        val isToLogin : MediatorLiveData<Boolean> = MediatorLiveData()
        isToLogin.addSource(loadingRepository.checkLogin()) {
            Logger.t(LoadingViewModel::class.java.simpleName).i("it = $it")
            isToLogin.value = it
        }
        return isToLogin
    }

}

затем в LoadingFragment:

loadingViewModel.checkLogin().observe(viewLifecycleOwner, Observer {
            Logger.i("isToLogin = $it")
            if (it) {

                findNavController().navigate(R.id.action_loading_fragment_to_garden_fragment)
            } else {

                findNavController().navigate(R.id.start_login)
            }
        })
...