将 ViewModel 与 Fragment 分离

问题描述 投票:0回答:1

如何将 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、对话框之类的东西。这意味着我将失去一些可重用性。

android kotlin android-fragments
1个回答
0
投票

您可以直接在 Composable 中拥有 viewModel。

@Composable
fun CreateEventScreen() {
    val eventViewModel: SomeViewModel = viewModel(factory = EventViewModelFactory())


    val uiState = eventViewModel.collectAsStateWithLifecycle()

    EventFormComponent(
        state = uiState, // 
        callbacks...
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.