Flutter交互并使用小工具管理其狀態(tài)widget的state詳解
交互
當(dāng)小部件的狀態(tài)發(fā)生變化時(shí),狀態(tài)對(duì)象調(diào)用setState()來(lái)告訴框架重新繪制小部件 創(chuàng)建一個(gè)自定義的有狀態(tài)小部件。將用一個(gè)自定義的有狀態(tài)小部件替換兩個(gè)無(wú)狀態(tài)小部件-紅色實(shí)心星形圖標(biāo)及其旁邊的數(shù)字計(jì)數(shù)-小部件管理一行,其中包含兩個(gè)子小部件:IconButton和Text。
class FavoriteWidget extends StatefulWidget {
@override
_FavoriteWidgetState createState() => new _FavoriteWidgetState();
}
要?jiǎng)?chuàng)建自定義的有狀態(tài)小部件,需要?jiǎng)?chuàng)建兩個(gè)類:StatefulWidget和State state對(duì)象包含小部件的狀態(tài)和build()方法。
要實(shí)現(xiàn)自定義有狀態(tài)小部件,需要?jiǎng)?chuàng)建兩個(gè)類: 定義從StatefulWidget繼承的小部件類 包含小部件狀態(tài)并定義小部件build()方法的類。它繼承自State 本節(jié)介紹如何為L(zhǎng)akes應(yīng)用程序構(gòu)建名為FavoriteWidget的有狀態(tài)Widget。第一步是選擇如何管理FavoriteWidgets的狀態(tài)。
步驟1:確定哪個(gè)對(duì)象管理小部件的狀態(tài) 小部件的狀態(tài)可以通過(guò)多種方式進(jìn)行管理,但在我們的示例中,小部件本身(FavoriteWidget)將管理自己的狀態(tài)。在本例中,切換星形圖標(biāo)是一個(gè)獨(dú)立的操作,不會(huì)影響父窗口小部件或其他用戶界面,因此小部件可以在內(nèi)部處理自己的狀態(tài)。
步驟2:創(chuàng)建StatefulWidget的子類 FavoriteWidget類管理自己的狀態(tài),因此它重寫createState()以創(chuàng)建狀態(tài)對(duì)象??蚣茉跇?gòu)建小部件時(shí)調(diào)用createState()。createState()創(chuàng)建了FavoriteWidgetState的一個(gè)實(shí)例,將在下一步中實(shí)現(xiàn)它。
new Icon(
Icons.star,
color: Colors.red[500],
),
new Text('41')
小工具管理其狀態(tài)
有時(shí),小部件最好在內(nèi)部管理其狀態(tài)。例如,當(dāng)ListView的內(nèi)容超過(guò)渲染框時(shí),ListView會(huì)自動(dòng)滾動(dòng)。大多數(shù)使用ListView的開(kāi)發(fā)人員不希望管理ListView的滾動(dòng)行為,因此ListView本身管理其滾動(dòng)偏移。
class TapboxA extends StatefulWidget {
TapboxA({Key key}) : super(key: key);
@override
_TapboxAState createState() => new _TapboxAState();
}
class _TapboxAState extends State<TapboxA> {
bool _active = false;
void _handleTap() {
setState(() {
_active = !_active;
});
}
Widget build(BuildContext context) {
return new GestureDetector(
onTap: _handleTap,
child: new Container(
child: new Center(
child: new Text(
_active ? 'Active' : 'Inactive',
style: new TextStyle(fontSize: 32.0, color: Colors.white),
),
),
width: 200.0,
height: 200.0,
decoration: new BoxDecoration(
color: _active ? Colors.lightGreen[700] : Colors.grey[600],
),
),
);
}
}
_TapboxAState類: 管理TapboxA的狀態(tài) Definition_Active:確定框當(dāng)前顏色的布爾值 定義_當(dāng)框被單擊時(shí),handleTap()函數(shù)會(huì)更新,并調(diào)用setState()更新UI
widget的state
實(shí)現(xiàn)小部件的所有交互行為 對(duì)于父窗口小部件,管理狀態(tài)并告訴其子窗口小部件何時(shí)更新通常是最有意義的。例如,IconButton允許將圖標(biāo)視為可單擊的按鈕。IconButton是一個(gè)無(wú)狀態(tài)小部件,因?yàn)槲覀冋J(rèn)為父小部件需要知道按鈕是否被單擊以采取相應(yīng)的操作。 在下面的示例中,TapboxB通過(guò)回調(diào)將其狀態(tài)導(dǎo)出到其父級(jí)。因?yàn)門apboxB不管理任何狀態(tài),所以它的父類是StatelessWidget。
ParentWidgetState類: 管理TapboxB_活動(dòng)狀態(tài) Implementation_ HandleTapboxChanged(),單擊框時(shí)調(diào)用的方法 當(dāng)狀態(tài)更改時(shí),調(diào)用setState()更新UI TapboxB類: 繼承StatelessWidget類,因?yàn)樗袪顟B(tài)都由其父控件處理 當(dāng)檢測(cè)到單擊時(shí),它會(huì)通知父控件
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => new _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
bool _active = false;
void _handleTapboxChanged(bool newValue) {
setState(() {
_active = newValue;
});
}
@override
Widget build(BuildContext context) {
return new Container(
child: new TapboxB(
active: _active,
onChanged: _handleTapboxChanged,
),
);
}
}
混合管理
class ParentWidget extends StatefulWidget {
@override
_ParentWidgetState createState() => new _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
bool _active = false;
void _handleTapboxChanged(bool newValue) {
setState(() {
_active = newValue;
});
}
@override
Widget build(BuildContext context) {
return new Container(
child: new TapboxC(
active: _active,
onChanged: _handleTapboxChanged,
),
);
}
}
對(duì)于某些小部件,mashup管理方法是最有意義的。在這種情況下,有狀態(tài)小部件管理一些狀態(tài),而父小部件管理其他狀態(tài)。 在TapboxC示例中,單擊時(shí),框周圍會(huì)出現(xiàn)一個(gè)深綠色邊框。單擊時(shí),邊框?qū)⑾?,框的顏色將更改。TapboxC將_活動(dòng)狀態(tài)導(dǎo)出到其父控件,但內(nèi)部管理_突出顯示狀態(tài)。此示例有兩個(gè)狀態(tài)對(duì)象_PrentWidgetState和_TapboxCState
class _TapboxCState extends State<TapboxC> {
bool _highlight = false;
void _handleTapDown(TapDownDetails details) {
setState(() {
_highlight = true;
});
}
ParentWidgetState對(duì)象: 管理_活動(dòng)狀態(tài) Implementation HandleTapboxChanged(),單擊該框時(shí)調(diào)用 當(dāng)單擊框并_調(diào)用setState()以在活動(dòng)狀態(tài)更改時(shí)更新UI時(shí) _TapboxCState對(duì)象: 管理_突出顯示狀態(tài)。 手勢(shì)檢測(cè)器監(jiān)聽(tīng)所有敲擊事件。當(dāng)用戶單擊時(shí),它會(huì)添加高亮顯示(深綠色邊框);當(dāng)用戶釋放時(shí),高亮顯示將被刪除。 按下、抬起或取消時(shí)更新突出顯示狀態(tài),調(diào)用setState()更新UI。 單擊時(shí),狀態(tài)更改將傳遞給父控件
void _handleTapUp(TapUpDetails details) {
setState(() {
_highlight = false;
});
}
void _handleTapCancel() {
setState(() {
_highlight = false;
});
}
另一個(gè)實(shí)現(xiàn)可能會(huì)在保持活動(dòng)狀態(tài)的同時(shí)將突出顯示的狀態(tài)導(dǎo)出到父窗口小部件?;顒?dòng)狀態(tài)是內(nèi)部的,但如果你要求某人使用TapBox,他們可能會(huì)抱怨這沒(méi)有多大意義。開(kāi)發(fā)人員只關(guān)心盒子是否處于活動(dòng)狀態(tài)。開(kāi)發(fā)人員可能不關(guān)心突出顯示是如何管理的,而是傾向于讓TapBox處理這些細(xì)節(jié)。
以上就是Flutter交互并使用小工具管理其狀態(tài)widget的state詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter交互狀態(tài)管理widget state的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- flutter中的資源和圖片加載示例詳解
- flutter的導(dǎo)航和路由使用示例詳解
- Flutter實(shí)現(xiàn)固定header底部滑動(dòng)頁(yè)效果示例
- 大型項(xiàng)目里Flutter測(cè)試應(yīng)用實(shí)例集成測(cè)試深度使用詳解
- Flutter Widget移動(dòng)UI框架使用Material和密匙Key實(shí)戰(zhàn)
- Flutter項(xiàng)目手勢(shì)運(yùn)用及單獨(dú)指針消歧問(wèn)題解決方案
- Flutter框架解決盒約束widget和assets里加載資產(chǎn)技術(shù)
- Flutter 重構(gòu)屬性透?jìng)骷昂瘮?shù)透?jìng)魇褂檬纠?/a>
相關(guān)文章
Android跳轉(zhuǎn)三方應(yīng)用實(shí)例代碼
大家好,本篇文章主要講的是Android跳轉(zhuǎn)三方應(yīng)用實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Android中截取當(dāng)前屏幕圖片的實(shí)例代碼
該篇文章是說(shuō)明在Android手機(jī)或平板電腦中如何實(shí)現(xiàn)截取當(dāng)前屏幕的功能,并把截取的屏幕保存到SDCard中的某個(gè)目錄文件夾下面。實(shí)現(xiàn)的代碼如下:2013-08-08
Flutter實(shí)現(xiàn)牛頓擺動(dòng)畫效果的示例代碼
牛頓擺大家應(yīng)該都不陌生,也叫碰碰球、永動(dòng)球(理論情況下),那么今天我們用Flutter實(shí)現(xiàn)這么一個(gè)理論中的永動(dòng)球,可以作為加載Loading使用,需要的可以參考一下2022-04-04
Android 數(shù)據(jù)庫(kù)SQLite 寫入SD卡的方法
如果手機(jī)沒(méi)有root,數(shù)據(jù)庫(kù)文件是無(wú)法查看到的,不方便調(diào)試。最好的辦法是把數(shù)據(jù)庫(kù)寫進(jìn)SD卡。通過(guò)本文給大家介紹Android 數(shù)據(jù)庫(kù)SQLite 寫入SD卡的方法,需要的朋友參考下吧2016-04-04
Android中使用Theme來(lái)解決啟動(dòng)app時(shí)出現(xiàn)的空白屏問(wèn)題
相信大多數(shù)人一開(kāi)始都會(huì)對(duì)啟動(dòng)app的時(shí)候出現(xiàn)先白瓶或者黑屏然后才進(jìn)入第一個(gè)界面,例如:SplashActivity。那這是什么原因造成的呢?下面小編給大家介紹下2016-12-12
Android TextView中文本點(diǎn)擊文字跳轉(zhuǎn) (代碼簡(jiǎn)單)
用過(guò)微博Android手機(jī)端的朋友的都知道微博正文有時(shí)有一些高亮顯示的文本,如話題、提到的人等等,當(dāng)點(diǎn)擊這些文本時(shí)會(huì)跳到另外一個(gè)頁(yè)面(即另一個(gè)activity),下面就要來(lái)模仿微博的這個(gè)功能2016-01-01
淺析Android App的相對(duì)布局RelativeLayout
這篇文章主要介紹了Android App的相對(duì)布局RelativeLayout,文中舉了一個(gè)登錄界面的XML布局例子,非常直觀,需要的朋友可以參考下2016-04-04
Android WebView上實(shí)現(xiàn)JavaScript與Java交互
這篇文章主要介紹了Android WebView上實(shí)現(xiàn)JavaScript與Java交互 的相關(guān)資料,需要的朋友可以參考下2016-03-03

