我在我的ViewModel类中有一个函数fun submitFormWithData(abc: String)
, ViewModel对象在其他类中使用,我只是想传递函数submitFormWithData,而不是ViewModel对象,如果函数在同一类中,我可以将参数化函数传递给另一个函数,但是如果函数从对象访问它就会变得困难。
下面是一个例子:
class ViewModel {
fun submitForm() {
// do some thing
}
fun submitFormWithData(abc: String) {
// do some thing
}
}
class Screen(viewModel: MyViewModel) {
fun main() {
BuildHeader(viewModel.submitForm)
BuildFooter(viewModel.submitFormWithData)
}
@Composable
fun BuildHeader(submitForm:()->Unit){
// some code
btn.click -> {
submitForm.invoke()
}
}
@Composable
fun BuildFooter(submitFormWithData:(String)->Unit){
// some code
btn.click(data: String) -> {
submitFormWithData.invoke(data)
}
}
fun dataInSameClass(data: String) {
}
}
在上面的例子中,类Screen
有一个lambda函数BuildFooter,它接受一个参数化的函数,如果我想传递来自同一个类fun dataInSameClass
的函数,我可以简单地使用::
操作符或用花括号封装函数,不带参数{dataInSameClass}如:
//在同一类中的参数化函数BuildFooter (:: dataInSameClass)//对于同一个类中没有参数的函数BuildFooter ({dataInSameClass ()})
然而,如果我想从对象viewModel
传递一个函数,我无法做到这一点,我可以传递一个没有参数的函数,例如
对于没有参数,这是正常的:BuildFooter ({viewMode.submitForm ()})
对于参数化函数,不起作用:BuildFooter(::viewMode.submitFormWithData)
如果我尝试{viewMode.submitFormWithData()}
,它要求我传递参数,这里我不想传递参数,因为数据将传递到实际调用发生的地方,就像我做::dataInSameClass
一样,我不想传递完整的viewModel对象,我只是想传递函数参数。
你应该这样写
fun main() {
BuildHeader(viewModel::submitForm)
BuildFooter(viewModel::submitFormWithData)
}