小事情決定了你的熟練程度,這些小細節的有趣之處在于它們的豐富性。您將在代碼庫中的數百個位置遇到 onTap 事件。增強它們可以對代碼的可維護性和最終用戶體驗產生重大的積極影響。
onTap 就是這樣一個微小但豐富的東西——我們在每個屏幕上都使用它。這純粹是關于那些 onTap 事件:該做和不該做。
顧名思義,小部件是在屏幕上繪制的一塊 UI,它應該對業務邏輯一無所知。如果需要,它可以將事件傳遞給其父級。做到這一點的最佳方法是使用函數作為構造函數參數。
要點:不要在小部件內創建匿名函數來編寫業務邏輯。相反,甚至可以將 onTap 傳遞到小部件之外,并讓父級處理它。
// DON'Tclass MyWidget extends StatelessWidget { @override Widget build(BuildContext context) => GestureDetector( onTap: () { debugPrint('MyWidget onTap called'); fetchFromServer(); }, child: Container( width: 100, height: 100, color: Colors.orange, ), );}
// DOclass MyWidget extends StatelessWidget { const MyWidget({this.onTap}); final void Function()? onTap; @override Widget build(BuildContext context) => GestureDetector( onTap: onTap, child: Container( width: 100, height: 100, color: Colors.orange, ), );}
作為 UI 的一部分,小部件應該是可重用的。不同的用例可能需要也可能不需要其 onTap 功能。因為它存在的主要原因是在屏幕上繪制而不是向其父級或控制器發送事件,所以它應該能夠在有或沒有 onTap 事件的情況下存在。
要點:使來自小部件的所有事件函數都可以為 null。
// DON'Tclass MyWidget extends StatelessWidget { const MyWidget({required this.onTap}); final void Function() onTap; @override Widget build(BuildContext context) => GestureDetector( onTap: onTap, child: Container( ... ), );}
// DOclass MyWidget extends StatelessWidget { const MyWidget({this.onTap}); final void Function()? onTap; @override Widget build(BuildContext context) => GestureDetector( onTap: onTap, child: Container( ... ), );}
即使在使用最佳實踐之后,一個常見的錯誤是命名指示業務邏輯的 UI 事件函數。銀行應用程序中的小部件應該不知道它屬于銀行應用程序,并且只有足夠的數據來繪制它自己和它的孩子。換句話說,一個小部件應該是美麗而愚蠢的。
要點:命名 UI 事件函數以指示事件,而不是指示底層業務邏輯。將這樣的函數命名為 onTapRegisterButton() 比 register() 更好。
// DON'Tclass MyScreen extends StatelessWidget { ... @override Widget build(BuildContext context) => Scaffold( body: MyWidget( onTap: controller.fetchData, ); );}
// DOclass MyScreen extends StatelessWidget { ... @override Widget build(BuildContext context) => Scaffold( body: MyWidget( onTap: controller.onTapMyWidget, ); );}class MyScreenController { ... void onTapMyWidget() { _fetchData() } void _fetchData() { ... }}
這一點不僅限于 UI,也適用于所有函數。每當您需要傳遞一些數據作為參數時,請盡量傳遞整個模型,而不僅僅是一個 ID 或名稱。這是一個很好的做法,可以在將來業務邏輯擴展或更改時盡量減少代碼更改。
要點:將模型作為參數而不是 ID 傳遞給函數。
// DON'Tvoid onTapMyWidget(int subjectId) { ...}
// DOvoid onTapMyWidget(Subject subject) { ...}
使用 GestureDetector 進行點擊時,不要忘記將 behavior 添加到您的小部件中。此屬性指定點擊(點擊)如何傳播到子窗口小部件。在大多數情況下,您將使用 HitTestBehavior.opaque ,但我建議您應該查看 flutter.dev 上的簡短描述以了解情況。
要點:通過指定小部件的點擊行為來絕對控制小部件的子部件。
class MyWidget extends StatelessWidget { ... @override Widget build(BuildContext context) => GestureDetector( onTap: onTap, behavior: HitTestBehavior.opaque, child: Container( ... ), );}
本文鏈接:http://www.www897cc.com/showinfo-26-17246-0.html超越基礎:Flutter 中 onTap 事件的五條規則讓你脫穎而出
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: ListUtils技巧大全:提升你的Java列表操作效率
下一篇: JVM 解釋和編譯指南