三元運算符
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類的合體區間