1、main函数
main函数是dart 的入口,dart的入口函数是没有返回值的,传递给main的命令行参数是通过List完成的。
字面上可以理解List是dart中集合类型;其中每一个String都表示传递给main的一个参数
定义字符串的时候,可以使用单引号或双引号;每行语句必须使用分号结尾,很多语言并不需要分号,比如swift、js
main(List args) {
print(‘Hello World’);
}
2、定义变量
2.1明确声明变量的方式 ,格式 变量类型 变量名 = 赋值
比如
String name = "Tom";
Int age = 20;
double height = 22;
print('$(name),$(age),$(height)');
注意:定义的变量可以修改值,但是不能赋值其他类型
2.2 类型推导 变量的方式 var/dynamic/const/final 变量名 = 赋值;
2.2.1 var的使用 runtimeType 用于获取变量当前类型,运行时类型
var name = 'Coder';
name = 'kobe'
print(name.runtimeType);
2.2.2 dynamic 声明的变量可动态变类型
dynamic name = 'Jack';
print(name.runtimeType); //String
name = 20;
print(name.runtimeType); //int
在实际开发中,通常不使用dynamic,因为类型的变量会带来潜在的风险
2.2.3 final 声明常量 ,可以通过计算或者函数获取一个值(运行时确定一个值),一旦被赋值后就有确定的结果, 不会再次赋值
final time = DateTime.now();
2.2.4const 声明常量 ,必须赋值常量值,编译期间就要有确定的值
const abc = 30
final使用的更多一点
3、数据类型
3.1 数字类型
对于数值来说,我们也不用关心它是否有符号,以及数据的宽度和精度等问题。只要记着整数用int,浮点数用double就行了。
不过,要说明一下的是Dart中的int和double可表示的范围并不是固定的,它取决于运行Dart的平台。
字符串和数字之间的转化:
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2); // 保留两位小数
print('${num1Str} ${num1Str.runtimeType}'); // 123 String
print('${num2Str} ${num2Str.runtimeType}'); // 123.456 String
print('${num2StrD} ${num2StrD.runtimeType}'); // 123.46 String
toStringAsFixed,会检查是否四舍五入
3.2布尔类型
布尔类型中,Dart提供了一个bool的类型, 取值为true和false
注意: Dart中不能判断非0即真, 或者非空即真
Dart的类型安全性意味着您不能使用if(非booleanvalue)或assert(非booleanvalue)之类的代码。
var message = ‘Hello Dart’; //
错误的写法
if (message) {
print(message) ;
}
3.3 字符串类型
Dart字符串是UTF-16编码单元的序列,您可以使用单引号或者双引号创建一个字符串:
var s1 = 'Hello';
var s2 = "Dart";
var s3 = 'Hello \' Flutter';
var s4 = "Hello 'Flutter";
可以使用三个单引号或者双引号表示多行字符串:
var mes = '''
哈哈哈
呵呵呵
嘿嘿嘿
''';
字符串和其他变量或表达式拼接: 使用${expression}, 如果表达式是一个标识符, 那么{}可以省略
var name = "Jack";
var age = 18;
var height = 1.99;
print('my name is ${name},age is $age,height is $height');
3.4、集合类型
对于集合类型,Dart则内置了最常用的三种:List / Set / Map
List 集合 []
var lets = [‘a’,‘b’];
List nums = [1,2,3];//明确指定类型
Set {} ,Set也可以按上面的来定义,只是把[]换成了{}
Set和List最大的不同就是:Set是无序的,并且元素是不重复的
var letSet = {‘a’,‘b’,‘c’};
Set letSet = {1,2,3,4};
映射map {xxx:xxx,xxx:xxx}
Map是我们常说的字典类型
定义
var info = {“name”:“Jack”,“age”:20};
Map<String,Object> info2 = {“name”:“Jack”,“age”:20,“address”:“北京市”};
print(’
i
n
f
o
2
,
info2,
info2,{info2.runtimeType}’);
集合的常见操作:
获取集合长度,使用 length
lets.length / info.length / letSet.length
List 和Set的添加、删除、包含操作
对于List来说,由于元素是有序的,它提供了一个删除指定元素索引位置上元素的方法
增
lets.add(5);
letSet.add(5);
删
lets.remove(1);
letSet.remove(1);
包含
lets.contains(2);
letSet.contains(2);
List 根据index删除元素
lets.removeAt(1);
Map的操作
由于它有key和value,因此无论是读取值,还是操作都要明确基于key的,还是基于value的,或者基于key/value对的
根据key获取value
info[“name”]
获取所有的entries
info.entries
获取所有key
info.keys
获取所有value
info.values
判断是否包含某个key或者value
info.containsKey(“name”);
info.containsValue(20);
根据key删除元素
info.remove(‘age’);
4、函数
4.1 函数的定义
Dart是一种真正的面向对象的语言,所以即使函数也是对象,也有类型,类型就是 Function
这也就意味着函数可以作为变量定义或者作为其他函数的参数或者返回值
函数的定义方式:
返回值 函数名称(参数列表){
函数体
return 返回值
}
按照上面的定义方式,我们定义一个完整的函数:
int sum(num num1 ,num num2){
return num1 + num2;
}
Effective Dart 建议对公共的API,使用类型注解,但是我们省略掉了类型,依然是可以工作的
sum(num1,num2){
retrun num1 + num2;
}
另外,如果函数中只有一个表达式,那么可以使用箭头语法
sum (num1,num2) => num1 + num2;
4.2函数参数的问题
函数的参数可以分为两类:必须参数和可选参数
4.2.1 可选参数
可选参数可以分为命名可选参数和位置可选参数
定义方式:
命名可选方式: {params1,params2,…}
位置可选参数: [param1,param2,…]
命名可选参数的演示
printInfo(String name,{int age, doube height}){
print('name = $name,age = $age height = $height');
}
printInfo(info2["name"]); // name = Jack,age = null height = null
printInfo(info2["name"], age: 20, height: 1.99); //name = Jack,age = 20 height = 1.99
位置可选参数
printInfo2(String name,[int age,double height]){
print('name = $name,age = $age height = $height');
}
printInfo2(info2["name"], 18, 1.99); // name = Jack,age = 18 height = 1.99
命名可选参数,可以指定某个参数是必传(使用@required,有问题)
// 命名可选参数的必须
printInfo3(String name, {int age, double height, @required String address}) {
print('name=$name age=$age height=$height address=$address');
}
参数默认值
参数可以有默认值,在不传入的情况下,使用默认值
注意: 只有可选参数才可以有默认值,必须参数不能有默认值
printInfo4(String name,{int age = 18,double height = 1.99}){
if (age == null) {
print('name = $name,height = $height');
} else {
print('name = $name,age = $age height = $height');
}
}
Dart中的main函数就是一个接受可选参数的列表参数作为参数的,优异在使用main函数时,我们可以传入参数,也可以不传入
函数是一等公民
在很多语言中,函数并不能作为一等公民来使用,比如Java、OC,这种限制让编程不够灵活,所以现代的编程语言基本都支持函数作为一等公民来使用,Dart也支持。这意味着你可以将函数赋值给一个变量,也可以将函数作为另一个函数的参数或者返回值来使用。
定义一个函数
foo(String name){
print(‘传入的name:$name’);
}
将函数赋值给一个变量
var bar = foo;
print(bar);
将函数作为另一个函数的参数
test(Function func){
func('coderWhy');
}
test(foo);
将函数作为另一个函数的返回值
getFun(){
return foo;
}
var func = getFun();
匿名函数的使用
大部分我们定义的函数都会有自己的名字,比如前面定义的foo/test函数等等。但是某些情况下,给函数命名太麻烦了,我们可以使用没有名字的函数,这种函数可以被称为匿名函数,可以叫lambda😃
var movies = ['西游记','红楼梦','三国演义','水浒传'];
printElement(item){
print(item);
}
movies.forEach(printElement);
//使用forEach遍历:匿名函数
movies.forEach((item){
print(item);
});
movies.forEach((item) => print(item));
语法作用域
dart中的词法有自己明确的作用域范围,它是根据代码的结构({})来决定作用域范围的,优先使用自己作用域的变量,如果没找到,则一层层向外找。
语法闭包
闭包可以访问其词法范围内的变量,即使函数在其他地方被使用,也可以正常的访问。
makeAdder(num addBy) {
print('addBy : $addBy');
return (num i) {
return i + addBy;
};
}
var adder2 = makeAdder(2);
print(adder2);
print(adder2(10)); // 12
print(adder2(6)); //8
返回值问题
所有函数都返回一个值,如果没有指定返回值,则语句返回null,隐式附加到函数体。