一、变量声明
1、var
类似于JavaScript 中的var ,它可接收其它类型的变量,但最大不同的是Dart 中的变量一旦赋值,类型便会确定,则不能改变其类型 ,如:
var t;
t=’Hello World’;
//下面代码在dart 中会报错,因为变量t的类型已经确定为String
//类型一旦确定后则不能更改其类
t= 1000;
2、dynamic 和Object
Object 是Dart 所有类型的根基类,也就是说所有的类型都是Object 的子类(包括Function 和 Null),所以任何类型的数据都可以赋值给Object 声明的对象,dynamic 与var 一样都是关键字,声明的变量可以赋值任意对象,而dymamic 对象与Object 相同之处在于,他们声明的变量可以在后期更改赋值类型。
dynamic t= “Hello World”;
t= 1000; //代码没有问题
dynamic 与Object 不同的是,dynamic 声明的对象会提供所有可能的组合,而Object 声明的对象只能使用Object 的属性和方法,否则编译会失败,
dynamic a;
object b;
main(){
a=’’;
b=’’;
printlengths();
}
printlengths(){
print(a.length);
// The getter 'length' is not defined for the class 'Object'
print(b.length):
}
3、final 和 const
如果您从未打算更改一个变量,那么使用 final 或 const 不是 var ,也不是一个类型。一个final 变量只能被设置一次,两者区别在于:const 是一个编译时常量,final 变量在第一次使用是被初始化,被 final 或 const 修饰的变量,变量类型可以省略,如:
final str = ‘hi world’;
final String str = ‘Hi world’;
const str = “hi world”;
//const String str = “hi World”;
二、函数
Dart 是一种真正的面向对象的语音,所以即使是函数也是对象,并且,有一个类型是Function 。这意味着函数可以赋值给变量或者作为参数传递给其它函数,这是函数式编程的典型特征
1、函数声明
bool isNoble(int atomicNumber){
return _nobleGases[atomicNumber]!= null;
}
Dart 函数声明如果没有显式声明返回值类型是会默认当做 dynamic 类型处理,函数返回值没有类型判断:
isNoble(int atomicNumber){
return _nobleGases[atomicNumber]!= null;
}
//报错,isNoble 不是bool 类型
test(isNoble)
2、对于只包含一个表达式的函数,可以使用简写语法:
bool isNoble(int atomicNumber) => _nobleGases[atomicNuber]!=null;
3、函数作为变量
var say = (str){
print(str);
}
say(“hi world”);
4、函数作为参数传递
void execute(var callBack){
callBack();
}
execute(()=>print(‘xxx’));
5、可选位置参数
包含一组函数参数,用[]标记为可选的位置参数:
String say(String from ,String msg,[String device]){
var result = ‘$from says $ msg’;
if(device != null){
result = “$from say msg with a $device”;
}
return result;
}
say('Bob', 'Howdy');
say('Bob', 'Howdy', 'smoke signal');
6、可选的命名参数
void enableFlags({bool bold,hool hidden}){
};
enableFlags(bold:false,hidden:false);