Skip to content

Commit 1594990

Browse files
committed
Fix flow bug
1 parent 154ff77 commit 1594990

File tree

4 files changed

+59
-46
lines changed

4 files changed

+59
-46
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ dependencies {
7474
def lifecycleVersion = '2.4.0-rc01'
7575
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycleVersion"
7676
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion"
77+
implementation 'androidx.compose.runtime:runtime-livedata:1.0.3'
7778

7879
//Coroutines
7980
api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1'

app/src/main/java/st/slex/csplashscreen/ui/MainActivity.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,16 @@ fun NavigationComponent(navController: NavHostController, viewModel: MainViewMod
7575
navArgument("imageId") { type = NavType.StringType }
7676
)
7777
) {
78+
7879
val imageId = it.arguments?.getString("imageId").toString()
7980
val url = it.arguments?.getString("url").toString()
81+
82+
viewModel.getCurrentPhoto(imageId)
83+
8084
ImageDetailScreen(
8185
url = url,
82-
imageId = imageId,
83-
viewModel = viewModel,
84-
navController = navController
86+
navController = navController,
87+
viewModel::currentPhoto
8588
)
8689
}
8790

app/src/main/java/st/slex/csplashscreen/ui/MainViewModel.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope
55
import androidx.paging.*
66
import kotlinx.coroutines.ExperimentalCoroutinesApi
77
import kotlinx.coroutines.flow.*
8+
import kotlinx.coroutines.launch
89
import st.slex.csplashscreen.data.core.Mapper
910
import st.slex.csplashscreen.data.model.remote.download.RemoteDownloadModel
1011
import st.slex.csplashscreen.data.model.remote.image.RemoteImageModel
@@ -30,9 +31,13 @@ class MainViewModel @Inject constructor(
3031
) : ViewModel() {
3132

3233

33-
fun getCurrentPhoto(id: String): Flow<UIResult<ImageModel>> = flow {
34+
private val _currentPhoto = MutableStateFlow<UIResult<ImageModel>>(UIResult.Loading)
35+
val currentPhoto: StateFlow<UIResult<ImageModel>>
36+
get() = _currentPhoto.asStateFlow()
37+
38+
fun getCurrentPhoto(id: String) = viewModelScope.launch {
3439
repository.getCurrentPhoto(id).collect {
35-
emit(it.map(mapper = photoMapper))
40+
_currentPhoto.value = it.map(mapper = photoMapper)
3641
}
3742
}
3843

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,66 @@
11
package st.slex.csplashscreen.ui.detail
22

3-
import android.annotation.SuppressLint
43
import android.util.Log
4+
import androidx.compose.foundation.Image
5+
import androidx.compose.foundation.clickable
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.fillMaxWidth
8+
import androidx.compose.foundation.layout.height
59
import androidx.compose.runtime.Composable
610
import androidx.compose.runtime.collectAsState
7-
import androidx.compose.runtime.rememberCoroutineScope
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.unit.dp
813
import androidx.navigation.NavController
914
import coil.annotation.ExperimentalCoilApi
15+
import coil.compose.rememberImagePainter
16+
import coil.transform.RoundedCornersTransformation
1017
import kotlinx.coroutines.ExperimentalCoroutinesApi
11-
import st.slex.csplashscreen.ui.MainViewModel
18+
import kotlinx.coroutines.flow.StateFlow
19+
import st.slex.csplashscreen.data.model.ui.image.ImageModel
20+
import st.slex.csplashscreen.ui.core.UIResult
21+
import java.net.URLEncoder
22+
import java.nio.charset.StandardCharsets
1223

13-
@SuppressLint("CoroutineCreationDuringComposition")
1424
@ExperimentalCoroutinesApi
1525
@ExperimentalCoilApi
1626
@Composable
1727
fun ImageDetailScreen(
1828
url: String,
19-
imageId: String,
20-
viewModel: MainViewModel,
2129
navController: NavController,
30+
imageFlow: () -> StateFlow<UIResult<ImageModel>>
2231
) {
23-
val stateFlow = viewModel.getCurrentPhoto(imageId)
24-
val viewState =
25-
viewModel.getCurrentPhoto(imageId).collectAsState(rememberCoroutineScope().coroutineContext)
26-
Log.i("THisIsResult", viewState.toString())
27-
val result = viewState.value
28-
/*when (val result = viewState.value) {
29-
is UIResult.Success -> {
30-
viewState.wait().notifyAll()
31-
Column {
32-
Image(
33-
modifier = Modifier
34-
.fillMaxWidth()
35-
.height(300.dp)
36-
.clickable {
37-
val encodedUrl =
38-
URLEncoder.encode(url, StandardCharsets.UTF_8.toString())
39-
navController.navigate("raw_image/$encodedUrl")
40-
},
41-
painter = rememberImagePainter(
42-
data = result.data.urls.regular,
43-
builder = {
44-
transformations(RoundedCornersTransformation())
45-
allowHardware(false)
46-
crossfade(500)
47-
}
48-
),
49-
contentDescription = "TestImage"
50-
)
51-
}
52-
}
53-
is UIResult.Loading -> {
54-
55-
}
56-
is UIResult.Failure -> {
32+
val imageModel = imageFlow().collectAsState().value
5733

34+
when (imageModel) {
35+
is UIResult.Success -> {
36+
BindImage(navController, url, imageModel.data)
5837
}
59-
}*/
38+
}
6039

40+
Log.i("imageModel", imageModel.toString())
41+
}
6142

43+
@Composable
44+
fun BindImage(navController: NavController, url: String, imageModel: ImageModel) {
45+
Column {
46+
Image(
47+
modifier = Modifier
48+
.fillMaxWidth()
49+
.height(300.dp)
50+
.clickable {
51+
val encodedUrl =
52+
URLEncoder.encode(url, StandardCharsets.UTF_8.toString())
53+
navController.navigate("raw_image/$encodedUrl")
54+
},
55+
painter = rememberImagePainter(
56+
data = imageModel.urls.regular,
57+
builder = {
58+
transformations(RoundedCornersTransformation())
59+
allowHardware(false)
60+
crossfade(500)
61+
}
62+
),
63+
contentDescription = "TestImage"
64+
)
65+
}
6266
}

0 commit comments

Comments
 (0)