dart语言一些注意点
1.
const是编译时就要确定值,所以不能这样写:
const datetime tim=datetime(); //因为datetime()的值只有运行时才能确定。
Final是第一次运行时需要确定值,所以可以这样写:
Final datetime tim=datetime();//因为datetime()的值运行时才会确定,final关键字支持这样的用法
Const和final的相同点是二者的值都无法再次更改,区别在于初始化时间。const是编译时就要确定值,而final可以在第一次运行时确定值。另外,使用这两个关键字修饰变量都可以省略变量类型,如:
Final a=DateTime.now();
Const b=5;
2.
类大括号外面没有分号,如:
Class p{
Pass….
}
3.
只有一个语句的函数可以用胖箭头简写法,如
int f(var x){
return x*x;
}
再如:
void f(var t)=>print(t);
4.
typedef Fly = void Function(int value);//Fly是定义了一个方法,该方法只有一个int形参,Fly不是特定的函数,而是一个类型,可以用来定义变量。Fly类型的变量都是特定的具体函数。
void main(){
Bird bird = Bird((int a){print(a);});//如果实参函数的类型不是该类型的话 编译不通过
bird.fly(3);//bird是Bird类型的变量,Bird类中有一个Fly类型的变量,而Fly类型就是一个方法类型,所以fly成员变量就是一个特定的方法(函数),所以可以这样调用:bird.fly(3)
Bird类定义在下面:
class Bird{
Fly fly;
Bird(this.fly);
}
5.
函数位置参数使用方括号[]括起来: int f(int x, int y,[int z]){} //z是可选的形参
函数命名参数用大括号{}括起来:int f({String name,String Sex}){},可以这样调用:
f(name:’wangziyou’,Sex:’Male’);
但二者不能同时使用
6.
断言assert,assert内部包含一个返回bool的表达式,如果返回false,那么assert就会抛出error暂停调试。正常使用方式是:对于不确定是否会报错的语句加上assert,如果正常运行不会抛出异常就代表这个语句没有问题。
7.
Dart中的String可以用单引号或者双引号扩起来,两种都行。
8.
var p=['1','2','3','4']; //p是list<int>类型的
var x=p.join('*'); //把p里的各个字符用*拼起来—-》;’1*2*3*4
print(x.split('*')); //把x用*作为分割符,分割为不同的字符串,保存在list里
如果字符串每个字符都分开,比如’abcd’—>’a’ ‘b’ ‘c’ ‘d’
写法是:p.split(‘’)即可,注意括号里是不带空格的,两个单引号是连着的。
之后再拼起来也是.join(‘’),括号里面也是不带空格的。
9.
dart的future对象用于异步调用,它的成员函数貌似返回的也都是future对象(这一点待确定)
10.
Dart中a/b结果为double类型的,如果想得到整数结果需要:a~/b
11.
is 、as 属于Type test operators。
is 判断是否是某个类型,返回true或者false。
如果a 是b的实现类,那么a is b 就返回true。
as 是类型转换,其相当于 :先检测 其是不是,然后再调用的一种简写。
但是还不是完全一致,当不是的时候,as 会抛出exception。
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
可以简写为:
(emp as persion).firstName='Bob';
如果emp 不是persion,name就会抛出exception。
12.
??=也是赋值符,但只有在被赋值的变量为空时。如果不为空,则不做任何事情。
// 赋值给a
a = value;
// 如果b为空,则将值分配给b;否则,b保持不变
b ??= value;
??是条件运算符:
expr1 ?? expr2
如果expr1为非空,则返回其值;否则,计算并返回expr2的值。
13.
..是极联符(不算运算符,只是dart语法的一部分),它表示对前一句的对象进行一系列调用,只要是对象就行,不需要是某个函数的返回结果。栗子:
void main(){
List p=[];
p
..length
..clear()
..sort();
}
这段代码相当于p.length; p,clear(); p.sort();
注意极联的缩进
注意点:极联返回的是当前调用的对象本身,和函数返回值无关!!!和函数返回值无关!!!和函数返回值无关!!!
14.
Dart支持函数的嵌套定义
15.
Dart中所有函数都有返回值。
没有显示返回语句的函数最后一行默认为执行 return null;。
foo() {}
assert(foo() == null);
16.
Dart中捕获异常通过try on/catch来实现,on可以指定具体的异常类型,catch则可以捕获异常对象:catch(e),然后可以输出e的信息。
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 指定异常
buyMoreLlamas();
} on Exception catch (e) {
// 其它类型的异常
print('Unknown exception: $e');
} catch (e) {
// // 不指定类型,处理其它全部
print('Something really unknown: $e');
}
17.
两个使用相同构造函数相同参数值构造的编译时常量是同一个对象:
var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // 它们是同一个实例 (They are the same instance!)
18.
子类中可以通过super.xxxx()来调用父类的方法
19.
继承这样写的:
class Person {
int age;
string name;
Person(int age, String name){
this.age = age;
this.name = name;
}
void sayhi(){
print('my name is' this.name)
}
}
class Worker extend Person{
int salary;
Worker(int age, string name, int salary) : super(age, name){ //super表示要继承父类的属性
this.salary = salary;
}
@override //告诉编译器和程序员他是一个重写覆盖父类的方法
void sayhi(){ super.sayhi() //表示调用父类的sayhi方法
print('my salary is'+ this.salary)
}
}
20.
dart中系统默认类型的数据(比如int/num这种基本的数据类型),两个相同值的不同变量是=的
但如果是自己定义的类,但是没有重载=运算符,甚至是官方的map/set/list进行=比较,都会返回false:
因为dart中的所有类型都是object的子类,所以如果没有单独定义=运算符,那么对两个变量进行=运算,都使用的是object的=运算符,而object的=运算符是用于检测参数与接收者是否相同,所以就会出现下面这种奇怪的情况,c++里是不会有这种情况的:
需要operator= (another) {return xxxxx;}来对=运算符进行重载,这样就可以通过=判断是否相等了。
然后如果还有需要判断是否相同的需求,可以使用identical(a,b)的方法,该方法定义在dart:core库中。
21.
set方法写法:set(another)=> xx=another.xx;
get方法写法:get=>xxxx; //注意get方法是不带参数列 表的(不带参数括号!)
22.
dart的var只是语法糖,实际用var命名的变量是dynamic类型,然后会在编译时被推导为各自的类型。(注意var绝不是数据类型,只是语法糖,语法糖,语法糖,说三遍!)
23.
dart中的extends with是混入的意思。dart中使用其他类方法有三种方式:继承/混入和接口,对应的关键字分别是extends/with/implements。
三者可以同时存在,但有先后次序,继承>混入>接口。
dart中的继承只能是单继承,但混入和接口可以有多个,用逗号隔 开即可。注意如果
24.
dart中父类和子类可以互相赋值。
25.
dart中字符串前面+r就代表无转义,比如r'\n'就会输出\n
26.
print格式化输出,用$和变量名一起作为占位符:
main() { String s1='hello'; String s2='bytedance'; print('$s1 i am wangziyou i love $s2'); }