自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

超越基礎(chǔ):Flutter 中 onTap 事件的五條規(guī)則讓你脫穎而出

開(kāi)發(fā) 前端
小事情決定了你的熟練程度,這些小細(xì)節(jié)的有趣之處在于它們的豐富性。您將在代碼庫(kù)中的數(shù)百個(gè)位置遇到 onTap 事件。增強(qiáng)它們可以對(duì)代碼的可維護(hù)性和最終用戶(hù)體驗(yàn)產(chǎn)生重大的積極影響。

小事情決定了你的熟練程度,這些小細(xì)節(jié)的有趣之處在于它們的豐富性。您將在代碼庫(kù)中的數(shù)百個(gè)位置遇到 onTap 事件。增強(qiáng)它們可以對(duì)代碼的可維護(hù)性和最終用戶(hù)體驗(yàn)產(chǎn)生重大的積極影響。

onTap 就是這樣一個(gè)微小但豐富的東西——我們?cè)诿總€(gè)屏幕上都使用它。這純粹是關(guān)于那些 onTap 事件:該做和不該做。

規(guī)則 1:小部件不應(yīng)實(shí)現(xiàn) onTap 邏輯

顧名思義,小部件是在屏幕上繪制的一塊 UI,它應(yīng)該對(duì)業(yè)務(wù)邏輯一無(wú)所知。如果需要,它可以將事件傳遞給其父級(jí)。做到這一點(diǎn)的最佳方法是使用函數(shù)作為構(gòu)造函數(shù)參數(shù)。

要點(diǎn):不要在小部件內(nèi)創(chuàng)建匿名函數(shù)來(lái)編寫(xiě)業(yè)務(wù)邏輯。相反,甚至可以將 onTap 傳遞到小部件之外,并讓父級(jí)處理它。

// DON'T

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) => GestureDetector(
    onTap: () {
      debugPrint('MyWidget onTap called');
      fetchFromServer();
    },
    child: Container(
      width: 100,
      height: 100,
      color: Colors.orange,
    ),
  );
}
// DO

class 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,
    ),
  );
}

規(guī)則 2:onTap 函數(shù)應(yīng)該可為 null

作為 UI 的一部分,小部件應(yīng)該是可重用的。不同的用例可能需要也可能不需要其 onTap 功能。因?yàn)樗嬖诘闹饕蚴窃谄聊簧侠L制而不是向其父級(jí)或控制器發(fā)送事件,所以它應(yīng)該能夠在有或沒(méi)有 onTap 事件的情況下存在。

要點(diǎn):使來(lái)自小部件的所有事件函數(shù)都可以為 null。

// DON'T

class MyWidget extends StatelessWidget {

  const MyWidget({required this.onTap});

  final void Function() onTap;

  @override
  Widget build(BuildContext context) => GestureDetector(
    onTap: onTap,
    child: Container(
      ...
    ),
  );
}
// DO

class MyWidget extends StatelessWidget {

  const MyWidget({this.onTap});

  final void Function()? onTap;

  @override
  Widget build(BuildContext context) => GestureDetector(
    onTap: onTap,
    child: Container(
      ...
    ),
  );
}

規(guī)則 3:UI 必須對(duì)邏輯一無(wú)所知,即使是指示性意義上的也不行

即使在使用最佳實(shí)踐之后,一個(gè)常見(jiàn)的錯(cuò)誤是命名指示業(yè)務(wù)邏輯的 UI 事件函數(shù)。銀行應(yīng)用程序中的小部件應(yīng)該不知道它屬于銀行應(yīng)用程序,并且只有足夠的數(shù)據(jù)來(lái)繪制它自己和它的孩子。換句話(huà)說(shuō),一個(gè)小部件應(yīng)該是美麗而愚蠢的。

要點(diǎn):命名 UI 事件函數(shù)以指示事件,而不是指示底層業(yè)務(wù)邏輯。將這樣的函數(shù)命名為 onTapRegisterButton() 比 register() 更好。

// DON'T

class MyScreen extends StatelessWidget {

  ...

  @override
  Widget build(BuildContext context) => Scaffold(
    body: MyWidget(
      onTap: controller.fetchData,
    );
  );
}
// DO

class MyScreen extends StatelessWidget {

  ...

  @override
  Widget build(BuildContext context) => Scaffold(
    body: MyWidget(
      onTap: controller.onTapMyWidget,
    );
  );
}

class MyScreenController {

  ...

  void onTapMyWidget() {
    _fetchData()
  }

  void _fetchData() {
    ...
  }

}

規(guī)則 4:盡可能傳遞模型

這一點(diǎn)不僅限于 UI,也適用于所有函數(shù)。每當(dāng)您需要傳遞一些數(shù)據(jù)作為參數(shù)時(shí),請(qǐng)盡量傳遞整個(gè)模型,而不僅僅是一個(gè) ID 或名稱(chēng)。這是一個(gè)很好的做法,可以在將來(lái)業(yè)務(wù)邏輯擴(kuò)展或更改時(shí)盡量減少代碼更改。

要點(diǎn):將模型作為參數(shù)而不是 ID 傳遞給函數(shù)。

// DON'T

void onTapMyWidget(int subjectId) {
  ...
}
// DO

void onTapMyWidget(Subject subject) {
  ...
}

規(guī)則 5:始終指定 HitTestBehavior

使用 GestureDetector 進(jìn)行點(diǎn)擊時(shí),不要忘記將 behavior 添加到您的小部件中。此屬性指定點(diǎn)擊(點(diǎn)擊)如何傳播到子窗口小部件。在大多數(shù)情況下,您將使用 HitTestBehavior.opaque ,但我建議您應(yīng)該查看 flutter.dev 上的簡(jiǎn)短描述以了解情況。

要點(diǎn):通過(guò)指定小部件的點(diǎn)擊行為來(lái)絕對(duì)控制小部件的子部件。

class MyWidget extends StatelessWidget {

  ...

  @override
  Widget build(BuildContext context) => GestureDetector(
    onTap: onTap,
    behavior: HitTestBehavior.opaque,
    child: Container(
      ...
    ),
  );
}
責(zé)任編輯:華軒 來(lái)源: 獨(dú)立開(kāi)發(fā)者張張
相關(guān)推薦

2023-11-04 12:08:40

Flutter事件

2014-02-24 13:55:47

簡(jiǎn)歷簡(jiǎn)歷技巧

2021-08-17 07:15:16

Github開(kāi)源項(xiàng)目

2024-06-20 09:44:19

Vars()函數(shù)Python工具

2016-05-12 13:51:05

IBM大型機(jī)混合云

2009-04-13 10:52:03

視頻面試求職技巧

2012-08-08 10:00:17

面試技術(shù)

2015-03-06 09:21:41

APP

2013-03-25 16:39:42

華為BYOD解決方案

2018-06-03 00:16:36

阿里巴巴技術(shù)面試

2015-08-06 10:03:03

云計(jì)算云計(jì)算認(rèn)證云遷移

2013-08-27 15:45:37

App應(yīng)用商店ASO應(yīng)用商店優(yōu)化App營(yíng)銷(xiāo)推廣

2020-03-13 13:45:41

前端面試Web

2009-09-10 09:48:25

IT職場(chǎng)

2011-12-27 15:02:37

云計(jì)算

2023-09-01 10:43:22

IT外包企業(yè)

2012-04-28 14:29:36

App Store沖榜策略排行榜規(guī)則

2016-12-16 18:40:08

移動(dòng)開(kāi)發(fā)蘋(píng)果應(yīng)用

2017-05-02 14:40:20

程序員

2020-12-16 19:25:50

數(shù)據(jù)科學(xué)數(shù)據(jù)科學(xué)家大數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)