Почему вызывается onChanged, когда я возвращаюсь к фрагменту? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть ViewModel, управляющий моей бизнес-логикой, и я использую Koin, чтобы внедрить это в свою деятельность и каждый из моих фрагментов. Однако после перехода от фрагмента A к фрагменту B и перехода обратно к фрагменту A мой наблюдатель снова запускается. Почему это происходит и как я могу остановить запуск этого onChanged при переходе назад?

Я попытался установить оба параметра: this и viewLifecycleOwner в качестве LifecycleOwner LiveData.

Iтакже пытались переместить наблюдаемое в onCreate, onActivityCreated и onViewCreated

My ViewModel:

class MyViewModel : ViewModel() {

    private val _myData = MutableLiveData<Data>()
    val myData = LiveData<Data>()
        get() = _myData

    fun doSomething() {
        ... // some code
        _myData.postValue(myResult)
}

MyActivity:

class Activity : BaseActivity() {

    private val viewModel by viewModel<MyViewModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        setSupportActionBar(main_toolbar)

        subscribeUI()
    }

    private fun subscribeUI() {
        myViewModel.isLoading.observe(this, Observer {
            toggleProgress(it)
        })
    }
}

Фрагмент A:

class FragmentA : BaseFragment() {

    private val viewModel by sharedViewModel<MyViewModel>()

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        subscribeUI()
    }

    private fun subscribeUI() {
        viewModel.myData.observe(viewLifecycleOwner, Observer {
            val direction =
                FragmentADirections.actionAtoB()
            mainNavController?.navigate(direction)
        })
    }
}

Фрагмент B:

class FragmentB : BaseFragment() {

    private val authViewModel by sharedViewModel<LoginViewModel>()

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        subscribeUI()
    }

    private fun subscribeUI() {
        viewModel.otherData.observe(viewLifecycleOwner, Observer {
            // Do something else...
        })
    }
}

Когда я перемещаюсь из Фрагмента A -> Фрагмента B, все работает, как я ожидаю. Однако, когда я возвращаюсь к Фрагменту A из Фрагмента B (нажатием кнопки назад), вызывается метод onChanged из Обозревателя на myData, и навигация возвращается к Навигации B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...