Android Clean Architecture View Model 实现 View 的回调

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

我刚刚处理 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
                    )
                }
            }
        }
    }
}

这是一个好方法吗? 如果是,我可以改进什么? 如果不是,为什么?

android mvvm android-jetpack-compose clean-architecture android-mvvm
1个回答
0
投票

虽然我是清洁架构的狂热支持者,但我不认为直接在视图模型中实现接口是一个好主意。

正如这个答案中所见,这种模式只会让测试你的虚拟机变得更加困难,而且也会让你更难使用你喜欢的注入库。

相反,我建议您遵循 Google 推荐的方法在 VM <> 可组合项之间进行数据处理,如 此 Codelab 中所示。简而言之,传入视图模型,并使用 Flow/LiveData 跨多个组件/类传输和跟踪数据。

这不仅可以让您更轻松、更自由地移动数据,还可以让您利用 Android 倡导者不断提供的大量示例和文档供我们使用!

© www.soinside.com 2019 - 2024. All rights reserved.