基本上,我正在处理的问题是我有两个屏幕:OnBoarding 和登录。当用户第一次安装并打开应用程序时,我保存 true 以指示这是第一次。
当用户多次打开应用程序时,它的目的是将他们发送到登录屏幕,但首先显示入门屏幕几秒钟,然后导航到登录屏幕,请参阅下面的代码:
@Composable
fun Navigation() {
val navController = rememberNavController()
val onBoardingViewModel = hiltViewModel<OnBoardingViewModel>()
val isTheFirstTimeInstalled = onBoardingViewModel.onBoardingState.collectAsStateWithLifecycle()
val startDest = getStartDest(isTheFirstTimeInstalled.value)
NavHost(
navController = navController,
startDestination = startDest,
enterTransition = { slideIn() },
exitTransition = { slideOut() },
) { // some code }
OnBoardingViewModel:
@HiltViewModel
class OnBoardingViewModel @Inject constructor(
private val dataStore: PreferencesDatastore
) : ViewModel() {
private val _onBoardingState = MutableStateFlow(false)
val onBoardingState = _onBoardingState.asStateFlow()
init {
viewModelScope.launch(Dispatchers.IO) {
_onBoardingState.value = dataStore.getOnBoardingState().first()
}
}
fun setFirstTimeInstalled() {
viewModelScope.launch(Dispatchers.IO) {
dataStore.saveOnBoardingState(true)
}
}
}
有什么办法可以解决这个问题吗?请告诉我!
我只是尝试通过调用我的函数“getStartDest”来确定起始目的地,该函数基本上获取了路线
可能是因为第一次调用的
isTheFirstTimeInstalled
仍然是false
,这是private val _onBoardingState = MutableStateFlow(false)
上的默认值,所以第一个调用的屏幕仍然是onboarding,然后当_onBoardingState
更新时,会显示登录屏幕.
解决方案是,也许您必须在起始目的地制作某种启动屏幕,在此屏幕中您将获得
_onBoardingState
并根据值导航到入门屏幕或登录屏幕。
您的 NavHostFragment:
NavHost(
startDestination = "Splash"
){
//navhost code
}
您的启动画面:
@Composable
fun SplashScreen(
navController:NavHostController
){
LaunchedEffect(Unit){
if(onBoardingState){
navController.navigate("onboarding")
} else {
navController.navigate("login")
}
}
//splash content
}