чтобы в compsable экран передавать viewModel.
Пример,
MyTheme {
MyScreen(
viewModel = viewModel,
)
}
Проблема в том, что на данный момент работаю над легаси кодом, где вся логика лежит во фрагменте. В разумные сроки перенести все это во viewModel , пока не вижу возможности.
Можно ли в composable экран передавать сам фрагмент, а уже в нем иметь хендлеры для обработки событий (нажатий итд) от компоуз компонентов?
То есть, примерно так:
MyTheme {
MyScreen(
fragment = this@MyFragment,
)
}
@Composable
fun MyScreen(fragment: MyFragment) {
val state by fragment.myState
...
}
Асинхронные операции придется делать также в самом фрагменте через
lifecycleScope.launch{
val data = withContext(IO) {
get async data
}
if (isAdded) { // :)
myState.value = data
}
}
Передавайте не фрагмент, а лямбды-коллбеки, и в вызове композабла дергайте фрагмент
Не понял, пример можно
В вызове компоуз как раз надо дергать коллбеки. Компоненты не знают ведь откуда этот калбек
Вспомните UDF: состояние сверху вниз, евенты снизу вверх. В официально примере JetNews, например, есть HomeScreen: @Composable fun HomeScreen( uiState: HomeUiState, onToggleFavorite: (String) -> Unit, onRefreshPosts: () -> Unit, onErrorDismiss: (Long) -> Unit, navigateToArticle: (String) -> Unit, openDrawer: () -> Unit, scaffoldState: ScaffoldState ) Этот Composable ничего не знает про фрагмент, и его можно легко использовать в Preview или с ViewModel или с Fragment в качестве реализации коллбеков. И у него есть оберточка для удобства использования с ViewModel: @Composable fun HomeScreen( homeViewModel: HomeViewModel, navigateToArticle: (String) -> Unit, openDrawer: () -> Unit, scaffoldState: ScaffoldState = rememberScaffoldState() ) Можно было бы написать такую же для фрагмента.
Я это и имел ввиду.
Обсуждают сегодня