我正在将我的应用程序从视图中移动到 jetpack compose。默认导航使用
nav_graph
。该应用程序的构建遵循一个活动、多个片段的原则。为了缓慢地移动应用程序,我尝试将撰写的内容加载到片段中。所以片段可以看作是 compose 的巢穴。我这样做是为了在移动导航之前将导航保持在适当的位置。我正在尝试使用 nav_graph 进行撰写以导航到片段。
目前,我的片段如下所示:
登录片段:
class SignInFragment : BaseFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val composeView = ComposeView(requireContext())
composeView.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
activity?.let {
SignInScreen()
}
}
}
return composeView
}
}
我正在尝试导航到
HomeFragment
。目前,我使用的导航如下:
findNavController().navigate(SignInFragmentDirections.actionSignInFragmentToHomeFragment())
现在我的可组合如下:
@Composable
fun SignInScreen(authViewModel: AuthViewModel = viewModel())
{
val authState by authViewModel.authState.collectAsState()
val lifecycleEventObserver = remember {
LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
authViewModel.checkAuthorized()
}
}
}
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleEventObserver)
if(authState is AuthUIState.LoginSuccess) {
navigateToDashboard()
}
Button(
onClick = { authViewModel.signIn() },
) {
Text("SignIn")
}
}
fun navigateToDashboard() {
// Try to navigate to home fragment
}
基本上,当我加载
SignInScreen
时,我正在检查授权的状态。如果获得授权,我将重定向到主页,否则,我将显示用户登录的按钮。
我想不出办法来做到这一点
navigateToDashboard()
我真的想保留片段仅用于 nav_graph,这样我就可以在所有屏幕都处于 Compose 状态时进行转换。
有什么想法吗?
让您的片段像以前一样进行导航。
将回调函数作为参数从片段传递到 compose。
因此,根据您的代码,像这样更改 SignInFragment:
class SignInFragment : BaseFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val composeView = ComposeView(requireContext())
composeView.apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
setContent {
activity?.let {
SignInScreen(
navigateToDashboard = ::navigateToDashboard
)
}
}
}
return composeView
}
fun navigateToDashboard(){
findNavController().navigate(SignInFragmentDirections.actionSignInFragmentToDashboardFragment())
}
}
和登录屏幕:
@Composable
fun SignInScreen(
authViewModel: AuthViewModel = viewModel(),
navigateToDashboard:()->Unit,
){
val authState by authViewModel.authState.collectAsState()
val lifecycleEventObserver = remember {
LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
authViewModel.checkAuthorized()
}
}
}
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleEventObserver)
if(authState is AuthUIState.LoginSuccess) {
navigateToDashboard()
}
Button(
onClick = { authViewModel.signIn() },
) {
Text("SignIn")
}
}
希望有帮助。