Implemented AssistedInject for details screen
This commit is contained in:
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
Reference in New Issue
Block a user