@Composable
fun SplashScreen(
viewModel: SplashViewModel = hiltViewModel(),
navController: NavController,
) {
Log.e("SplashScreen", "In SplashScreen")
val state by viewModel.getDBrow().collectAsStateWithLifecycle() //collect database empty or not
render(state = state, navController = navController) //when success go homescreen
}
@HiltViewModel
class SplashViewModel @Inject constructor(private val repository: Repository) : ViewModel() {
override fun onCleared() {
Log.e("SplashViewModel", "super.onCleared()")
super.onCleared()
}
fun getDBrow(): StateFlow<DataState> =
repository.getRowCount().map {
if (it < 2) { DataState.Loading as DataState
} else {
DataState.Success(
emptyList(),
"yay it success",
) as DataState
} as DataState
}.stateIn(viewModelScope, initialValue = DataState.Loading, started = SharingStarted.Lazily)
}
@Composable
fun HomeScreen(navController: NavController, viewModel: HomeViewModel = hiltViewModel()) {
Log.e("HomeScreen", "In Home screen")
Text(text = "Hello Hello")
}
TLDR: I did 'collectAsStateWithLifecycle()' in composable like in How to safely (lifecycle aware) .collectAsState() a StateFlow? but it is not working. This SplashScreen recompose itself after app navigate to HomeScreen.( App start SplashScreen, compose, navigate HomeScreen and restart SplashScreen compose and navigate HomeScreen in a cycle which I don't want). getDBrow is simply in dao (then repository) like:
@Query("SELECT COUNT(*) FROM table")
fun getCount(): Flow<Int>
I need to get Flow data from Room. Why do 'val state by viewModel.getDBrow().collectAsStateWithLifecycle()' not work as lifecycle aware? Why do it not shutdown? Am I missing something?
Non-stop log is like:
E/Navigation: to Home
E/HomeScreen: In Home screen
E/Navigation: to Home
E/HomeScreen: In Home screen
E/Navigation: to Home
E/HomeScreen: In Home screen
E/Navigation: to Home
E/HomeScreen: In Home screen
E/Navigation: to Home
E/HomeScreen: In Home screen
E/SplashScreen: In SplashScreen
Edit: Added an Sample Project to Github.