Помогите разобраться в синтаксисе Kotlin
Вот конкретно пример который вызывает у меня затруднения:
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_fragment_tasks, menu)
val searchItem = menu.findItem(R.id.action_search)
val searchView = searchItem.actionView as SearchView
searchView.onQueryTextChanged {
viewModel.searchQuery.value = it
}
}
Самая непонятная часть:
inline fun SearchView.onQueryTextChanged(crossinline listener: (String) -> Unit) {
this.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
listener(newText.orEmpty())
return true
}
})
}
Вопросы: Почему вызов функции происходит без обычных скобок ()?
Что конкретно передается и возвращается при вызове метода? или иначе говоря что Это Такое?:
searchView.onQueryTextChanged {
viewModel.searchQuery.value = it
}
И что это значит?:
crossinline listener: (String) -> Unit
//
listener(newText.orEmpty())
Ответы (1 шт):
Высокоуровневые функции и лямбды
Если первым и единственным параметром в функцию передается лямбда, то можно не писать (), а сразу писать { a, b -> a + b }, где a и b параметры передаваемые в лямбду.
Если последним параметром передается лямбда, то её так же можно вынести в фигурные скобки.
searchView.onQueryTextChanged {
viewModel.searchQuery.value = it
}
onQueryTextChanged имеет параметр типа f: (T) -> Unit.
it это ключевое слово которое можно использовать вместо явного указания параметра лямбды.
Так же можно было бы написать:
searchView.onQueryTextChanged { query ->
viewModel.searchQuery.value = query
}
crossinline listener: (String) -> Unit
//
listener(newText.orEmpty())
С этим еще не сталкивался, но в доке пишут, что это нужно в inline функциях.
Можно почитать об этом тут.