Implemented AssistedInject for details screen

This commit is contained in:
2024-07-29 12:07:13 +02:00
parent 08da2cbbe0
commit aab5f5e0de
25 changed files with 195 additions and 34 deletions

View File

@ -14,7 +14,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
@ -34,6 +33,7 @@ import dev.adriankuta.pixabay.core.ui.R.drawable
import dev.adriankuta.pixabay.core.ui.R.string
import dev.adriankuta.pixabay.core.ui.StatsItem
import dev.adriankuta.pixabay.data.model.PixabayImage
import dev.adriankuta.pixabay.feature.details.di.PhotoDetailsViewModelFactory
@Composable
@ -41,15 +41,15 @@ fun PhotoDetailRoute(
photoId: Int,
onBack: () -> Unit,
modifier: Modifier = Modifier,
viewModel: PhotoDetailViewModel = hiltViewModel()
viewModel: PhotoDetailViewModel = hiltViewModel(
creationCallback = { factory: PhotoDetailsViewModelFactory ->
factory.create(photoId)
}
)
) {
val uiState by viewModel.uiState.collectAsState()
LaunchedEffect(photoId) {
viewModel.loadImage(photoId)
}
PhotoDetailScreen(
state = uiState,
modifier = modifier

View File

@ -1,31 +1,26 @@
@file:OptIn(ExperimentalCoroutinesApi::class)
package dev.adriankuta.pixabay.feature.details
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.adriankuta.pixabay.data.repository.ImageRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import dev.adriankuta.pixabay.feature.details.di.PhotoDetailsViewModelFactory
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import javax.inject.Inject
@HiltViewModel
class PhotoDetailViewModel @Inject constructor(
private val imageRepository: ImageRepository
@HiltViewModel(assistedFactory = PhotoDetailsViewModelFactory::class)
class PhotoDetailViewModel @AssistedInject constructor(
private val imageRepository: ImageRepository,
@Assisted private val imageId: Int
) : ViewModel() {
private val _idToLoad = MutableStateFlow<Int?>(null)
private val loadedData = _idToLoad
.filterNotNull()
.map { id ->
imageRepository.searchImageById(id)
}
private val loadedData = flow {
emit(imageRepository.searchImageById(imageId))
}
val uiState = loadedData
.map { PhotoDetailUiState.Success(it) }
@ -34,9 +29,4 @@ class PhotoDetailViewModel @Inject constructor(
started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5000),
initialValue = PhotoDetailUiState.Loading
)
fun loadImage(id: Int) {
_idToLoad.value = id
}
}

View File

@ -0,0 +1,9 @@
package dev.adriankuta.pixabay.feature.details.di
import dagger.assisted.AssistedFactory
import dev.adriankuta.pixabay.feature.details.PhotoDetailViewModel
@AssistedFactory
internal interface PhotoDetailsViewModelFactory {
fun create(imageId: Int): PhotoDetailViewModel
}