Dart

2020-08-08  本文已影响0人  卖菇凉的小火柴丶

1.相关概念

2.变量

final list0 = [1,2,3];
list0[0] = 4;
var list1 = const [1,2,3];
list1[0] = 4;//这样会报错

对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象:

getConst() => const [1, 2]; 
main() { 
  var a = getConst(); 
  var b = getConst(); 
  print(a === b); // true 
} 

const 关键字不只是用于声明常量,还可以用它来创建常量值(注意是值);以及声明创建常量值的构造函数。任何变量都可以具有常量值。

var foo = const [];
foo = [1, 2, 3]; // 第一次赋值;
foo = [2, 3, 4]; // 错误: const变量不能再次赋值;

const修饰构造函数就是常量构造函数,常量构造函数必须用于成员变量都是final的类!构建常量实例时必须调用常量构造函数。如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例

class Point {
  final int x;
  final int y;
  const Point(this.x, this.y);
}

void main() {
  //条件:如果Point(this.x, this.y)构造函数没有被const修饰
  const point = Point(1, 2); // 报错 const对象一定要调用常量构造方法(没有常量构造方法)
  var point = const Point(1, 2); // 报错 const对象一定要调用常量构造方法(没有常量构造方法)

  //条件:有常量构造函数
  var point = Point(1, 2);//point可以被重新赋值
  var point1 = const Point(1, 2); // point1可以被重新赋值
  const point2 = Point(1, 2); // point2不可以被重新赋值(默认调用常量构造方法)
  const point3 = const Point(1, 2); // point3不可以被重新赋值
}

3.操作符

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!'));
class Test {
    num member = 1;
}

void main() {
  var test = null;
  print(test?.member); // 返回null 不会抛出异常
  test = new Test();
  print(test?.member); // 返回 1
}

4.内置类型

var constantList = const [1, 2, 3];
constantList[1] = 1; // 报错
final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};
constantMap[2] = 'Helium'; // 报错

5.函数

//参数列表{}里面的参数是否传值可选,@required修饰的除外
//@required表示调用时必须传该参数 不然报错
//可以设置默认值,没有提供默认就是null
void funcName({bool args1, @required bool args2, bool args3 = false}) {...}

    可选位置参数

//[]里面的就是可选位置参数 也是是否传值可选 但是一旦传值必须按位置传值!
void funcName(String args1,[bool args2, bool args3]) {...}

6.异常

throw FormatException('Expected at least 1 section');
throw 'Out of llamas!';
try {
  breedMoreLlamas();
} on OutOfLlamasException { //使用 on 来指定异常类型
  // 一个特殊的异常
  buyMoreLlamas();
} on Exception catch (e) { //使用catch来捕获异常对象,最终的捕获是靠catch,on只是条件附加
  // 其他任何异常
  print('Unknown exception: $e');
} catch (e) {
  // 没有指定的类型,处理所有异常
  print('Something really unknown: $e');
} finally {
  //无论是否有异常 都会执行这一句
}

7.类

构造函数

子类不会继承父类的构造函数。

var a = const ImmutablePoint(1, 1);
var b = const ImmutablePoint(1, 1);
assert(identical(a, b)); // 它们是同一个实例。

//注意这俩的区别
var c = const ImmutablePoint(1, 1); // 创建一个常量对象
var d = ImmutablePoint(1, 1); // 创建一个非常量对象
assert(!identical(a, b)); // 两者不是同一个实例!
class Logger {
  final String name;
  bool mute = false;

  // 从命名的 _ 可以知,
  // _cache 是私有属性。
  static final Map<String, Logger> _cache =
      <String, Logger>{};

  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);
  }
}
实例变量
class People {
  String _name;
  set pName(String value) {
    _name = value;
  }
  String get pName {
    return 'people is ${_name}';
  }
}
抽象类

abstract修饰,不能被实例化。如果希望抽象类能够被实例化,那么可以通过定义一个 工厂构造函数来实现。
抽象方法:不实现方法体就是抽象方法,不需要用abstract修饰。

接口

dart中每个类都能作为接口被其他类所实现,使用implements关键字。接口包含类里的所有成员变量,以及定义的方法(不包含构造方法)。
注意: implements A表明类必须实现A中的属性以及方法(并不继承接口中的属性值或者方法体,只是规定类中必须实现接口的要求的属性或者方法)。

mixin(目前只是简单介绍,后续实际开发中更新)

继承,实现,混入是可以同时存在的,extends在前,mixins在中间,implements最后。
mixin一般用with。
"with多个类的话",如果多个类中有同样的方法,那么后面的方法会覆盖前面的方法。

子类中如果有跟父类、接口、mixin相同的方法,一定执行的是子类的方法。
如果子类的mixin跟父类以及接口有相同的方法,那么执行的一定是mixin的方法。前提是子类中没有与之相同的方法(原理就是mixin会覆盖extends相同方法,而implements只是要求实现方法,并不继承方法体。mixin恰好实现了这个方法)。

main(List<String> args) {
  var tool = Tool();
  tool.say();
  print(tool.name);
}

class Tool with A, B {}
class A {
  var name = "A";
  say() {
    print("A");
  }
}
class B {
  var name = "B";
  say() {
    print("B");
  }
}
上一篇 下一篇

猜你喜欢

热点阅读