学习参考:https://zhuanlan.zhihu.com/p/82731470
1.基本:
1.注释用//
2.语句后面要有;
3.从main函数开始执行
main(List<String> args) {
print('Hello World');
}
4.定义变量
变量类型 变量名称 = 赋值;
5.bool变量用true和false
6.字符串用“xxx”或者'xxx'
以上和C++一样
7.打印:print('xxxxxx')和python一样
8.名称:大多用小驼峰命名法,除了一些集合类型和String是首字母大写
9.函数:默认所有函数都有返回值,如果没指定则返回null
10.三引号可以表示多行字符串
var message1 = '''
哈哈哈
呵呵呵
嘿嘿嘿''';
2.类型
a.runtimeType用于获取当前变量的类型
类型推导:
var:相当于c++的auto,当一个变量用var定义被赋值之后改变量类型就不能被改变
dyanmic: 和var一样但是在被赋值后还是可以改变类型(var升级版)
dynamic name = 'coderwhy';
print(name.runtimeType); // String
name = 18;
print(name.runtimeType); // int
const: 和c++一样
final: 类似与const但是可以用一个函数给他赋值(const升级版)
基本类型和类型转换:
基本类型:int, double, String
类型转换:
var one = int.parse('111');//字符串转int
var two = one.toString();//int转字符串
String s = '0.8931'
var num = s.toStringAsFixed(2)//保留两位小数
集合类型:
List:列表
var letters = ['a', 'b', 'c', 'd'];//不指定类型
List<int> numbers = [1, 2, 3, 4];//指定类型
Set:集合(Set
无序,且元素不重复)
var letters = {'a', 'b', 'c', 'd'};//不指定类型
Set<int> numbers = {1, 2, 3, 4};//指定类型
Map:字典
// Map的定义
// 1.使用类型推导定义
var infoMap1 = {'name': 'why', 'age': 18};
print('$infoMap1 ${infoMap1.runtimeType}');
// 2.明确指定类型
Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
print('$infoMap2 ${infoMap2.runtimeType}');
集合操作:
获取长度
print(xxx.length);
增加删除包含
xxx.add(3) | 增加元素3 |
xxx.remove(2) | 删除元素2 |
xxx.removeAt(2) | 删除第二个元素(列表) |
xxx.contains(2) | 是否包含2 |
Map操作
xxx['key_name'] | 获取键值 |
xxx.entries | 获取所有条目(entry) |
xxx.keys | 获取所有键名 |
xxx.values | 获取所有键值 |
xxx.containsKey/ xxx.containsValue | 是否包含该键、键值 |
xxx.remove('xxx') | 根据key删除某元素 |
3.函数
返回值 函数的名称(参数列表) {
函数体
return 返回值
}
箭头语法:
sum(a, b) => a + b//类似于python中的lambda
参数:
1.位置可选参数:
用{}表示(Set没有顺序)
printInfo1(String name, {int age, double height}) {
print('name=$name age=$age height=$height');
}
可以给{}内的部分传参
// 调用printInfo1函数
printInfo1('why'); // name=why age=null height=null
printInfo1('why', age: 18); // name=why age=18 height=null
printInfo1('why', age: 18, height: 1.88); // name=why age=18 height=1.88
printInfo1('why', height: 1.88); // name=why age=null height=1.88
命名可选参数, 可以指定某个参数是必传的(使用@required)
printInfo3(String name, {int age, double height, @required String address}) {
print('name=$name age=$age height=$height address=$address');
}
2.命名可选参数:
用[ ] 表示(List有顺序)
printInfo2(String name, [int age, double height]) {
print('name=$name age=$age height=$height');
}
传参顺序不可以变动
// 调用printInfo2函数
printInfo2('why'); // name=why age=null height=null
printInfo2('why', 18); // name=why age=18 height=null
printInfo2('why', 18, 1.88); // name=why age=18 height=1.88
3.参数默认值
只有可选参数才可以有默认值
// 参数的默认值
printInfo4(String name, {int age = 18, double height=1.88}) {
print('name=$name age=$age height=$height');
}
4.函数可以作为参数或者返回值来用,类型名为Function
5.词法作用域
就是c++中的变量作用域
和C++不同,dart会优先用自己作用域中的变量,如果没有会一层层往外找
6.词法闭包
类似python中的偏函数
main(List<String> args) {
makeAdder(num addBy) {
return (num i) {
return i + addBy;
};
}
var adder2 = makeAdder(2);//2传给addBy
print(adder2(10)); // 12//10传给i
print(adder2(6)); // 8
var adder5 = makeAdder(5);
// 15 虽然上面2传给addBy,但是在这里会找到自己最近的作用域,所以这里的addBy = 5
print(adder5(10));
print(adder5(6)); // 11
}