block: Intent.() -> Unit

是Kotlin 中的 带接收者的函数类型(Function Types with Receiver)

语法分解

kotlin

block: Intent.() -> Unit
  • block - 参数名称

  • Intent.() - 接收者类型(Receiver Type)

  • Unit - 返回值类型(无返回值)

含义解释

这表示 block 是一个 在 Intent 对象上下文中执行的 lambda 函数

使用示例

1. 函数定义

kotlin

fun startActivity(context: Context, block: Intent.() -> Unit) {
    val intent = Intent(context, TargetActivity::class.java)
    intent.block()  // 在 intent 对象上执行 lambda
    context.startActivity(intent)
}

2. 函数调用

kotlin

// 在 lambda 内部,this 指向 Intent 对象
startActivity(context) {
    putExtra("key1", "value1")  // 相当于 this.putExtra()
    putExtra("key2", 123)       // 可以直接调用 Intent 的方法
    action = "CUSTOM_ACTION"    // 可以直接访问 Intent 的属性
    flags = Intent.FLAG_ACTIVITY_NEW_TASK
}

等价写法对比

传统写法(不带接收者)

kotlin

fun startActivity(context: Context, block: (Intent) -> Unit) {
    val intent = Intent(context, TargetActivity::class.java)
    block(intent)  // 需要显式传递 intent 参数
    context.startActivity(intent)
}

// 调用时
startActivity(context) { intent ->
    intent.putExtra("key1", "value1")
    intent.putExtra("key2", 123)
    intent.action = "CUSTOM_ACTION"
}

带接收者的写法

kotlin

fun startActivity(context: Context, block: Intent.() -> Unit) {
    val intent = Intent(context, TargetActivity::class.java)
    intent.block()  // 在 intent 的上下文中执行
    context.startActivity(intent)
}

// 调用时 - 更简洁,更像 DSL
startActivity(context) {
    putExtra("key1", "value1")  // 省略了 intent. 前缀
    putExtra("key2", 123)
    action = "CUSTOM_ACTION"
}

优势

  1. 更简洁的语法 - 省略了重复的接收者对象名称

  2. 更好的可读性 - 代码更像领域特定语言(DSL)

  3. 类型安全 - 在 lambda 内部只能访问 Intent 的公共方法和属性

实际应用场景

这种模式在 Android 开发中很常见:

kotlin

// AlertDialog
AlertDialog.Builder(this).apply {
    setTitle("标题")
    setMessage("消息")
    setPositiveButton("确定") { dialog, which -> }
    setNegativeButton("取消") { dialog, which -> }
}.show()

// 使用带接收者的函数可以更简洁
fun createDialog(block: AlertDialog.Builder.() -> Unit): AlertDialog {
    return AlertDialog.Builder(this).apply(block).create()
}

createDialog {
    title = "标题"
    message = "消息"
    setPositiveButton("确定") { _, _ -> }
    setNegativeButton("取消") { _, _ -> }
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐