發表日期:2018-09 文章編輯:小燈 瀏覽次數:1958
flutter 和Android 有所不一樣,android包含 布局(各種layout),組件(button,textview 等等);flutter的一切都是widget,包括最頂層的頁面布局都是一個widget,包含許多其他的widget,一個頁面則有多個widget組合而成.
widget 根據不同的功能可以分為:
...
事實上可以理解成,一個flutter的頁面是有一棵樹型的widget組成,包括根節點,和樹枝,樹葉都是 一個widget, widget嵌套其他的widget而已.對于一些Android中的屬性值,例如 對齊方式,居中,padding,在flutter中都是一個widget.
通常我們app中會使用到兩種 widget, statelessWidget 和statefulWidget 表示無狀態widget和有狀態widget.
StatefulWidget,如果在構造器鐘使用了GlobalKey 表示key的時候,在進行移動到另一顆樹的時候,會保持狀態對象不會改變.因為擁有GlobalKey的widget在整個樹形結構中只會放在一個位置,使用GlobalKey的widget則會關聯這個元素.
State.initState
準備使用的時候調用State.dispose
,但是它不依賴與InheritedWidget
也不需要調用State.setState
.這些widget廣泛使用在app或者一個頁面的root,通過ChangeNotifier
,Stream
或者其他對象和他的子widget通訊.有狀態的widget遵循這樣的模式相對來說比較低耗(根據cpu和gpu的周期講)因為他們只需要編譯一次后面就不需要更新.因此他們可以做一些復雜深層的構建方法.State.setState
或者依賴InheritedWidget
的widget.這些widget典型的會在app的生命周期中重新構建多次,因此對widget重新構建最小化影響顯得尤為重要.(也可以使用State.initState
或者State.didChangeDependencies
分配資源,但是最重要的還是重新構建渲染)有一些可以減少statefulwidget重新構建的技術手段:
const
widget.(作用和使用緩存widget并且重用它的一樣)IgnorePointer
來包裝widget,并且控制IgnorePointer.ignoring
.這是因為,改變子樹的深度需要進行widget的重構,重新布局,并且重繪子樹的實體,而改變屬性只需要盡小可能的改變樹的渲染(例如IgnorePointer
,不需要重新布局,和重繪子樹的實體)GlobalKey
statelesswidget是一個小部件,具體地說是用于描述用戶界面的一部分構建描述用戶界面的其他小部件的宿主。 構建過程以遞歸方式繼續,直到用戶界面的描述是完全具體的(例如,包含完全是RenderObjectWidget
,它描述了具體的RenderObject
)
當您是用戶界面的一部分時,statelesswidget非常有用描述不依賴于配置以外的任何其他內容對象本身的信息和widget inflate的BuildContext
。 對于可以動態改變的組合物,例如 由于具有內部時鐘驅動狀態,或取決于某些系統狀態,考慮使用StatefulWidget
statelesswidget 的build
方法通常僅在三個中調用情況:第一次將widget插入樹中,當時widget的父級更改其配置,當[InheritedWidget]依賴于更改時。
如果widget的父級將定期更改widget的配置,或者如果它取決于經常改變的繼承widget,這樣優化[build]方法的性能以維持流暢渲染性能就變得很重要。
Align
或CustomSingleChildLayout
而不是精心安排 Row
,Column
,Padding
和SizedBox
來以特別花哨的方式定義child。 考慮一個CustomPaint
小部件而不是復雜的多層次 Container
和Decoration
用于繪制正確的圖形效果。const
widget.StatefulWidget
中描述的一些技術,例如緩存子樹的公共部分并在更改時使用GlobalKey
樹的結構。class GreenFrog extends StatelessWidget {const GreenFrog({ Key key }) : super(key: key);@override Widget build(BuildContext context) { return new Container(color: const Color(0xFF2DBD3A)); } }
class Frog extends StatelessWidget { const Frog({Key key,this.color: const Color(0xFF2DBD3A),this.child,}) : super(key: key); final Color color; final Widget child;@override Widget build(BuildContext context) { return new Container(color: color, child: child);} }
按照慣例,widget構造函數僅使用命名參數。 命名參數可以使用@required
標記為必需。 按照慣例,第一個參數是key
,最后一個參數是child
,children
或者相似的。
日期:2018-10 瀏覽次數:7253
日期:2018-12 瀏覽次數:4328
日期:2018-07 瀏覽次數:4876
日期:2018-12 瀏覽次數:4174
日期:2018-09 瀏覽次數:5502
日期:2018-12 瀏覽次數:9922
日期:2018-11 瀏覽次數:4804
日期:2018-07 瀏覽次數:4578
日期:2018-05 瀏覽次數:4859
日期:2018-12 瀏覽次數:4324
日期:2018-10 瀏覽次數:5139
日期:2018-12 瀏覽次數:6212
日期:2018-11 瀏覽次數:4464
日期:2018-08 瀏覽次數:4592
日期:2018-11 瀏覽次數:12630
日期:2018-09 瀏覽次數:5579
日期:2018-12 瀏覽次數:4832
日期:2018-10 瀏覽次數:4188
日期:2018-11 瀏覽次數:4528
日期:2018-12 瀏覽次數:6063
日期:2018-06 瀏覽次數:4007
日期:2018-08 瀏覽次數:5436
日期:2018-10 瀏覽次數:4457
日期:2018-12 瀏覽次數:4525
日期:2018-07 瀏覽次數:4362
日期:2018-12 瀏覽次數:4500
日期:2018-06 瀏覽次數:4383
日期:2018-11 瀏覽次數:4375
日期:2018-12 瀏覽次數:4249
日期:2018-12 瀏覽次數:5283
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.