[英]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.