Код: Выделить всё
class HomeTopFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
val tabUid = requireArguments().getString("tabUid") // e.g., set via bundle
return ComposeView(requireContext()).apply {
setContent {
MyHomeTopScreen(tabUid = tabUid)
}
}
}
}
@Composable
fun MyHomeTopScreen(tabUid: String?) {
// UI renders based on tabUid; ViewModel is not aware of args
}
Код: Выделить всё
@HiltViewModel
class HomeTopViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
val tabUid: StateFlow = savedStateHandle
.getStateFlow("tabUid", null)
}
class HomeTopFragment : Fragment() {
// Hilt or default VM provider; key point is SavedStateHandle receives fragment args
private val vm: HomeTopViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ensure arg exists for process death restoration
requireArguments().putString("tabUid", requireArguments().getString("tabUid"))
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View =
ComposeView(requireContext()).apply {
setContent {
val tabUid by vm.tabUid.collectAsState()
MyHomeTopScreen(tabUid = tabUid)
}
}
}
В композиции хостинга фрагмента, считается ли это наилучшей практикой для передачи фрагментов, непосредственно композируемым или поверхностному их ViewModel (например, через SavedStateHandle), и пусть композиционное состояние? Способ гарантировать, что SavedStateHandle получает фрагменты ARG, когда не использует навигационную композицию (то есть, простые фрагменты + composeview)? Какие-нибудь подводные камни для изменений смерти/конфигурации процесса? ценится.
Подробнее здесь: https://stackoverflow.com/questions/797 ... posable-or
Мобильная версия