如何解决使用 Fragment 实现组合底部导航
我按照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,and NavHost
,并且一切正常。
假设我现在想要在一个列表中显示一大堆数据,其中包含需要 Fragment、ViewModel、Repository 等各种业务逻辑方法的屏幕。 正确的方法是什么?我仍然可以创建片段并以某种方式将它们传递给密封类还是我们应该忘记片段并让所有内容都可以组合?
解决方法
由于您正在遵循文档,因此您需要忘记 Fragments。文档建议在调用/导航到可组合函数时实例化每个屏幕的视图模型。当可组合物未被释放时,视图模型将继续存在。这也受到单一活动方法的推动。
@Inject lateinit var factory : ViewModelProvider.Factory
@Composable
fun Profile(profileViewModel = viewModel(factory),userId: String,navigateToFriendProfile: (friendUserId: String) -> Unit) {
}
这可以在撰写示例 here 中看到。
如果你想混合使用,你可以省略使用 navigation-compose
,滚动导航组件并使用 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(...) })
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。