Jetpack Compose 导航库问题 - 条件导航

问题描述 投票:0回答:1

基本上,我正在处理的问题是我有两个屏幕: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”来确定起始目的地,该函数基本上获取了路线

android kotlin android-jetpack-compose
1个回答
0
投票

可能是因为第一次调用的

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
}

© www.soinside.com 2019 - 2024. All rights reserved.