我刚刚处理 Android 应用程序和 MVVM 中的干净架构。 我听说您不应该将 ViewModel 直接传递到屏幕(我使用 Jetpack Compose),而应该将其状态和每个回调单独传递。这样做的目的是使测试屏幕变得更容易,因为不必传递 ViewModel。 我刚刚发现,如果我使用每个回调,例如当单击按钮时会发生什么,因为 lambda 必须传递到屏幕可组合项,从长远来看,我必须将很多 lambda 传递到屏幕可组合项。
现在我有以下想法,想问一下这是不是一个好主意。
在定义 Screen Composable 的 Kotlin 文件中,我创建了一个必须传递给 Composable 的接口“ScreenCallbacks”。 我在我的 ViewModel 中实现了这个,这样我就可以简单地将 ViewModel 作为回调接口的实现传递到我的 MainActivity 中。
示例:
主屏幕.kt
@Composable
fun HomeScreen(states: HomeScreenViewModel.States, callbacks: HomeScreenCallbacks) {
}
interface HomeScreenCallbacks{
fun onButtonClicked()
}
HomeScreenViewModel.kt
class HomeScreenViewModel : ViewModel() , HomeScreenCallbacks {
val states = States()
override fun onButtonClicked(){
//Do some stuff
}
class States(){
//My states
}
}
MainActivity.kt
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
CleanArchitectureTheme {
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
val viewModel = viewModel<HomeScreenViewModel>()
HomeScreen(
states = viewModel.states,
callbacks = viewModel
)
}
}
}
}
}
这是一个好方法吗? 如果是,我可以改进什么? 如果不是,为什么?