dart知识点备忘录
运算符
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类的合体区间
未完待续。。。