Редактировать
Как ответил @ veritas1 и прокомментировал @EpicPandaForce, может быть несколько подходов, которые могут удовлетворить ваши потребности, но у каждого из них есть некоторые различия в том, как они передают аргумент в блок и каковы возвращаемые значения, я пишу некоторый код для обозначения различий:
class Test {
fun a() {}
fun b() {}
fun c() {}
}
fun main(args: Array<String>) {
val test: Test? = Test()
test?.apply {
// `apply` passes the receiver as `this`
a()
b()
c()
}?.a() // works, because `apply` returns `this`
test?.also {
// `also` passes the receiver as `it`
with(it) {
a()
b()
c()
}
}?.a() // works, because `also` returns `this`
test?.run {
// `run` passes the receiver as `this`
a()
b()
c()
}?.a() // won't compile, because `run` returns the block's return value (Unit)
test?.run {
// `run` passes the receiver as `this`
a()
b()
c()
this
}?.a() // works, because `run` returns the block returns `this`
test?.let {
with(it) {
a()
b()
c()
}
}?.a() // won't compile, because `let` returns the block's return value (Unit)
test?.let {
with(it) {
a()
b()
c()
}
it
}?.a() // works, because the block returns `it`
}
Эта диаграмма дерева решений из Elye может помочь вам выбрать лучший метод:
В итоге, run
наиболее подходит для вашего случая, потому что вам нужно null checks
и отправить this
в качестве аргумента, который может сделать ваш код проще:
test?.run {
// `run` passes the receiver as `this`
a()
b()
c()
}
Оригинальный ответ
Попробуйте с let
:
aMDetail?.let {
with(it) {
findByDeviceDef<BluetoothDef>()?.setDevice(mContext)
findByDeviceDef<WiFiDef>()?.setDevice(mContext)
findByDeviceDef<ScreenDef>()?.setDevice(mContext)
}
}