十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
Stateful(有狀態(tài)) 和 stateless(無(wú)狀態(tài)) widgets
10年積累的成都做網(wǎng)站、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有民勤免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
stateless widget 沒(méi)有內(nèi)部狀態(tài). Icon、 IconButton, 和Text 都是無(wú)狀態(tài)widget, 他們都是 StatelessWidget的子類(lèi)。
stateful widget 是動(dòng)態(tài)的. 用戶(hù)可以和其交互 (例如輸入一個(gè)表單、 或者移動(dòng)一個(gè)slider滑塊),或者可以隨時(shí)間改變 (也許是數(shù)據(jù)改變導(dǎo)致的UI更新). Checkbox, Radio, Slider, InkWell, Form, and TextField 都是 stateful widgets, 他們都是 StatefulWidget的子類(lèi)。
StatefulWidget類(lèi)
具有可變狀態(tài)的小部件。
狀態(tài)是(1)在構(gòu)建窗口小部件時(shí)可以同步讀取的信息,以及(2)在窗口小部件的生命周期內(nèi)可能會(huì)更改的信息。這是小工具實(shí)施者的責(zé)任,以確保國(guó)家的及時(shí)通知當(dāng)這種狀態(tài)的改變,使用State.setState。
有狀態(tài)窗口小部件是一個(gè)窗口小部件,它通過(guò)構(gòu)建一個(gè)更具體地描述用戶(hù)界面的其他窗口小部件來(lái)描述用戶(hù)界面的一部分。構(gòu)建過(guò)程以遞歸方式繼續(xù),直到用戶(hù)界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。
當(dāng)您描述的用戶(hù)界面部分可以動(dòng)態(tài)更改時(shí)(例如由于具有內(nèi)部時(shí)鐘驅(qū)動(dòng)狀態(tài)或依賴(lài)于某些系統(tǒng)狀態(tài)),狀態(tài)窗口小部件非常有用。對(duì)于僅依賴(lài)于對(duì)象本身中的配置信息以及窗口小部件膨脹的 BuildContext的組合,請(qǐng)考慮使用 StatelessWidget。
StatefulWidget實(shí)例本身是不可變的,并且將它們的可變狀態(tài)存儲(chǔ)在由createState方法創(chuàng)建的單獨(dú)State對(duì)象中 ,或者存儲(chǔ)在State訂閱的對(duì)象中,例如Stream或ChangeNotifier對(duì)象,其引用存儲(chǔ)在StatefulWidget的最終字段中本身。
框架在膨脹StatefulWidget時(shí) 調(diào)用createState,這意味著如果該窗口小部件已插入到多個(gè)位置的樹(shù)中,則多個(gè)State對(duì)象可能與同一StatefulWidget關(guān)聯(lián)。同樣,如果StatefulWidget從樹(shù)中移除,后來(lái)在樹(shù)再次插入時(shí),框架將調(diào)用createState再創(chuàng)建一個(gè)新的國(guó)家目標(biāo),簡(jiǎn)化的生命周期狀態(tài)的對(duì)象。
如果StatefulWidget的創(chuàng)建者使用GlobalKey作為其 鍵,則StatefulWidget在從樹(shù)中的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)保持相同的State對(duì)象。由于具有GlobalKey的窗口小部件可以在樹(shù)中的至多一個(gè)位置使用,因此使用GlobalKey的窗口小部件最多只有一個(gè)關(guān)聯(lián)元素。當(dāng)通過(guò)將與該窗口小部件關(guān)聯(lián)的(唯一)子樹(shù)從舊位置移植到新位置(而不是在該位置重新創(chuàng)建子樹(shù))時(shí),框架利用此屬性將全局鍵從樹(shù)中的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)利用此屬性。新的位置)。與StatefulWidget關(guān)聯(lián)的State對(duì)象與子樹(shù)的其余部分一起被移植,這意味著State對(duì)象在新位置被重用(而不是被重新創(chuàng)建)。但是,為了有資格進(jìn)行嫁接,必須將窗口小部件插入到從舊位置移除它的同一動(dòng)畫(huà)幀中的新位置。
StatefulWidget有兩個(gè)主要類(lèi)別。
首先是其中一個(gè)分配資源State.initState并在他們的處置State.dispose,但不依賴(lài)于InheritedWidget S或致電State.setState。這些小部件通常在應(yīng)用程序或頁(yè)面的根目錄中使用,并通過(guò)ChangeNotifier, Stream或其他此類(lèi)對(duì)象與子小部件進(jìn)行通信。遵循這種模式的有狀態(tài)小部件相對(duì)便宜(就CPU和GPU周期而言),因?yàn)樗鼈儤?gòu)建一次然后永不更新。因此,它們可能有一些復(fù)雜和深刻的構(gòu)建方法。
第二類(lèi)是使用State.setState或依賴(lài)于 InheritedWidget的小部件。這些通常會(huì)在應(yīng)用程序的生命周期內(nèi)重建多次,因此最小化重建此類(lèi)窗口小部件的影響非常重要。(他們也可以使用State.initState或 State.didChangeDependencies并分配資源,但重要的是他們重建。)
可以使用幾種技術(shù)來(lái)最小化重建有狀態(tài)窗口小部件的影響:
StatelessWidget類(lèi)
一個(gè)不需要可變狀態(tài)的小部件。
無(wú)狀態(tài)窗口小部件是一個(gè)窗口小部件,它通過(guò)構(gòu)建一個(gè)更具體地描述用戶(hù)界面的其他窗口小部件來(lái)描述用戶(hù)界面的一部分。構(gòu)建過(guò)程以遞歸方式繼續(xù),直到用戶(hù)界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。
當(dāng)您描述的用戶(hù)界面部分不依賴(lài)于對(duì)象本身的配置信息以及窗口小部件膨脹的BuildContext時(shí),無(wú)狀態(tài)窗口小部件非常有用。對(duì)于可以動(dòng)態(tài)更改的組合,例如由于具有內(nèi)部時(shí)鐘驅(qū)動(dòng)狀態(tài)或依賴(lài)于某些系統(tǒng)狀態(tài),請(qǐng)考慮使用StatefulWidget。
無(wú)狀態(tài)窗口小部件的構(gòu)建方法通常僅在以下三種情況下調(diào)用:第一次將窗口小部件插入樹(shù)中,窗口小部件的父窗口更改其配置時(shí),以及何時(shí)依賴(lài)于更改的InheritedWidget。
如果窗口小部件的父級(jí)將定期更改窗口小部件的配置,或者它依賴(lài)于經(jīng)常更改的繼承窗口小部件,則優(yōu)化構(gòu)建方法的性能以保持流暢的呈現(xiàn)性能非常重要。
可以使用幾種技術(shù)來(lái)最小化重建無(wú)狀態(tài)窗口小部件的影響:
SliverAppBar 控件,一個(gè) MD 的 AppBar 。屬性和 AppBar 類(lèi)似,但做的效果比 AppBar 更加強(qiáng)大。相同的屬性具體可以看 Flutter 之 Scaffold 控件 , 里面有 AppBar 控件的介紹。那么還有些沒(méi)有的屬性:
結(jié)合 elevation 使用,當(dāng)elevation 不為 0 的時(shí)候,是否顯示陰影
AppBar 展開(kāi)時(shí)候的高度
true 的時(shí)候下滑AppBar優(yōu)先滑動(dòng)展示,展示完成后才給滑動(dòng)控件滑動(dòng)
snap 為 true, 則 floating 也要為 true 。true 的時(shí)候根據(jù)手指松開(kāi)的位置展開(kāi)或者收縮AppBar
appBar 收縮到最小高度的時(shí)候 appBar 是否可見(jiàn)
SliverAppBar 往往做為 CustomScrollView 的第一個(gè)子元素,根據(jù)滾動(dòng)控件的偏移量或者浮動(dòng)的位置來(lái)改變 SliverAppBar 的高度。所以具體用法如下
另外在上面設(shè)計(jì)到 FlexibleSpaceBar 控件,F(xiàn)lexibleSpaceBar 有個(gè) collapseMode 屬性
為 Sliver 系列控件添加一個(gè) padding 。如給上面 SliverAppBar 添加一個(gè) Padding 。
多行多列的列表控件,相當(dāng)于 Android 的 GridView,有兩個(gè)屬性
SliverChildDelegate,這里有兩種方式創(chuàng)建
SliverGridDelegate,也是有兩種方式創(chuàng)建
結(jié)合上面展示效果
和上面 delegate 屬性一樣,需要?jiǎng)?chuàng)建一個(gè) SliverChildDelegate 。
比 SliverList 多一個(gè) itemExtent 屬性,設(shè)置 item 的高度 。item 里面的子控件無(wú)法再改動(dòng)高度。
上面 SliverAppBar 就是結(jié)合 SliverPersistentHeader 實(shí)現(xiàn)的效果,SliverPersistentHeader 需要一個(gè) SliverPersistentHeaderDelegate 。 實(shí)現(xiàn) SliverPersistentHeaderDelegate 有 4 個(gè)方法需要重寫(xiě)
至于效果,具體效果具體分析。
有一個(gè) Widget 屬性,主要作用是在 CustomScrollView 里面添加多種不同布局的樣式。
占滿(mǎn)一屏或者比一屏更多的布局,
滑動(dòng)剩余部分展示的布局
在編寫(xiě)幾個(gè) Flutter 項(xiàng)目后,發(fā)現(xiàn) Flutter 的強(qiáng)大之處在于業(yè)務(wù)中所有用到的控件以及場(chǎng)景都有對(duì)應(yīng)的處理方案;而 Dart 語(yǔ)言也與 Java 、 Kotlin 類(lèi)似,所以對(duì) Android 開(kāi)發(fā)者來(lái)說(shuō)門(mén)檻非常低;特意記錄一下常用的控件及其使用:
StatelessWidget 不需要額外的創(chuàng)建 State
StatefulWidget 創(chuàng)建 State 類(lèi),并可以在其中保存一些狀態(tài)
only 可以單獨(dú)設(shè)置每個(gè)方向的內(nèi)邊距
類(lèi)似于 LinearLayout 中的 orientation 設(shè)置為 vertical , mainAxisAlignment 表示豎向的一個(gè)對(duì)齊方式, crossAxisAlignment 表示橫向的對(duì)齊方式
與 Column 相反,主軸是橫向,對(duì)齊方式類(lèi)似, crossAxisAlignment 表示豎向的對(duì)齊方式
類(lèi)似 SizedBox ,一個(gè)容器,但是主要功能是有一個(gè) decoration —— 裝飾器,作用是繪制背景,或者使用 item 中的陰影
棧,先入后出,類(lèi)似于 Android 上的 FrameLayout
通常配合 Stack 使用,固定顯示在某一個(gè)位置
配合多 child 使用,會(huì)填充剩余的空間
Image 功能強(qiáng)大,使用不同的方法可以加載不同來(lái)源的圖片
看到這些方法,突然覺(jué)得 Flutter 太香了,而且 Image 可以配置 clip 等裁剪出不同形狀的圖片,無(wú)論是圓形還是五角星都不在話(huà)下,然而 Android 要實(shí)現(xiàn)不規(guī)則的形狀,可是要下不少功夫的。
名字和 Android 的一模一樣,但是用法卻比 Android 的簡(jiǎn)單很多:
主要就是 itemCount 與 itemBuilder ,其余就是配置樣式, itemBuilder 需要返回一個(gè) widget ,當(dāng)然了,每個(gè) ListView 都有其對(duì)應(yīng)的 item ,在里面的方法中編寫(xiě) widget 即可
與 ListView 類(lèi)似,但是需要有一個(gè) delegate 類(lèi),作用是設(shè)置有多少列,每一列之間的間距是多少
GridView 沒(méi)有 build , children 表示所有的子 view
最常用的控件之一,有非常多的樣式, Flutter 中通常是使用裝飾器來(lái)處理控件的,如背景使用 BoxDecoration , TextFiled 使用 InputDecoration ; 使用如下