Dart+Flutter入门记录
爆竹声中,新的一年已经悄然来临。新年新气象,自然也要学点新技术。借着天外天工作室新生起飞赛中维护微北洋app的机会,在此记录下本人学习dart和flutter的过程。
本文仅作为自己学习的记录,内容较为简陋,并不适合对编程一无所知的小白;如果你希望通过阅读本文学习,强烈建议在已经掌握一门语言的基础下继续。
Dart基础语法
写在开始之前:语法的基础框架
众所周知,编程语言代码格式分为两派:括号派和缩进派。前者以传统语言(c/c++, java…) 为代表,后者以python为代表。
两派之间的争斗也由来已久:前者括号一多起来就确定不清层数,后者更是被戏称为’拿着游标卡尺写代码’.
Dart的语法规范属于前者,使用大括号确认基本框架,每行后需要加分号。不过需要注意的是,Android Studio中,Dart代码文件的tab缩进默认为2空格而非4空格,初次学习需要一定时间适应。
从变量开始
变量的声明
一般声明
dart的变量声明有点缝合怪的味道:它既可以像javascript 那样通过var声明变量,又可以像传统c/c++那样使用变量的类型名进行声明。在前一种情况下,编译器内部将会自动推断变量的类型。
var a = 1;int b = 2;使用var声明的变量,其类型在第一次赋值后就被确定,不能再赋予其他类型的值。
常量声明 — const
const 用于声明代码编译前就已经确定的值,无法被修改,且不允许表达式中存在变量。
常量声明 — final
final 用于声明再运行过程中被确定的值,在第一次被赋值后无法被修改。
变量的类型
Dart中,变量主要有以下几种类型;
- 数字:
int/double/num - 布尔:
bool - 字符串:
String - 列表:
List - 字典/映射:
Map
数字:int/double/num
int用于表示整型数字,double用于表示小数,num两者均可。
double和int之间不能直接赋值,需要使用toInt()或toDouble()进行转换;
num可以直接被两者赋值,但反过来使用也需要上面的转换函数。
字符串:String
Dart中的字符串支持使用单引号或双引号括起,支持拼接及模板字符串。
语法如下:
void main(List<String> args) { String text = '现在是${Datetime.now()}'; print(text);}使用 $ 或 ${} 进行模板操作。
当存在模板中的内容是一个表达式的时候需要使用后者。在实际代码中,更推荐使用后者。
布尔类型:bool
Dart中的真或假使用小写的 true 或 false 表示。
bool I_am_mtf = false;列表:List
使用方式比较类似于python。
List students = ['Alice','Bob'];列表的常用方法如下:
- 在尾部添加一个元素:
list.add(element) - 在尾部添加一个列表:
list.addAll(newList) - 删除满足内容的第一个元素:
list.remove() - 删除最后一个元素:
list.removeLast() - 删除给定范围内数据:
list.removeRange(start,end)
dart中索引范围的取定与其他编程语言保持一致:包括头部,不包括尾部。
列表的常用操作和属性如下:
- 循环(类似于python的for … in …):
list.forEach( (item) {} ) - 是否都满足条件:
list.every( (item) { return 布尔值 } ) - 筛选出符合条件的数据:
list.where( (item) { return 布尔值 } ) - 列表的长度:
list.length - 第一个元素:
list.first - 最后一个元素:
list.last - 列表是否为空:
list.isEmpty
对于前三种常用操作,给出如下示例代码:
students.forEach((item) { // 迭代打印每个元素 print(item);})
print(students.every((item) { // 检测每个元素是否都以'A'开头 return item.toString().startsWith("A");}))
print(students.where((item) { // 筛选出所有以 "A" 开头的元素并组成新列表打印 return item.toString().startsWith("A");}).toList())等价于以下 python 代码:
for item in students: # 第一种 if item[0] == 'A': print(item)
# 第二种:似乎最标准的写法就是一行流print(all(str(item).startswith("A") for item in students))
# 第三种result = []for item in students: if str(item).startswith("A"): result.append(item)print(result)
# 也可以一行流print([item for item in students if str(item).startswith("A")])很奇怪,对吧?我也这么觉得
字典:Map
在python中,它有一个更亲切的名字:Dict .
使用方法如下:
Map a = {"breakfast":"1","lunch":"2"};字典的常用操作方法如下:
- 循环(类似于python的for … in …):
map.forEach( (item) {} ) - 添加字典(合并新字典):
map.addAll(newMap) - 是否包含某个key:
map.containsKey() - 删除一个key:
map.remove(key) - 清空字典:
map.clear()
动态类型:Dynamic
dynamic 类型用来声明动态类型,即允许变量运行时自由改变类型,同时绕过编译时的静态检查。
使用方法如下:
dynamic freedom = 1;free = '';free = false;free = [1];free = {}; // 以上操作均为合法空安全机制
简单来说,与其他类型的语言不同,Dart语言默认不允许变量为空值(除非你使用上面提到的dynamic)。如果你需要使用空变量相关的特性,需要使用下列空安全操作符:
| 操作符 | 符号 | 作用 | 示例 |
|---|---|---|---|
| 可空类型 | ? | 声明可空变量 | String? → 允许String或null |
| 安全访问 | ?. | 对象为null时跳过操作,返回null | user?.name → 若user为null则返回null |
| 非空断言 | !. | 开发者保证变量非空(否则运行时崩溃) | name!.length → 断言name非空 |
| 空合并 | ?? | 左侧为null时返回右侧默认值 | name??"Guest" → name为null时返回”Guest” |
运算符
和其他编程语言一样,dart的常用运算符分为以下几类;算数运算符、赋值运算符、比较运算符、逻辑运算符。
需要注意的是,dart语言中,整除符号是 ~/ .毕竟 // 被拿来用作注释标记了
赋值、比较、逻辑运算符与其他语言保持一致。
流程控制
Dart中的逻辑控制(if分支语句、三元运算符、switch/case、while循环、for循环)和c++保持一致。
函数
定义
Dart中的函数定义方法也和c++保持一致。
不同的是,dart的返回值类型可以省略;语言内部会自动推断返回类型为dynamic.
虽然返回值类型可以省略,但是明确返回值类型是更推荐的编程习惯。
参数
在dart中,为函数传参可以说是品尝dart这坨构式不得不品的一环。
简单来说,dart语言中函数的参数分为三类:必传参数、可选位置参数、可选命名参数。
- 必传参数无需多言,正常调用即可。
- 可选位置参数必须位于必传参数后面,采用中括号包裹,传递时按照顺序传递;
- 可选命名参数必须位于必传参数后面,采用大括号包裹,传递时按照
参数名:值的方式传递,无需关注顺序。
后面两类的区别和建议如下:
- 两种参数都可以设定默认值。
- 参数少且顺序固定时建议使用可选位置参数,参数多且需要明确含义时建议使用可选命名参数。
- 一个函数只能采用其中一种可选参数风格,不可混用。
- 对于这两个名词,建议理解为
可选的位置参数和可选的命名参数,两者都是可选参数,区别在于一个强调位置,一个强调命名。 - 千万不要理解为
可选位置的参数和可选位置的参数!这样恰好就反了~ - 可选命名参数可以使用
required关键字强制调用时传入,此时不再是“可选”。
匿名函数
在dart中,可以声明一个没有名称的函数赋值给变量进行调用,使用Function关键字。
示例如下:
void main(List<Strings> args) { onTest(test);}
Function callback = () { print("test");}
void onTest(Function callback) { callback();}箭头函数
当函数体只有一行代码时,可以使用箭头函数(=>)编写,省略return关键字。
示例如下:
int add(int a,int b) => a + b;文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!