Skip to content
This repository was archived by the owner on Aug 2, 2024. It is now read-only.

Commit 2b60ca9

Browse files
Modify collectAsState to collectAsStateWithLifecycle (#976)
Co-authored-by: Ben Trengrove <[email protected]>
1 parent 6ba253c commit 2b60ca9

File tree

6 files changed

+26
-7
lines changed

6 files changed

+26
-7
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ dependencies {
138138
implementation(libs.androidx.compose.ui.tooling.preview)
139139
implementation(libs.androidx.compose.runtime.livedata)
140140
implementation(libs.androidx.lifecycle.viewmodel.compose)
141+
implementation(libs.androidx.lifecycle.runtime.compose)
141142
implementation(libs.glide)
142143
implementation(libs.accompanist.systemuicontroller)
143144
debugImplementation(libs.androidx.compose.ui.tooling)

app/src/main/java/com/google/samples/apps/sunflower/compose/garden/GardenScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import androidx.compose.material3.ElevatedCard
3535
import androidx.compose.material3.MaterialTheme
3636
import androidx.compose.material3.Text
3737
import androidx.compose.runtime.Composable
38-
import androidx.compose.runtime.collectAsState
3938
import androidx.compose.runtime.getValue
4039
import androidx.compose.ui.Alignment
4140
import androidx.compose.ui.Modifier
@@ -47,6 +46,7 @@ import androidx.compose.ui.tooling.preview.Preview
4746
import androidx.compose.ui.tooling.preview.PreviewParameter
4847
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
4948
import androidx.hilt.navigation.compose.hiltViewModel
49+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
5050
import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
5151
import com.bumptech.glide.integration.compose.GlideImage
5252
import com.google.samples.apps.sunflower.R
@@ -65,7 +65,7 @@ fun GardenScreen(
6565
onAddPlantClick: () -> Unit,
6666
onPlantClick: (PlantAndGardenPlantings) -> Unit
6767
) {
68-
val gardenPlants by viewModel.plantAndGardenPlantings.collectAsState(initial = emptyList())
68+
val gardenPlants by viewModel.plantAndGardenPlantings.collectAsStateWithLifecycle()
6969
GardenScreen(
7070
gardenPlants = gardenPlants,
7171
modifier = modifier,

app/src/main/java/com/google/samples/apps/sunflower/compose/plantdetail/PlantDetailView.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ import androidx.compose.material3.Surface
5555
import androidx.compose.material3.Text
5656
import androidx.compose.material3.TopAppBar
5757
import androidx.compose.runtime.Composable
58-
import androidx.compose.runtime.collectAsState
58+
5959
import androidx.compose.runtime.getValue
6060
import androidx.compose.runtime.livedata.observeAsState
6161
import androidx.compose.runtime.mutableStateOf
@@ -82,6 +82,7 @@ import androidx.compose.ui.viewinterop.AndroidViewBinding
8282
import androidx.constraintlayout.compose.ConstraintLayout
8383
import androidx.core.text.HtmlCompat
8484
import androidx.hilt.navigation.compose.hiltViewModel
85+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
8586
import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
8687
import com.bumptech.glide.integration.compose.GlideImage
8788
import com.bumptech.glide.load.DataSource
@@ -116,7 +117,7 @@ fun PlantDetailsScreen(
116117
onGalleryClick: (Plant) -> Unit,
117118
) {
118119
val plant = plantDetailsViewModel.plant.observeAsState().value
119-
val isPlanted = plantDetailsViewModel.isPlanted.collectAsState(initial = false).value
120+
val isPlanted = plantDetailsViewModel.isPlanted.collectAsStateWithLifecycle().value
120121
val showSnackbar = plantDetailsViewModel.showSnackbar.observeAsState().value
121122

122123
if (plant != null && showSnackbar != null) {

app/src/main/java/com/google/samples/apps/sunflower/viewmodels/GardenPlantingListViewModel.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,25 @@
1717
package com.google.samples.apps.sunflower.viewmodels
1818

1919
import androidx.lifecycle.ViewModel
20+
import androidx.lifecycle.viewModelScope
2021
import com.google.samples.apps.sunflower.data.GardenPlantingRepository
2122
import com.google.samples.apps.sunflower.data.PlantAndGardenPlantings
2223
import dagger.hilt.android.lifecycle.HiltViewModel
23-
import kotlinx.coroutines.flow.Flow
24+
import kotlinx.coroutines.flow.SharingStarted
25+
import kotlinx.coroutines.flow.StateFlow
26+
import kotlinx.coroutines.flow.stateIn
2427
import javax.inject.Inject
2528

2629
@HiltViewModel
2730
class GardenPlantingListViewModel @Inject internal constructor(
2831
gardenPlantingRepository: GardenPlantingRepository
2932
) : ViewModel() {
30-
val plantAndGardenPlantings: Flow<List<PlantAndGardenPlantings>> =
31-
gardenPlantingRepository.getPlantedGardens()
33+
val plantAndGardenPlantings: StateFlow<List<PlantAndGardenPlantings>> =
34+
gardenPlantingRepository
35+
.getPlantedGardens()
36+
.stateIn(
37+
viewModelScope,
38+
SharingStarted.WhileSubscribed(5000),
39+
emptyList()
40+
)
3241
}

app/src/main/java/com/google/samples/apps/sunflower/viewmodels/PlantDetailViewModel.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import com.google.samples.apps.sunflower.BuildConfig
2626
import com.google.samples.apps.sunflower.data.GardenPlantingRepository
2727
import com.google.samples.apps.sunflower.data.PlantRepository
2828
import dagger.hilt.android.lifecycle.HiltViewModel
29+
import kotlinx.coroutines.flow.SharingStarted
30+
import kotlinx.coroutines.flow.stateIn
2931
import kotlinx.coroutines.launch
3032
import javax.inject.Inject
3133

@@ -42,6 +44,11 @@ class PlantDetailViewModel @Inject constructor(
4244
val plantId: String = savedStateHandle.get<String>(PLANT_ID_SAVED_STATE_KEY)!!
4345

4446
val isPlanted = gardenPlantingRepository.isPlanted(plantId)
47+
.stateIn(
48+
viewModelScope,
49+
SharingStarted.WhileSubscribed(5000),
50+
false
51+
)
4552
val plant = plantRepository.getPlant(plantId).asLiveData()
4653

4754
private val _showSnackbar = MutableLiveData(false)

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", vers
8787
androidx-espresso-intents = { module = "androidx.test.espresso:espresso-intents", version.ref = "espresso" }
8888
androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycle" }
8989
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "viewModelCompose" }
90+
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "viewModelCompose" }
9091
androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
9192
androidx-monitor = { module = "androidx.test:monitor", version.ref = "monitor" }
9293
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" }

0 commit comments

Comments
 (0)