当 compose 由fragment托管时,从 compose 导航到fragment

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

我正在将我的应用程序从视图中移动到 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 状态时进行转换。

有什么想法吗?

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

让您的片段像以前一样进行导航。
将回调函数作为参数从片段传递到 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")
    }

}

希望有帮助。

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