Android Liveata потеря активных наблюдателей при смене фрагмента - PullRequest
0 голосов
/ 26 мая 2020

У меня есть приложение, которое следует единому шаблону действий с несколькими фрагментами, которое использует навигацию Jetpack для навигации внутри ящика.

На одном фрагменте у меня есть учетные записи с данными в реальном времени, которые я наблюдаю из своего фрагмента как такового :

accountFragment.kt

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

    //Observe accounts list being updated
    observeAccountsEvent()
}

private fun observeAccountsEvent() {
        with(viewModel) {
            accounts.observe(viewLifecycleOwner, Observer { accounts ->
                if (accounts != null) {
                    //set loading flag to hide progress bar
                    doneLoading()

                //Alternate visibility for account list and empty view
                alternateAccountListVisibility(accounts.size)

                //Submit the cards
                initiateAccountList().submitList(accounts)
            }
        })
    }
}

accountViewModel.kt

private val sortedByName = Transformations.map(_currentAccountsExposed) {
    it.sortedBy { account ->
        account.accountName.toLowerCase(
            Locale.ROOT
        )
    }
}

private val sortedByUsername = Transformations.map(_currentAccountsExposed) {
    it.sortedBy { account ->
        account.username.toLowerCase(
            Locale.ROOT
        )
    }
}
...

init {

    //Load the accounts for the first time
    loadAccounts()

}

val accounts = Transformations.switchMap(_sort) {
    Log.i("ACCOUNT_SORT", "7. Started Transformation...")
    when (true) {
        it.name -> {
            //Log.i("ACCOUNT_SORT", "4. Name sorting...")
            sortedByName
        }
        it.username -> {
            //Log.i("ACCOUNT_SORT", "4. Username sorting...")
            sortedByUsername
        }
        it.email -> {
            //Log.i("ACCOUNT_SORT", "4. Email sorting...")
            sortedByEmail
        }
        it.website -> {
            //Log.i("ACCOUNT_SORT", "4. Website sorting...")
            sortedByWebsite
        }
        it.authType -> {
            //Log.i("ACCOUNT_SORT", "4. Auth Type sorting...")
            sortedByAuthType
        }
        else ->  {
            //Log.i("ACCOUNT_SORT", "2. current sorting...")
            _currentAccountsExposed
        }
    }
}

private fun loadAccounts() {
    _currentAccountsExposed.addSource(AccountDao().getAll(getUserID())) { snapshot ->
        _currentAccountsExposed.value = decomposeDataSnapshots(snapshot)
    }
}

internal fun click() {
  Log.i("ACCOUNT_SORT", "Accounts: ${accounts.hasActiveObservers()}")
}

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

Когда мое приложение запускается, оно переходит непосредственно к фрагменту учетных записей. Когда я нажимаю кнопку, отображается true. Но если я изменю фрагмент в ящике и вернусь к accountFragment и нажму кнопку, он покажет false. Не могли бы вы помочь, почему текущие данные моей учетной записи теряют своих наблюдателей?

У меня есть еще один cardFragment, который извлекает данные так же, как и фрагмент учетных записей, и не теряет своих активных наблюдателей. Мой источник - из firebase, и у меня нет проблем с получением данных от него. Он также отлично работает для cardsFragment, а код идентичен фрагменту account. У меня проблема только с фрагментом учетных записей. Кто-нибудь может мне помочь?

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