本文主要介绍Dart开发常用的一些语法
基础语法
Final,Const定义常量
Const 变量在编译时就已经固定。
Final 变量或类变量在第一次使用时被初始化,懒加载。
Const不能定义对象 Final能定义对象
例:
//可以省略String这个类型声明final str = "hi world";//final String str = "hi world"; const str1 = "hi world";//const String str1 = "hi world";
定义多行字符串
String str ="""保留换行的字符串可以在编译器里换行""";String str2 ='''保留换行的字符串可以在编译器里换行''';print(str);print(str2);
double类型初始化时可以赋值为int型
double num1 = 1.0;double num2= 1;print(num1.runtimeType);print("----");print(num2.runtimeType);
Map类型取值map[“key”] 赋值同理
Map testMap = {};testMap["flag"] = true;print(testMap["flag"]);
在List类型中使用if语句
var promoActive = true;var nav = [ 'Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];print(nav);
在List类型中使用For语句
var listOfInts = [1, 2, 3];var listOfStrings = [ '#0', for (var i in listOfInts) '#$i'];print(listOfStrings);
is关键字判断数据类型
int num = 1;print(num is String);String str = "测试";print(str is String);
~/取整运算符
double num = 5;print( num ~/ 2);//5除2取整
字符串形式输出两个变量
String str1 = "str1";String str2 = "str2";print("$str1 $str2");
flag == true ? 我是true” : ”我是false” 三目运算符
String str = "三目运算符";print(str == "三目运算符"?"我是true":"我是false" );
int.parse(str) String类型转int
num.toString()int类型转String
double.toInt() double类型转int
int num = 1;double doubleNum =1.0;String str = "1";print(int.parse(str).runtimeType);print(num.toString().runtimeType);print(doubleNum.toInt().runtimeType);
isEmpty判断字符串是否为空
String str1 = "";print(str1.isEmpty);String str2 = "1";print(str2.isEmpty);String str3;//此行代码会报错,null不能调用isEmptyprint(str3.isEmpty);
变量或方法前加入下划线表示私有
String _privateStr = "私有变量";_privateFunction(){ print("私有方法");}
import关键字用于实现类导入,as给导入的类起别名
import 'dart:math' as math;
if语句只支持bool类型,不支持直接使用空数据判断
String str;//不合法if(str){}//合法if(str != null){}
List的扩展运算符“...”和空值判断扩展运算符“...?”
"..."支持将一个集合添加到另一个集合里
List list1 = [1,2,3];List list2=[-1,0,...list1];print(list2);List list3;// ...?运算符 如果为空就不插入List list4 = [0,...?list3];print(list4);
级联操作符。通过级联操作符可以对类的内部成员进行链式调用,
级联运算符 (..) 可以实现对同一个对像进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性。
var button = Button() // 获取对象。 ..text = 'Confirm' // 调用成员变量。 ..classes.add('important') ..onClick.listen((e) => window.alert('Confirmed!'));
第一句创建对象。获取的对象依次执行级联运算符后面的代码, 代码执行后的返回值会被忽略。 上面的代码等价于:
var button = Button();button.text = 'Confirm';button.classes.add('important');button.onClick.listen((e) => window.alert('Confirmed!'));
赋值操作符“??”、“??=”和“~/”及判空操作符“?
String str;print(str ?? 1);//如果str为空 返回1str ??= "1"; //如果str为空 将str赋值为1print(str);int num = 1;num?.toString();//如果str为空 不执行toString;print(num.runtimeType);int num1;num1?.toString();//如果str为空 不执行toString;print(num1.runtimeType == Null);
var 和 dynamic声明变量
Dart属于强类型语言,但可以用var声明变量,Dart对于var声明会自推导出数据类型。实际上var是编译期的语法糖, 而dynamic声明才表示动态类型,dynamic被编译后是一个object类型,在编译期间不对任何的类型进行检查,而是在运行时对类型进行检查。
String 和 int没有默认的类型转换,‘123’不等于123
String str = "1";int num = 1;print(str == num);
指定了数据类型之后不能重新赋值其他类型的数据
String str = "test"; //此行代码会报错str = 1;
函数相关
函数简写
对于只包含一个表达式的函数,可以使用简写语法
printFunc(String str)=> print(str) ;//等同于//printFunc(String str) {// print(str);//}
函数作为参数传递
_test(){execute(() => print("func被执行了"));execute1(callback); } void execute(var func) {func(); } void execute1(var callback){callback("callback被执行了"); } callback(str){print(str); }
可选的命名参数
定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数。例如:
//设置[bold]和[hidden]标志void enableFlags({bool bold, bool hidden}) {// ... }调用函数enableFlags(bold: true, hidden: false);
闭包
Dart 的闭包是定义在方法里面的方法,其特性:
闭包是一个对象
闭包定义在其他方法内部
闭包可以访问外部方法的布局变量,并持有其状态。这是闭包的最大用途,通过闭包的方式把一个方法内部的属性暴露出去,因为方法是可以返回方法的,Dart 中方法也是对象一样可以当做返回值处理
sum(){ var num = 0; sum2(){num++;print(num); } return sum2; // 也可以这么写,匿名的方式用的最多 return (){num++;print(num); };}// 多调用闭包几次void main(){ Function a = sum(); a(); a(); a(); a(); a(); a();}~~~~~~~~~~log~~~~~~~~~~123456
可以理解sum()就是一个对象,在初始化对象时,数值a已经被确定为0,再次调用a()时,没有再次执行var num = 0;,因为没有重新初始化类,所以赋值操作不会再执行一次。
「纸上得来终觉浅,绝知此事要躬行。」