如何在创建活动的 UI 之前使用 addOnDestinationChangedListener 更改导航组件的目的地?



我正在用谷歌推荐的SingleActivity模式开发一个应用程序。我的场景是:我的应用程序从HomeFragment的startDestination开始。如果用户没有登录,我想从登录碎片开始。我的逻辑是在DataStore中保存loggedIn状态,该状态最初为false。当我的应用程序开始启动时。在MainActivity中,我通过ViewModel观察loggedIn状态。然后我将该状态传递给一个函数。这是我的职责。

private fun setDestinationForApp(isLoggedIn: Boolean) {
navController.addOnDestinationChangedListener { _, destination, _ ->
if (destination.id == R.id.dest_home) {
if (!isLoggedIn) {
val authNavOptions = NavOptions.Builder()
.setPopUpTo(R.id.dest_home, true)
.build()
navController.navigate(R.id.action_home_to_login, Bundle(), authNavOptions)
}
}
}
}

这已经足够好了。但我面临的是:我的应用程序开始显示HomeFragment默认值,然后如果用户没有登录,则指向LoginFragment。

我想根据DataStore中的loggedIn状态显示相应的目标片段。不想首先显示默认的HomeFragment。

这可能是"活动生命周期"one_answers"导航组件"回调侦听器。但是我不够聪明。请帮帮我,我陷入了困境。如果我的问题不清楚或无法解决。请用适当的方法帮我。

这是我的全部主要活动。

@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
private val navHostFragment: NavHostFragment by lazy {
supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment
}
private val navController: NavController by lazy {
navHostFragment.navController
}
private val appBarConfiguration: AppBarConfiguration by lazy {
AppBarConfiguration(navController.graph)
}
private val loadingDialog: LoadingDialog by lazy { LoadingDialog(this) }
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupNavigation()
}
override fun observe() {
super.observe()
lifecycleScope.launchWhenCreated {
viewModel.authState.collect {
setDestinationForApp(it)
}
}
}
private fun setupNavigation() {
setSupportActionBar(binding.authToolbar)
setupActionBarWithNavController(navController, appBarConfiguration)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}
fun showLoadingDialog(text: String) {
loadingDialog.apply {
setMessage(text)
setCanceledOnTouchOutside(false)
setCancelable(false)
show()
}
}
fun hideLoadingDialog() {
loadingDialog.hide()
}
private fun setDestinationForApp(isLoggedIn: Boolean) {
navController.addOnDestinationChangedListener { _, destination, _ ->
if (destination.id == R.id.dest_home) {
if (!isLoggedIn) {
val authNavOptions = NavOptions.Builder()
.setPopUpTo(R.id.dest_home, true)
.build()
navController.navigate(R.id.action_home_to_login, Bundle(), authNavOptions)
}
}
}
}

}

这是因为导航组件从开始图片段开始。无论如何,如果您想从LoginFragment返回。它返回到CCD_ 2。因此,在这种情况下,您需要在启动过程中检查loggedIn状态,如果用户不是loggedIn,您可以通过编程更改图形的起点。这样,起点将是LoginFragment,它将永远不会导航到HomeFragment。登录过程之后,您可以恢复此逻辑,将HomeFragment设置为导航图的起点。

相关内容

  • 没有找到相关文章

最新更新