Flutter onTap中让你脱颖而出的5条规则

 更新时间:2023年11月08日 10:12:06   作者:杭州程序员张张  
这篇文章主要为大家介绍了Flutter onTap中让你脱颖而出的5条规则,小事情决定了你的熟练程度,这些小细节的有趣之处在于它们的丰富性

引言

小事情决定了你的熟练程度,这些小细节的有趣之处在于它们的丰富性。您将在代码库中的数百个位置遇到 onTap 事件。增强它们可以对代码的可维护性和最终用户体验产生重大的积极影响。

onTap 就是这样一个微小但丰富的东西——我们在每个屏幕上都使用它。这纯粹是关于那些 onTap 事件:该做和不该做。

规则 1:小部件不应实现 onTap 逻辑

顾名思义,小部件是在屏幕上绘制的一块 UI,它应该对业务逻辑一无所知。如果需要,它可以将事件传递给其父级。做到这一点的最佳方法是使用函数作为构造函数参数。

要点:不要在小部件内创建匿名函数来编写业务逻辑。相反,甚至可以将 onTap 传递到小部件之外,并让父级处理它。

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

规则 2:onTap 函数应该可为 null

作为 UI 的一部分,小部件应该是可重用的。不同的用例可能需要也可能不需要其 onTap 功能。因为它存在的主要原因是在屏幕上绘制而不是向其父级或控制器发送事件,所以它应该能够在有或没有 onTap 事件的情况下存在。

要点:使来自小部件的所有事件函数都可以为 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(
      ...
    ),
  );
}

规则 3:UI 必须对逻辑一无所知,即使是指示性意义上的也不行

即使在使用最佳实践之后,一个常见的错误是命名指示业务逻辑的 UI 事件函数。银行应用程序中的小部件应该不知道它属于银行应用程序,并且只有足够的数据来绘制它自己和它的孩子。换句话说,一个小部件应该是美丽而愚蠢的。

要点:命名 UI 事件函数以指示事件,而不是指示底层业务逻辑。将这样的函数命名为 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() {
    ...
  }
}

规则 4:尽可能传递模型

这一点不仅限于 UI,也适用于所有函数。每当您需要传递一些数据作为参数时,请尽量传递整个模型,而不仅仅是一个 ID 或名称。这是一个很好的做法,可以在将来业务逻辑扩展或更改时尽量减少代码更改。

要点:将模型作为参数而不是 ID 传递给函数。

// DON'T
void onTapMyWidget(int subjectId) {
  ...
}
// DO
void onTapMyWidget(Subject subject) {
  ...
}

规则 5:始终指定 HitTestBehavior

使用 GestureDetector 进行点击时,不要忘记将 behavior 添加到您的小部件中。此属性指定点击(点击)如何传播到子窗口小部件。在大多数情况下,您将使用 HitTestBehavior.opaque ,但我建议您应该查看 flutter.dev 上的简短描述以了解情况。

要点:通过指定小部件的点击行为来绝对控制小部件的子部件。

class MyWidget extends StatelessWidget {
  ...
  @override
  Widget build(BuildContext context) => GestureDetector(
    onTap: onTap,
    behavior: HitTestBehavior.opaque,
    child: Container(
      ...
    ),
  );
}

以上就是Flutter onTap中让你脱颖而出的5条规则的详细内容,更多关于Flutter onTap规则的资料请关注脚本之家其它相关文章!

相关文章

  • 学习Android自定义Spinner适配器

    学习Android自定义Spinner适配器

    这篇文章主要为大家详细介绍了学习Android自定义Spinner适配器的相关资料,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Retrofit Rxjava实现图片下载、保存并展示实例

    Retrofit Rxjava实现图片下载、保存并展示实例

    本篇文章主要介绍了Retrofit Rxjava实现图片下载、保存并展示实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 浅析Android中getWidth()和getMeasuredWidth()的区别

    浅析Android中getWidth()和getMeasuredWidth()的区别

    这篇文章主要介绍了浅析Android中getWidth()和getMeasuredWidth()的区别 ,getMeasuredWidth()获取的是view原始的大小,getWidth()获取的是这个view最终显示的大小,具体区别介绍大家参考下本文
    2018-04-04
  • 基于Android SQLite的升级详解

    基于Android SQLite的升级详解

    本篇文章是对Android SQLite的升级进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • Flutter 快速实现聊天会话列表效果示例详解

    Flutter 快速实现聊天会话列表效果示例详解

    这篇文章主要为大家介绍了Flutter 快速实现聊天会话列表效果示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画

    Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画

    这篇文章主要介绍了Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-01-01
  • Android Studio 3.6中使用视图绑定替代 findViewById的方法

    Android Studio 3.6中使用视图绑定替代 findViewById的方法

    从 Android Studio 3.6 开始,视图绑定能够通过生成绑定对象来替代 findViewById,从而可以帮您简化代码、移除 bug,并且从 findViewById 的模版代码中解脱出来,今天通过本文给大家介绍使用视图绑定替代 findViewById的方法,感兴趣的朋友一起看看吧
    2020-03-03
  • Android开发自学路线图

    Android开发自学路线图

    这篇文章主要介绍了Android开发自学路线图,本文讲解的路线图分为JAVA、Android基础、Web基础、Android项目4部份,是一个入门级学习路线图,需要的朋友可以参考下
    2015-04-04
  • Android使用Room数据库解决本地持久化的操作

    Android使用Room数据库解决本地持久化的操作

    Room 是一个持久性库,属于 Android Jetpack 的一部分,Room 是 SQLite 数据库之上的一个抽象层,Room 并不直接使用 SQLite,而是负责简化数据库设置和配置以及与数据库交互方面的琐碎工作,本文介绍了Android使用Room数据库解决本地持久化的操作,需要的朋友可以参考下
    2024-09-09
  • Android中默认系统的声音/大小修改和配置详解

    Android中默认系统的声音/大小修改和配置详解

    这篇文章主要给大家介绍了关于Android中默认系统的声音/大小修改和配置的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-11-11

最新评论