我按照撰写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/