基于有其他开发语言的基础,快速了解Dart语言中的一些语法和区别于其他语言的特殊点
1、变量不限定为单一类型可以指定为dynamic或者Object类型
Object obj = "name";
dynamic obj = "name"
obj = 4;
// 变量的定义
var param = "张三"
2、无论什么类型的变量未初始化的默认值为null
3、final和const
final只能赋值一次,在首次访问时才被初始化
const是编译时常量,一经声明不能再次赋值
4、所有的变量都是一个对象
5、Dart中不能判断非0即真, 或者非空即真
num、String、bool、List、Map、Set
1、??=
??=
a ??= 5
表示a == null,则a = 5,否则就使用a的值
2、级联运算符 … 运行对用一对象进行多项操作
querySelector('#confirm') // 获取html元素对象
..text = 'Confirm' // 访问成员
..classes.add('important') // 添加样式
..onClick.listen((e) => window.alert('Confirmed!')); // 监听事件
等同于如下代码
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
函数也是对象。
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
函数中只有一句表达式,可以使用箭头语法(箭头 => 和分号 ; 之间只能使用一个 表达式)
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
可选参数:
1、命名可选参数:调用函数时指定命名参数
// 定义
int add({int num1, int num2}) {
return num1 + num2;
}
// 调用
add(num1: 3, num2: 4);
使用@required表示参数时必须传递的性质
2、位置可选参数:使用[]来表示里面的参数时可选的
void test(String name, [String param]) {
print("name = $name - param = $param");
}
// 可选参数提供默认值
void test(String name, [String param = "param"]) {
print("name = $name - param = $param");
}
类似于swift中的扩展
extension IntExtension on int {
// 给int扩展获取两倍的get方法
int get doubleNumber {
return this * 2;
}
}
Dart中的所有异常类型是非检查异常,可以抛出任何非null对象。
1、Throw
throw FormatException('Expected at least 1 section');
// 抛出任何对象
throw 'Out of llamas!';
2、Catch 捕获异常
使用 on 来指定异常类型, 使用 catch 来 捕获异常对象
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
Dart 是一种基于类和 mixin 继承机制的面向对象的语言。
基于Mixin继承意味着每个类(除 Object 外) 都只有一个超类, 一个类中的代码可以在其他多个继承类中重复使用。
1、构造函数
a、构造函数不会被继承,默认生成一个无参构造函数。
b、自定义构造函数后,默认的无参构造函数失效
c、构造函数的名字可以是 ClassName 或者 ClassName.identifier
class Point {
num x;
num y;
// 构造函数
Point(this.x, this.y);
}
var p1 = Point(2, 2);
命名构造函数:为一个类生成多个构造函数
class Point {
num x;
num y;
// 命名构造函数
Point.otherPoint(Point p) {
this.x = p.x;
this.y = p.y;
}
}
构造函数中的初始化列表:
Point.fromJson(Map json): x = json['x'], y = json['y'] {
print("fromJson");
}
重定向构造函数
class Point {
num x;
num y;
Point(this.x, this.y);
Point.otherPoint(Point p) {
this.x = p.x;
this.y = p.y;
}
Point.fromJson(Map json): x = json['x'], y = json['y'] {
print("fromJson");
}
// 重定向到主构造函数
Point.alongXAxis(num x) : this(x, 0);
}
常量构造函数:类生成的对象是固定不变的
class ImmutablePoint {
static final ImmutablePoint origin = const ImmutablePoint(0, 0);
final num x, y;
const ImmutablePoint(this.x, this.y);
}
工厂构造函数:构造函数并不总是创建这个类的一个新实例时,使用关键字factory
工厂构造函数无法访问this
class Logger {
final String name;
bool mute = false;
// 从命名的 _ 可以知,
// _cache 是私有属性。
static final Map _cache =
{};
// 工厂构造函数
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) print(msg);
}
}
2、获取对象的类型
runtimeType
print(${p1.runtimeType})
3、getter和setter方法
自定义get和set方法
class Point {
num x;
int get getX {
return x;
}
set setX(int value) {
this.x = value;
}
}
4、抽象类和抽象方法
abstract class Doer {
void doSomething(); // 定义一个抽象方法。
}
class EffectiveDoer extends Doer {
void doSomething() {
// 提供方法实现,所以这里的方法就不是抽象方法了...
}
}
5、隐试接口
a、每个类都隐式的定义了一个接口,接口包含了该类所有的实例成员及其实现的接口。
b、如果要创建一个 A 类,A 要支持 B 类的 API ,但是不需要继承 B 的实现, 那么可以通过 A 实现 B 的接口。
c、一个类可以通过 implements 关键字来实现一个或者多个接口, 并实现每个接口要求的 API。