Android 使用片段实现组合底部导航

Android 使用片段实现组合底部导航,android,kotlin,android-jetpack,android-jetpack-compose,Android,Kotlin,Android Jetpack,Android Jetpack Compose,我按照compose创建了一个底部导航栏,创建了这样一个密封的类 sealed class Screen(val route: String, val label: String, val icon: ImageVector) { object ScreenA: Screen("screenA", "ScreenA", Icons.Default.AccountBox) object ScreenB: Screen("screen

我按照compose创建了一个底部导航栏,创建了这样一个密封的类

sealed class Screen(val route: String, val label: String, val icon: ImageVector) {
    object ScreenA: Screen("screenA", "ScreenA", Icons.Default.AccountBox)
    object ScreenB: Screen("screenB", "ScreenB", Icons.Default.ThumbUp
}
在下面的屏幕中,只包含一个文本项

@Composable
fun ScreenA() {
    Text(text = "This is ScreenA",
        style = TextStyle(color = Color.Black, fontSize = 36.sp),
        textAlign = TextAlign.Center)
}
还实现了与文档中完全相同的
Scaffold、BottomNavigation和NavHost
,一切正常

假设我现在想要一个屏幕,其中一个屏幕上显示了大量数据,这些数据包含各种业务逻辑方法,这些方法需要片段、视图模型、存储库等等。
正确的方法是什么?我仍然可以创建片段并以某种方式将它们传递给密封类吗?还是我们应该忘记片段并使所有内容都可组合?

因为您遵循文档,所以需要忘记片段。文档表明,当调用/导航到可组合函数时,每个屏幕的视图模型将被实例化。viewmodel将在未释放可组合对象时处于活动状态。这也是由单一活动方法推动的

@Inject  lateinit var factory : ViewModelProvider.Factory


@Composable
fun Profile(profileViewModel = viewModel(factory),
    userId: String,
    navigateToFriendProfile: (friendUserId: String) -> Unit) {
  
}
这可以在compose示例中看到


如果您想将两者混合使用,可以省略使用
navigation compose
,使用导航组件并使用
Fragment
,仅对片段UI使用composable

@AndroidEntryPoint
class ProfileFragment: BaseFragment() {

    private val profileViewModel by viewModels<ProfileViewModel>(viewModelFactory)
    private val profileFragmentArgs by navArg<ProfileFragmentArgs>()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return ComposeView(requireContext()).apply {
            setContent {
               Profile(profileViewModel = profileViewModel, id = profileFragmentArgs.id, navigateToFriendProfile = { findNavController().navigate(...)  })  
            }
        }
    }
@AndroidEntryPoint
类ProfileFragment:BaseFragment(){
私有val profileViewModel by viewModels(viewModelFactory)
私有val profileFragmentArgs by navArg()
覆盖创建视图(
充气机,
容器:视图组?,
savedInstanceState:捆绑?
):查看{
返回ComposeView(requireContext())。应用{
设置内容{
配置文件(profileViewModel=profileViewModel,id=profileFragmentArgs.id,navigateToFriendProfile={findNavController().navigate(…)})
}
}
}