【问题标题】:Trying to pass a function parameter in Kotlin尝试在 Kotlin 中传递函数参数
【发布时间】:2020-01-14 17:52:39
【问题描述】:

我有一个函数:

fun test(){
    Timber.d("Button Clicked")
}

我正在尝试将此函数传递给片段。这是我片段中的那个字段。

class MyFragment(val layout: Int) : Fragment() {
     var clickEvent1: (() -> Unit)? = null
}

这就是我在开始片段事务之前设置此字段的方式。

fragment.clickEvent1 = {test()}

我的目标是在我的片段内单击按钮时运行此功能。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
     dialog_option_1.setOnClickListener { clickEvent1 }
}

我这样做的方式有问题,因为“测试”功能没有运行。有人可以指出我正确的方向吗?谢谢

【问题讨论】:

标签: function kotlin lambda parameters field


【解决方案1】:

使用

dialog_option_1.setOnClickListener(clickEvent1)

您需要将 lambda 本身传递给方法,因此您应该使用 () 括号而不是 {},这会创建一个新的 lambda,在您的情况下几乎什么都不做。

【讨论】:

  • 遗憾的是不起作用。 setOnClickListener() 需要 View.OnClickListener。 clickEvent1 是一个 (() -> 单位)。 :(
  • 然后将clickEvent1定义为(View)-> Unit(onClick方法接收View参数)
  • 或者你可以使用SAM构造函数:val clickEvent = View.OnClickListener { view -> test() }
  • 好吧,我用dialog_option_1.setOnClickListener {clickEvent1?.let { it() }} 搞定了,你的solotion 似乎很好用。非常感谢!
  • 您可以将clickEvent1?.let { it() } 替换为clickEvent1?.invoke()
【解决方案2】:

应该是

dialog_option_1.setOnClickListener { clickEvent1() }

如果你想那样做的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多