如何在Kotlin中将参数化函数从对象传递给其他类的lambda函数



我在我的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)
}

相关内容

最新更新