1、FocusNode
FocusNode可以實現(xiàn)對輸入框的獲取或者失去焦點的監(jiān)聽。
FocusNode focusNode = new FocusNode();
focusNode.addListener(() {
setState(() {
keyboardAppeared = focusNode.hasFocus;
});
});
2、一些控件的總結
Offstage: 控制child顯示還是隱藏,offstage為true時隱藏
Chip: 用作顯示標簽,自帶刪除按鈕。左側可以設置小圖標,label顯示文本
ClipPath: 切割控件成不同的形狀,clipper屬性里面設置切割的path。
Material: 可設置陰影、圓角
ClipRRect: 高效切圓角
ClipOval: 橢圓
CircleAvatar: 設置圓形頭像
futureBuilder: 根據(jù)網(wǎng)絡請求的不同狀態(tài)顯示不同的視圖,將請求數(shù)據(jù)的方法賦值給全局變量,可以防止futureBuilder不必要的重繪問題
IgnorePointer:控制控件是否接收觸摸事件
3、extends、mixin、implements之間的區(qū)別
- 繼承(關鍵字 extends)、混入 mixins (關鍵字 with)、接口實現(xiàn)(關鍵字 implements)。這三者可以同時存在,前后順序是extends -> mixins -> implements。
- extends 繼承在flutter中是單繼承,構造函數(shù)不能繼承,子類重寫超類的方法,要用@override,子類調用超類的方法,要用super。
- implements 接口實現(xiàn),也是Class,如果有一個類 A,你想讓類B擁有A的API,但又不想擁有A里的實現(xiàn),那么你就應該把A當做接口,類B implements 類A.
當class被當做interface用時,class中的方法就是接口的方法,需要在子類里重新實現(xiàn),在子類實現(xiàn)的時候要加@override
當class被當做interface用時,class中的成員變量也需要在子類里重新實現(xiàn)。在成員變量前加@override - mixin 混入,是一種在多個類層次結構中復用類代碼的方法。在dart21.版本中,mixins類只能繼承自object,mixins類不能有構造函數(shù),一個類可以mixins多個mixins類。
4、State對象的初始化流程
initState() : 一旦State對象被創(chuàng)建,initState方法是第一個(構造函數(shù)之后)被調用的方法??赏ㄟ^重寫來執(zhí)行額外的初始化,如初始化動畫、控制器等。重寫該方法時,應該首先調用super.initState()。在initState中,無法真正使用context,因為框架還沒有完全將其與state關聯(lián)。initState在該State對象的生命周期內將不會再次調用。
didChangeDependencies(): 這是第二個被調用的方法。在這一階段,context已經(jīng)可用。如果你的Widget鏈接到了一個InheritedWidget并且/或者你需要初始化一些listeners(基于context),通常會重寫該方法。請注意,如果Widget鏈接到InheritedWidget,則每次重建Widget時都會調用此方法。如果重寫此方法,則應首先調用super.didChangeDependencies()。
build(BuildContext context): 此方法在didChangeDependencies()、didUpdateWidget()之后被調用。每次State對象更新(或當InheritedWidget有新的通知時)都會調用該方法!我們一般都在build中來編寫真正的功能代碼。為了強制重建,可以在需要的時候調用setState((){...})方法。
dispose(): 此方法在Widget被廢棄時調用??芍貙懺摲椒▉韴?zhí)行一些清理操作(如解除listeners),并在此之后立即調用super.dispose()。