如何将 ViewModel 与 Fragment 解耦?
使用 Jetpack Compose,我可以创建一个像这样的 CreateEventScreen:
@Composable
fun CreateEventScreen() {
val uiState = createEventViewModel().collectAsStateWithLifecycle()
EventFormComponent(
state = uiState,
callbacks...
)
}
@Composable
fun EditEventScreen() {
val uiState = editEventViewModel().collectAsStateWithLifecycle()
EventFormComponent(
state = uiState,
callbacks...
)
}
我能够将 EventFormComponent 与实际的 ViewModel 解耦。 然而,对于垃圾视图 xml 系统,最佳实践显然是 就是在fragment本身中实例化ViewModel:
class EventFormFragment : Fragment() {
private val viewModel: SomeViewModel by viewModels()
}
这使得重用 EventFormFragment 来创建和编辑事件变得更加困难。
我尝试创建自定义视图 EventFormView 而不是片段,但是自定义视图无法访问诸如 registerForActivityResult、对话框之类的东西。这意味着我将失去一些可重用性。
您可以直接在 Composable 中拥有 viewModel。
@Composable
fun CreateEventScreen() {
val eventViewModel: SomeViewModel = viewModel(factory = EventViewModelFactory())
val uiState = eventViewModel.collectAsStateWithLifecycle()
EventFormComponent(
state = uiState, //
callbacks...
)
}