From 99aae396b5c6ef0f8ff15f67b0678ec4ecc66a25 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Mon, 1 Nov 2021 10:58:51 +0530 Subject: [PATCH] Improve: Hold state on Device State Change Improve: Dont emit after 5 seconds of onPause() (Fix Memory Leak & Potential Crashes) --- .../droidify/screen/ProductsFragment.kt | 8 ++++---- .../looker/droidify/ui/ProductsViewModel.kt | 20 ++++++++++++++++--- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt index 2e8c4013..1aa5924f 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt @@ -50,19 +50,19 @@ class ProductsFragment() : BaseFragment(), CursorOwner.Callback { private val searchQuery: String get() { var _searchQuery = "" - lifecycleScope.launchWhenStarted { viewModel.searchQuery.collect { _searchQuery = it } } + lifecycleScope.launchWhenCreated { viewModel.searchQuery.collect { _searchQuery = it } } return _searchQuery } private val section: ProductItem.Section get() { var _section: ProductItem.Section = ProductItem.Section.All - lifecycleScope.launchWhenStarted { viewModel.sections.collect { _section = it } } + lifecycleScope.launchWhenCreated { viewModel.sections.collect { _section = it } } return _section } private val order: ProductItem.Order get() { var _order: ProductItem.Order = ProductItem.Order.LAST_UPDATE - lifecycleScope.launchWhenStarted { viewModel.order.collect { _order = it } } + lifecycleScope.launchWhenCreated { viewModel.order.collect { _order = it } } return _order } @@ -95,7 +95,7 @@ class ProductsFragment() : BaseFragment(), CursorOwner.Callback { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { return RecyclerView(requireContext()).apply { id = android.R.id.list diff --git a/src/main/kotlin/com/looker/droidify/ui/ProductsViewModel.kt b/src/main/kotlin/com/looker/droidify/ui/ProductsViewModel.kt index 562ab35a..3502822d 100644 --- a/src/main/kotlin/com/looker/droidify/ui/ProductsViewModel.kt +++ b/src/main/kotlin/com/looker/droidify/ui/ProductsViewModel.kt @@ -5,7 +5,9 @@ import androidx.lifecycle.viewModelScope import com.looker.droidify.entity.ProductItem import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch class ProductsViewModel : ViewModel() { @@ -14,9 +16,21 @@ class ProductsViewModel : ViewModel() { private val _sections = MutableStateFlow(ProductItem.Section.All) private val _searchQuery = MutableStateFlow("") - val order: StateFlow = _order - val sections: StateFlow = _sections - val searchQuery: StateFlow = _searchQuery + val order: StateFlow = _order.stateIn( + initialValue = ProductItem.Order.LAST_UPDATE, + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5000) + ) + val sections: StateFlow = _sections.stateIn( + initialValue = ProductItem.Section.All, + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5000) + ) + val searchQuery: StateFlow = _searchQuery.stateIn( + initialValue = "", + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5000) + ) fun setSection(newSection: ProductItem.Section, perform: () -> Unit) { viewModelScope.launch(Dispatchers.Main) {