Eu tenho um aplicativo onde injeto um ViewModel
objeto diretamente no MainScreen
:
@Composable
fun MainScreen(
viewModel: ItemsViewModel = hiltViewModel()
) {
Scaffold(
topBar = {
TopBar(
onClick = {
viewModel.signOut()
}
)
},
content = {
ItemsContent(
items = viewModel.getItems()
)
},
floatingActionButton = {
FAB(
onClick = {
viewModel.addItem("ABC")
}
)
}
)
}
É recomendado injetar o ViewModel
objeto apenas uma vez na MainScreen
tela ou posso injetar o mesmo ViewModel
objeto dentro de cada função que pode ser composta, TopBar
, ItemsContent
e FAB
?
Você deve manter seus elementos que podem ser compostos o mais independentes possível dos modelos de visualização. Isso significa que normalmente você deseja apenas que os elementos que podem ser compostos na parte superior (seu Screens ) mantenham uma instância do modelo de visualização. Tudo abaixo disso recebe apenas os estados e retornos de chamada do modelo de visualização que ele realmente precisa, passados como parâmetros.
A maneira como você fez isso na sua pergunta parece boa. Dessa forma, os outros elementos que podem ser compostos têm parâmetros simples e podem ser testados e reutilizados com mais facilidade.
Isso está correto.
Você não deve passar instâncias de ViewModel para outros elementos que podem ser compostos.
Os elementos que podem ser compostos consomem o estado da IU da tela elevado no ViewModel. Você deve injetar a instância do ViewModel nos elementos que podem ser compostos no nível da tela para fornecer acesso à lógica de negócios.
Para obter mais detalhes, consulte ViewModel e detentores de estado e estado da interface do usuário
Seu caminho está correto, mantenha as funções que podem ser compostas independentes do viewmodel