android - 使用 Fragments 实现 Compose 底部导航

标签 android kotlin android-jetpack android-jetpack-compose

我按照撰写documentation通过创建这样一个密封类来创建底部导航栏

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,并且一切运行正常。

假设我现在想要在一个屏幕上显示一大堆数据,并在列表中显示各种业务逻辑方法,这些方法需要 Fragment、ViewModel、Repository 等。 正确的做法是什么?我仍然可以创建 fragment 并以某种方式将它们传递给密封类,还是我们应该忘记 fragment 并让所有内容都可组合?

最佳答案

由于您正在遵循文档,因此您需要忘记 fragment 。文档表明,当调用/导航到可组合函数时,将实例化每个屏幕的 View 模型。当可组合项未释放时, View 模型将存活。这也是由单一 Activity 方法插入的。

@Inject  lateinit var factory : ViewModelProvider.Factory


@Composable
fun Profile(profileViewModel = viewModel(factory),
    userId: String,
    navigateToFriendProfile: (friendUserId: String) -> Unit) {
  
}

这可以在撰写示例 here 中看到.


如果你想混合使用两者,你​​可以省略使用navigation-compose,并使用导航组件并使用Fragment并且仅对fragment UI使用可组合的。

@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(...)  })  
            }
        }
    }

关于android - 使用 Fragments 实现 Compose 底部导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65658660/

相关文章:

android - 如何仅在jetpack compose中在底部添加边框

android - 无法使用 Picasso 和 scrollGalleryView 从内存中删除位图

android - 在 Android TV 上收听 HDMI 插入和拔出事件

java - 如何使用 setter 和 getter 方法获取对象的对象数组及其响应

android - 在 JetPack Compose 中手动重构所有 AndroidView

android - 如何在 Jetpack Compose 中内存 lambda 函数,如 useCallback

android - 通过 STREAM_ALARM 播放声音不会在 Marshmallow 中从头开始

java - 无效的未知请求错误 : Cannot determine request type. 这个广告单元 ID 是否正确?

android - 如何让状态栏完全透明?

intellij-idea - 如何为 Gradle 正确配置 Kotlin 插件?