Я новичок в Java / Kotlin и работаю с этим учебным пособием , чтобы создать приложение для Android с виджетом, который может запрашивать JSON из URL-адреса и отображать результаты.
Меня смущает последний пример кода:
val service = ServiceVolley()
val apiController = APIController(service)
val path = "example_endpoint"
val params = JSONObject()
params.put("email", "foo@email.com")
params.put("password", "barpass")
apiController.post(path, params) { response ->
// Parse the result
}
Как обычно в Kotlin, если последний параметр функции является функцией (и вы передаете лямбда-выражение в качестве соответствующего аргумента), вы можете указать его вне скобок, как мы уже делали выше - одна из маленьких причуд, которые мне нравятся в Kotlin.
В моем коде виджета у меня есть вспомогательная функция updateAppWidget
, в которой яиспользуйте приведенный выше код и можете успешно запросить API, однако я получил большую часть кода, который был в updateAppWidget
функции внутри { response -> // Parse the result }
блока:
apiController.post(path,params) { response ->
// Get 'bar' from the response which is {'foo':'bar'}
val widgetText = response?.get(response.names().getString(0)).toString()
// Construct the RemoteViews object
val views = RemoteViews(context.packageName, R.layout.statusr)
views.setTextViewText(R.id.appwidget_text, widgetText)
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views)
}
Может ли кто-нибудь объяснить значение последних 3 строк кодового блока first и сказать мне, как я мог бы написать это, чтобы поднять логику на один уровень, и стоит ли это того?
НемедленноПроблема, которую я заметил, заключается в том, что я не могу ссылаться на widgetText без этого блока.
РЕДАКТИРОВАТЬ для ясности
Я думаю, что у меня над головой.Дальнейшее чтение предполагает, что я передаю лямбду, используя ->
???Я думаю, что я действительно хочу сделать:
Получить вызов apiController.post
из кода виджета полностью, поэтому у меня это теперь в отдельном классе:
class GetData {
fun widget_text(){
val service = ServiceVolley()
val apiController = APIController(service)
val path = "endpoint"
val params = JSONObject()
params.put("some", "data")
apiController.post(path, params) { response ->
val widgetText = response?.get(response.names().getString(0)).toString()
}
}
}
Будетхотелось бы иметь возможность вызывать что-то вроде GetData.widget_text()
изнутри updateAppWidget
, но я вернулся к своей первоначальной проблеме: как сделать widgetText
доступным вне apiController.post(path,params) { response -> // Logic }}
и вернуть это.