У меня есть приложение, которое следует единому шаблону действий с несколькими фрагментами, которое использует навигацию 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. У меня проблема только с фрагментом учетных записей. Кто-нибудь может мне помочь?