Dart语言集百家之长,用的时候你就能感觉到会有很多语言的影子,如果本身已经有java,kotlin等语言基础,学dart语言花个几个小时看一下就可以了,剩下的就是多练习练习,熟悉dart语言的语法,目前dart主要用于Flutter开发。以下是几点重要的概念:
- Dart 是强类型语言,但是又兼有 JS 的动态性
- 类型声明是可选的,可通过类型推导而来
- 语句以分号结尾,不能省略
1.变量
与java相比String,int,bool,double基本上都一样,其中String单引号和双引号都可以用
String str = "测试";
String str ='测试';
int a = 10;
double b = 20.2;
bool bl = true;
//num是数值类型
num d = 20;
可以用var 声明一个变量,一旦赋值,类型就不能再改变,但值可以变化
var dd = "10";
var a = 30;
dynamic和Object
1、Object 是dart所有对象的根基类,也就是说所有类型都是Object的子类,所以任何类型的数据都可以赋值给Object声明的对象.
2、dynamic与var一样都是关键词,声明的变量可以赋值任意对象. 而dynamic与Object相同之处在于,他们声明的变量可以在后期改变赋值类型.
dynamic a = 30;
a = "测试dynamic";
dart只有public和private权限,没有提供关键字声明,默认public,想要实现private,可以在变量名前加一个_,例如:
var a = 10;//public
var _b = 20; //private
字符串拼接:dart字符串拼接有多种方式
String s1 = "First string.....";
String s2 = " Second string" + "ddd";
print(s1 + s2); // First string..... Second stringddd
// 使用换行符以及空格
String str2 = '单引号符串'
'换行了'
'再加空格'
'拼接';
print("str2:$str2");// 输出结果:单引号符串换行了再加空格拼接
// 单双引号 空格拼接
String str3 = "单双引号空格字符串" '拼接' "~";
print("str3:$str3");// 输出结果:单双引号字符串空格拼接~
// 单双引号 换行符以及空格
String str4 = "单双引号符串\n"
'换行了'
'再加空格'
'拼接';
print("str4:$str4");
// 输出结果:单双引号符串
//换行了再加空格拼接
dart还有一些很方便的语法结构,与java不同,类似kotlin,以下举例
int x = 12;
double y = 0;
x.toDouble();
y.toInt();
x.compareTo(y);
List:dart的list相当于java数组和list的集合体,dart中集合和数组都用list来表示
List list = [];//初始化一个空的集合,不需要new关键字
List list = [1,2,3,6];
list.add(3);
list.removeAt(0);
map:map初始化只需要{}就可以,不需要new关键字,具体存取用法与java类似
var map = {}
var map = {
'key1' : 'value1',
'key2': 'value2',
'key3' : 'value3'
};
map['key4'] = 'value4';
map['key5'] = 'value5';
map['key6'] = 'value6';
enum 枚举
enum Color {
red,
green,
blue
}
for循环
var list = [7, 4, 3, 'Dart', true];
//forEach
list.forEach((element) {
print(element);
});
//for..in
for (var item in list) {
print(item);
}
//与java一样
for (var i=0;i<list.length;i++) {
print(list[i]);
}
while,do while循环
var i =0;
var sum = 10;
while(i<10){
sum+=i;
i++;
}
do{
sum+=i;
i++;
}while(i<10);
条件判断:if,else if, else ,swith,case基本与java一样
var a = 10;
if (a < 9) {
// 如果if表达式为true,则将执行语句。
}else if(a > 12){
// 如果else if表达式为true,则将执行语句。
} else {
// 否则将执行语句。
}
switch (a) {
case 10:
print("case 10");
break;
case 9:
print("case 9");
break;
default:
print("default");
break;
}
2.函数
构造函数
Person person = Person(2, 3);
var map = {"x": 2, "y": 3};
Person person1 = Person.fromJson(map);
class Person {
int x = 0;
int y = 0;
//普通构造函数写法
Person(this.x, this.y);
//命名构造函数,使用命名构造函数可以创建多个构造函数
Person.fromJson(Map json) {
x = json['x'];
y = json['y'];
}
}
箭头函数
1、对于只有一个表达式的方法,你可以选择 使用缩写语法来定义。
2、箭头函数即使只有一个参数,也不能省略括号
//无参匿名函数
anonFunc1() => print('无参匿名函数');
anonFunc1(); // 输出结果: 无参匿名函数
//anonFunc1() => print('无参匿名函数');相当于anonFunc1(){print('无参匿名函数');};
//有参匿名函数
anonFunc(name,type) => 'I am $name 类型:$type';
print(anonFunc('dart',2)); // 输出结果: I am damon
//anonFunc(name,type) => 'I am $name 类型:$type'; 相当于 anonFunc(name,type){
// 'I am $name 类型:$type';
// };
函数可选参数:与java不同,dart中不支持重载,java支持方法重载,dart想要实现java类似的效果,可以通过可选参数来实现
selectFunction("张三");
selectFunction("李四",type: 1);
selectFunction("王五",type: 1,money: 83.2);
void selectFunction(String name,{int? type,double? money}){
print("名字:$name--类型:$type--金额:$money");
}
//注意dart可选参数必须要加?来表示该参数默认值为null,如果去掉?可以手动写个默认值,例如
void selectFunction(String name,{int type = 0,double? money}){
print("名字:$name--类型:$type--金额:$money");
}
//输出结果:名字:张三--类型:null--金额:null
//名字:李四--类型:1--金额:null
//名字:王五--类型:1--金额:83.2
断言assert
//如果fullName是空的话,继续往下执行,否则打断代码执行
var fullName = '';
assert(fullName.isEmpty);
print("fullname"+fullName);
异常:dart异常(或异常事件)是在执行程序期间出现的问题。发生异常时,程序的正常流程中断,程序/应用程序异常终止。
与Java相反,所有的dart异常都是未受检异常。也就是说当调用一个可以抛出异常的方法时,不必一定去捕获这个异常。这点和Kotlin一样,都是为了简化代码,增加可读性。如果你担心这段代码真的会产生什么异常,那么可以自行捕获。
Dart2的异常是Exception或者Error(包括它们的子类)的类型,甚至可以是非Exception或者Error类,也可以抛出,但是不建议这么使用。
Exception主要是程序本身可以处理的异常,比如:IOException。我们处理的异常也是以这种异常为主。
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 DartVM出现的问题。比如:内存溢出(OutOfMemoryError)等等。
//异常抛出
void testAge(int age) {
if (age < 10) {
// throw new FormatException("年龄不能小于 10");
throw FormatException("年龄不能小于 10");
}
}
//异常捕获
void finallyCatchStatementBlock() {
int x = 18;
int y = 0;
int res;
try {
res = x ~/ y;
} on IntegerDivisionByZeroException {
print("Cannot divide by zero");
} finally {
print("Finally block executed");
}
}
4.继承关系
dart有三种方式,分别是extends(继承),with(混入) ,implements(实现),三种可以混合使用,其中with,implements后可以多继承,用逗号隔开,extends后面只能跟一个,优先级顺序为with>extends>implements,当with,implements后跟了多个的时候,优先级最右边大于左边,依次类推,例如extends a with b,c implements d,h,优先级为c>b>a>h>d;
注意:dart无interface关键字,一般实现接口都用抽象类abstract
void main() {
Son2 son2 = Son2();
son2.getName();//输出结果:香蕉类
}
class Fruit {
void getName() {
print("水果类");
}
}
class Apple {
void getName() {
print("苹果类");
}
}
class Banana {
void getName() {
print("香蕉类");
}
}
class Tangerine {
void getName() {
print("橘子类");
}
}
abstract class Drink {
void getName() {
print("饮料类");
}
}
class Son2 extends Fruit with Apple,Banana implements Drink {}
5.操作符
算术操作符:除法结果取整: ~/
var a =5;
var b =2;
print(a/b); //输出结果:2.5
print(a~/b); //输出结果:2
相等操作符 无三等号操作符,双等号操作符比较的是内容是否相同,而不是内存地址,如果要比较内存地址是否相同,可以用 identical
var c = 3;
var d = 3;
print(d == c);
类型判定操作符:对比java as:类型转换;is 相当于 instanceof;
var c = 3;
if (c is String) {
print("string类型");
}
(c as String).isNotEmpty;
赋值操作符:使用 = 操作符来赋值。 但是还有一个 ??= 操作符用来指定 值为 null 的变量的值
String value = "赋值";
var v1 ="";
dynamic v2 = "初始值";
v1 = value; // 给 a 变量赋值
v2 ??= value; // 如果 b 是 null,则赋值给 b; 如果不是 null,则 b 的值保持不变
print('$v2');
条件表达式:?? 判断是否为空,为空执行??后面的内容
var v1 ="为空";
dynamic v2 = "初始值";
v2 = null;
var v3 = v2 ?? v1; // v2 为 null 时执行v1
print('$v3'); //输出结果:为空
级联操作符:级联操作符 (..) 可以在同一个对象上 连续调用多个函数以及访问成员变量(可以想象一下设计模式中的构建者模式,但是与构建者模式概念完全不一样,写法上类似)。
StringBuffer stringbuffer = StringBuffer();
stringbuffer
..write('开始')
..write('学习')
..write('\n')
..writeln('dart');
print(stringbuffer);
运算符重载:与c++运算符重载基本相同,比如string,int之间的+,-,>,=等内部都是通过运算符重载来实现,java内部其实已经帮我们实现了,dart中的基础运算也帮我们实现了(可以查看一下dart源码),但是dart也把运算符重载提供了出来
Point point = Point.xy(1, 2);
Point point1 = Point.xy(2, 4);
point = point + point1;
print("运算符重载x=${point.x},y=${point.y}");//输出结果:运算符重载x=3,y=6
class Point {
int x = 0;
int y = 0;
Point();
Point.xy(this.x,this.y);
// 运算符重载
Point operator +(Point point) {
Point newPotin = Point();
newPotin.x = x + point.x;
newPotin.y = y + point.y;
return newPotin;
}
}
dart还有许多很方便的用法,与java,kotlin,javaScript等多种语言上很多比较方便的语法都结合在一起,这里就不多介绍了,掌握上面的基本语法后,结合自己的语法经验,实际项目使用很快就能发现出来。