簡體   English   中英

當用戶第二次使用 Jetpack Compose with Flow 打開應用程序時,跳過 NavHost 中的登錄頁面

[英]Skip landing page in NavHost when user opens the app for second time using Jetpack Compose with Flow

我在 startDestination 屏幕上有一個帶有HorizontalPager ntalPager 的應用程序,在我 go 到最后一頁后,該應用程序顯示主頁。 當我第二次打開該應用程序時,它應該立即顯示主頁,並且不再顯示帶有HorizontalPager ntalPager 的 startDestination 屏幕。 我使用了dataStore,它可以工作,但問題是每次我打開應用程序時,Horizo HorizontalPager登陸頁面都會閃爍一秒鍾,然后切換到主頁。 我使用流來獲取應用程序啟動的真/假 state,所以它會知道它會知道應用程序已經第一次打開。

class MainActivity : ComponentActivity() {
    @ExperimentalAnimationApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            WebSafeTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    val navController = rememberNavController()
                    Navigation(navController)
                }
            }
        }
    }
}

@ExperimentalAnimationApi
@ExperimentalMaterialApi
@ExperimentalFoundationApi
@ExperimentalPagerApi
@Composable
fun Navigation(
    navController: NavHostController
    ) {
    val context = LocalContext.current
    val preferencesManager = PreferencesManager(context)
    val preferencesFlow = preferencesManager.preferencesFlow
    val scope = rememberCoroutineScope()
    val result = remember { mutableStateOf(Constants.SKIP_LANDING_PAGE) }
    scope.launch {
        result.value = preferencesFlow.first().skipLandingPage
    }

    NavHost(
        navController = navController,
//it goes it this line 2 times, first time when the app opens and second time after the flow is finished
        startDestination = if (result.value) Screen.HomeScreen.route else Screen.LandingScreen.route,
        modifier = Modifier.fillMaxSize()
    ) {
        composable(
            route = Screen.LandingScreen.route
        ) {
            Landing(navController)
        }
        composable(
            route = Screen.SkipChooseCountryScreen.route
        ) {
            ChooseCountry()
        }
        composable(
            route = Screen.HomeScreen.route
        ) {
            Home(navController)
        }
    }
}

它在應用程序打開后第一次進入 NavHost,它總是返回 FALSE,因為它是默認值,在該流程返回 TRUE 之后(因此它知道應用程序之前至少打開過一次),然后它打開正確的屏幕。

我不知道如何讓 NavHost 等待該流程完成。 我試圖將 NavHost 放入 scope 但它不允許我。

我還需要從數據存儲中讀取數據,所以我是這樣做的:

Crossfade(
    targetState = state.value.loadState
) { loadState ->
    when (loadState) {
        LoadState.NOT_LOADED -> Box(modifier = Modifier.fillMaxSize())
        LoadState.SHOW_PIN -> PinScreen(
            loadState = loadState,
            state = state,
            modifier = Modifier.fillMaxSize(),
        )
        LoadState.SHOW_CONTENT -> MainContent(
            state = state,
        )
    }
}

最初我的 state 是NOT_LOADED所以我只顯示一個填滿屏幕的空框。 您也可以顯示微調器或應用程序的徽標。 加載數據后,如果用戶啟用了 PIN,我將顯示 PIN 屏幕,否則顯示主屏幕。

另外,請注意,您不應該將您的瀏覽器屏幕作為您的根目的地,您的主頁應該是您的根目的地,並且如果用戶還沒有看到您的入職流程,您應該有條件地導航到瀏覽器。 檢查以獲取詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM