網站首頁 編程語言 正文
交互
當小部件的狀態發生變化時,狀態對象調用setState()來告訴框架重新繪制小部件 創建一個自定義的有狀態小部件。將用一個自定義的有狀態小部件替換兩個無狀態小部件-紅色實心星形圖標及其旁邊的數字計數-小部件管理一行,其中包含兩個子小部件:IconButton和Text。
class FavoriteWidget extends StatefulWidget {
@override
_FavoriteWidgetState createState() => new _FavoriteWidgetState();
}
要創建自定義的有狀態小部件,需要創建兩個類:StatefulWidget和State state對象包含小部件的狀態和build()方法。
要實現自定義有狀態小部件,需要創建兩個類: 定義從StatefulWidget繼承的小部件類 包含小部件狀態并定義小部件build()方法的類。它繼承自State 本節介紹如何為Lakes應用程序構建名為FavoriteWidget的有狀態Widget。第一步是選擇如何管理FavoriteWidgets的狀態。
步驟1:確定哪個對象管理小部件的狀態 小部件的狀態可以通過多種方式進行管理,但在我們的示例中,小部件本身(FavoriteWidget)將管理自己的狀態。在本例中,切換星形圖標是一個獨立的操作,不會影響父窗口小部件或其他用戶界面,因此小部件可以在內部處理自己的狀態。
步驟2:創建StatefulWidget的子類 FavoriteWidget類管理自己的狀態,因此它重寫createState()以創建狀態對象??蚣茉跇嫿ㄐ〔考r調用createState()。createState()創建了FavoriteWidgetState的一個實例,將在下一步中實現它。
new Icon(
Icons.star,
color: Colors.red[500],
),
new Text('41')
小工具管理其狀態
有時,小部件最好在內部管理其狀態。例如,當ListView的內容超過渲染框時,ListView會自動滾動。大多數使用ListView的開發人員不希望管理ListView的滾動行為,因此ListView本身管理其滾動偏移。
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的狀態 Definition_Active:確定框當前顏色的布爾值 定義_當框被單擊時,handleTap()函數會更新,并調用setState()更新UI
widget的state
實現小部件的所有交互行為 對于父窗口小部件,管理狀態并告訴其子窗口小部件何時更新通常是最有意義的。例如,IconButton允許將圖標視為可單擊的按鈕。IconButton是一個無狀態小部件,因為我們認為父小部件需要知道按鈕是否被單擊以采取相應的操作。 在下面的示例中,TapboxB通過回調將其狀態導出到其父級。因為TapboxB不管理任何狀態,所以它的父類是StatelessWidget。
ParentWidgetState類: 管理TapboxB_活動狀態 Implementation_ HandleTapboxChanged(),單擊框時調用的方法 當狀態更改時,調用setState()更新UI TapboxB類: 繼承StatelessWidget類,因為所有狀態都由其父控件處理 當檢測到單擊時,它會通知父控件
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,
),
);
}
}
對于某些小部件,mashup管理方法是最有意義的。在這種情況下,有狀態小部件管理一些狀態,而父小部件管理其他狀態。 在TapboxC示例中,單擊時,框周圍會出現一個深綠色邊框。單擊時,邊框將消失,框的顏色將更改。TapboxC將_活動狀態導出到其父控件,但內部管理_突出顯示狀態。此示例有兩個狀態對象_PrentWidgetState和_TapboxCState
class _TapboxCState extends State<TapboxC> {
bool _highlight = false;
void _handleTapDown(TapDownDetails details) {
setState(() {
_highlight = true;
});
}
ParentWidgetState對象: 管理_活動狀態 Implementation HandleTapboxChanged(),單擊該框時調用 當單擊框并_調用setState()以在活動狀態更改時更新UI時 _TapboxCState對象: 管理_突出顯示狀態。 手勢檢測器監聽所有敲擊事件。當用戶單擊時,它會添加高亮顯示(深綠色邊框);當用戶釋放時,高亮顯示將被刪除。 按下、抬起或取消時更新突出顯示狀態,調用setState()更新UI。 單擊時,狀態更改將傳遞給父控件
void _handleTapUp(TapUpDetails details) {
setState(() {
_highlight = false;
});
}
void _handleTapCancel() {
setState(() {
_highlight = false;
});
}
另一個實現可能會在保持活動狀態的同時將突出顯示的狀態導出到父窗口小部件。活動狀態是內部的,但如果你要求某人使用TapBox,他們可能會抱怨這沒有多大意義。開發人員只關心盒子是否處于活動狀態。開發人員可能不關心突出顯示是如何管理的,而是傾向于讓TapBox處理這些細節。
原文鏈接:https://juejin.cn/post/7178880372041515064
相關推薦
- 2023-01-11 ubuntu如何搭建vsftpd服務器_FTP服務器
- 2022-08-11 TypeScript中的裝飾器用法_基礎知識
- 2022-05-17 ubuntu Could NOT find CURL (missing: CURL_LIBRARY
- 2022-09-17 詳解redis集群的三種方式_Redis
- 2022-03-14 Macos怎么快速打開終端
- 2022-09-06 Golang實現http重定向https_Golang
- 2022-12-04 Python中的配對函數zip()解讀_python
- 2022-04-09 node sass下載失敗解決方案
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支