expr1 ?? expr2
若是expr1非空,則返回其值; 不然,評估並返回expr2的值。json
冒號初始化是給數據成員分配內存空間時就進行初始化,就是說分配一個數據成員只要冒號後有此數據成員的賦值表達式(此表達式必須是括號賦值表達式),那麼分配了內存空間後在進入函數體以前給數據成員賦值,就是說初始化這個數據成員此時函數體還未執行。網絡
一、重定向到同一個類中的其餘構造函數less
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); }
二、調用非默認的超類構造函數ide
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'); } }
三、還能夠在構造函數主體運行以前初始化實例變量。初始值設定項用逗號分開。函數
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和StatefulWidgetui
StatefulWidgetthis
修飾的成員變量和成員方法是靜態的惟一的 被全部實例共享 且由類自己直接調用編碼
若是你不打算改變一個變量,可使用final和const,它們能夠替代任何類型,必須在聲明時初始化,且不能改變。code
區別:orm
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右邊必須是常量
a 的數據類型能夠隨意改變,這種類型就是 dynamic
經常使用來修飾構造函數,將其變爲工廠構造函數
工廠構造函數是一種構造函數,與普通構造函數不一樣,工廠函數不會自動生成實例,而是經過代碼來決定返回的實例對象.
dart:convert是dart提供用於在不一樣數據表示之間進行轉換的編碼器和解碼器,可以解析JSON和UTF-8。
用途:
網絡請求返回(接口返回)時須要先將json數據(字符串)使用dart:convert轉成Map,咱們就能經過Map轉爲dart對象了。
做用:1.子類和父類的變量,有語義上的衝突時,須要用super調用父類的變量(方法,變量)
2. 每一個子類的構造方法的第一句,都必須 顯示或者隱式經過super調用父類的構造方法 3.隱式調用只能調用,無參的構造方法 4.若是父類沒有無參的構造方法,那麼必須使用super調用父類的構造方法 5.經過這樣的機制保證了父類的構造方法先執行完畢,而後執行子類的構造方法 6.經過super 來訪問父類的構造方法,執行的意義在於,對父類實例成員的初始化
this和super並不衝突,由於當前構造方法沒有調用super()其餘構造方法必然有,第一句必然是super
那這個構造方法調用了那個構造方法,也就是說這個構造方法的第一句也必然是執行父類的構造方法。
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類的合體區間
未完待續。。。