安卓编程需要一定的编程基础
较新的安卓编程语言,已经采用了Kotlin编程语言,对于编程要求其实是比较高的,要求基础比较扎实,有面向对象和函数式编程基础。
其中函数式编程是比较新的编程技术,其将代码视同为数据,可以在程序中进行传递和交换。
下面我们来解析一段待办清单APP中的代码,来体会一下安卓编程的一些语法规则。
confirmButton = {// 点击按钮触发的逻辑Button(onClick = {// 1. 安全判空:当前编辑的Todo不为null才执行currentEditTodo?.let { todo ->// 2. 找到这个Todo在列表中的索引val index = todoList.indexOf(todo)// 3. 索引有效 + 输入框内容不为空 → 更新内存中的列表if (index != -1 && editText.isNotBlank()) {// data class的copy():复制对象,只修改text字段todoList[index] = todo.copy(text = editText)}}// 4. 关闭编辑弹窗showEditDialog = false// 5. 清空当前编辑的Todo对象currentEditTodo = null// 6. 协程:异步操作Room数据库(不能在主线程直接操作数据库)coroutineScope.launch {// 数据库更新:根据旧文本,更新为新文本todoDao.updatetext(editText, oldtext)}}) {Text("保存") // 按钮显示文字}}
这段代码实际上还不是一条完整的语句,只是一条语句里面的一个参数。
最外层的框架是confirmButton={},这里实际上用的是函数式编程,给confirmButton参数赋值了一段代码,也就是花括号中的代码。
内层的Button(){ Text(“保存”)},实际上创建了一个Button对象,然后给它的第一个参数onclick又赋值了一段代码,给它的第二个参数赋值了一段代码{Text(“保存”)}。在kotlin中,如果一个函数最后的一个参数是函数式参数,则可以直接放在括号外,原来的函数调用形式应该为Button(onclick={},content={ Text(“保存”)}),现在可写成Button(onclick={}){ Text(“保存”)}。
这中间的Text(“保存”)又是一个对象创建语句,创建一个Text的对象,传入的参数为字符串“保存”。
最内层的currentEditTodo?.let {}实际上还是函数式编程,{}里面传递的是一段代码。这里借用了let函数统一判断currentEditTodo不为空,则执行{}中的代码。
?.操作符表示对象为空时什么都不做,对象不为空时,就调用let函数。其中的currentEditTodo对象是里面的todo对象的别名,实际上它们是同一个对象,用来作为后续函数式编程代码的一个参数。
由此可见,函数式编程中嵌套有函数式编程,对象创建中嵌套有对象创建,而且这些交织在一起,非常地复杂。上面的代码还不是一条语句,还只是一条语句中的一个参数。可见这些函数式编程、对象创建交织在一起,互相嵌套,有时候嵌套的层次还会比较深,形成较为复杂的局面,看起来非常地繁琐。在其他编程语言中,可能是一段代码,但在这里却可能只是一条语句,一条语句可以特别长,而且复杂。这些在安卓编程中是很为普遍的存在,不过,如果我们愿意下功夫的话,还是可以有所收获的。
夜雨聆风