dart知识点备忘录

34次阅读

共计 2372 个字符,预计需要花费 6 分钟才能阅读完成。

三元运算符

expr1 ?? expr2
如果 expr1 非空,则返回其值; 否则,评估并返回 expr2 的值。

构造函数冒号表达式

原理

冒号初始化是给数据成员分配内存空间时就进行初始化, 就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式), 那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。

用途

1、重定向到同一个类中的其他构造函数

class Point {
  num x, y;
 // The main constructor for this class.
 Point(this.x, this.y);
 // Delegates to the main constructor.
  Point.alongXAxis(num x) : this(x, 0);
}

2、调用非默认的超类构造函数

class Employee extends Person {
 // Person does not have a default constructor;
 // you must call super.fromJson(data).
  Employee.fromJson(Map data) : super.fromJson(data) { //“:" 调用了他的超类 Person 中的命名构造函数
 print('in Employee');
 }
}

3、还可以在构造函数主体运行之前初始化实例变量。初始值设定项用逗号分开。

import 'dart:math';

class Point {
  final num x;
  final num y;
  final num distanceFromOrigin;

 Point(x, y)
 : x = x,
        y = y,
        distanceFromOrigin = sqrt(x * x + y * y);
}

main() {var p = new Point(2, 3);
 print(p.distanceFromOrigin);
}

StatelessWidget 和 StatefulWidget

StatefulWidget

修饰符

static

修饰的成员变量和成员方法是静态的唯一的 被所有实例共享 且由类本身直接调用

final 和 const

如果你不打算改变一个变量,可以使用 final 和 const,它们可以替代任何类型,必须在声明时初始化,且不能改变。

区别:

const 是编译器常量,它的值在编译期就可以确定,final 是运行时常量,它的初始值要到运行时才能确定。

class Custom extends StatefulWidget {Custom({Key: key, this.title}) : super(key: key); // key ?
        final String title;
        @override
        _CustomState createState() => new _CustomState();
}
class _CustomState extends State<Custom> {
        @override
        Widget build(BuildContext context) {// context: 当前控件 (元素) 的定位
                print(’title: ${widget.title}’); // widget: StatefulWidget 类 (或者 Custom 类) 的实例
        }
}

const 定义的是编译时常量,只能用编译时常量来初始化
final 定义的常量可以用变量来初始化

const list = const[1,2,3];//Ok
const list = [1,2,3];//Error

final list = [1,2,3];//Ok
final list = const[1,2,3];//Ok
final list = const[new DateTime.now(),2,3];//Error,const 右边必须是常量

dynamic

a 的数据类型可以随意改变,这种类型就是 dynamic

factory

常用来修饰构造函数,将其变为工厂构造函数
工厂构造函数是一种构造函数, 与普通构造函数不同, 工厂函数不会自动生成实例, 而是通过代码来决定返回的实例对象.

dart:convert

dart:convert 是 dart 提供用于在不同数据表示之间进行转换的编码器和解码器,能够解析 JSON 和 UTF-8。
用途:
网络请求返回 (接口返回) 时需要先将 json 数据 (字符串) 使用 dart:convert 转成 Map,我们就能通过 Map 转为 dart 对象了。

super()

作用:1. 子类和父类的变量,有语义上的冲突时,需要用 super 调用父类的变量(方法,变量)

       2. 每个子类的构造方法的第一句,都必须 显示或者隐式通过 super 调用父类的构造方法
       3. 隐式调用只能调用,无参的构造方法
       4. 如果父类没有无参的构造方法,那么必须使用 super 调用父类的构造方法
       5. 通过这样的机制保证了父类的构造方法先执行完毕,然后执行子类的构造方法
       6. 通过 super  来访问父类的构造方法,执行的意义在于,对父类实例成员的初始化

this 和 super 并不冲突,因为当前构造方法没有调用 super()其他构造方法必然有,第一句必然是 super
那这个构造方法调用了那个构造方法,也就是说这个构造方法的第一句也必然是执行父类的构造方法。

mixin 使用

mixin MixinSuper on AbstractSuper {} // 声明了一种 mixin,叫 MixinSuper 类,它继承了实现 AbstractSuper 类的 ImplSuper 类

等同于:

abstract class AbstractSuper {}
class ImplSuper implements AbstractSuper {}
class MixinSuper extends ImplSuper {}

class Sub extends NormalSuper with MixinSuper {} // Sub 类继承了 NormalSuper 类和 MixinSuper 类的合体区间

未完待续。。。

正文完
 0