Flutter 最佳实践 - 05

原文 https://vipinvijayannair.medium.com/

前言

作者把工作中的经验这样了罗列,这是第 5 部分,持续更新。

正文

不要显式初始化变量 null

在 Dart 中,当没有指定变量的值时,变量会自动初始化为 null,因此添加 null 是不必要和多余的。

// Don't
int _val = null;


// Do
int? _val;

使用表达式函数主体

对于只包含一个表达式的函数,可以使用表达式函数。表达式函数使用 = > (箭头)符号。

// Don't
get name {
  return '$firstName $lastName';
}
Widget getLoading() {
  return CircularProgressIndicator(
    valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
  );
}

// Do
get name => '$firstName $lastName';
Widget getLoading() => CircularProgressIndicator(
  valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
);

使用级联运算符

如果我们想对同一个对象执行一系列操作,那么我们应该使用 Cascades (. .)操作符。

// Don't
var path = Path();
path.lineTo(0, size.height);
path.lineTo(size.width, size.height);
path.lineTo(size.width, 0);
path.close();

// Do
var path = Path()
..lineTo(0, size.height)
..lineTo(size.width, size.height)
..lineTo(size.width, 0)
..close();

使用 spread collections 分散收集

当现有项目已经存储在另一个集合中时,扩展集合语法将产生更简单的代码。

// Don't
var y = [4,5,6];
var x = [1,2];
x.addAll(y);

// Do
var y = [4,5,6];
var x = [1,2,...y]; // 1,2,4,5,6

使用 Literal 初始化可增长的集合。

// Good
var points = [];
var addresses = {};

// Bad
var points = List();
var addresses = Map();

// With type argument

// Good
var points = <Point>[];
var addresses = <String, Address>{};

// Bad
var points = List<Point>();
var addresses = Map<String, Address>();

在单独的文件中使用 Colors

尝试为应用程序在一个类中使用所有颜色,如果不使用本地化,也可以使用 String,这样无论何时添加本地化,都可以在一个位置找到所有字符串。

class AppColor {
  static const Color red = Color(0xFFFF0000);
  static const Color green = Color(0xFF4CAF50);
  static const Color errorRed = Color(0xFFFF6E6E);
}

使用 Dart Metrics

Flutter 代码结构的最佳实践之一是使用 Dart 代码度量。这是提高 Flutter 应用程序整体质量的理想方法。DCM (Dart Code Metrics)是一个静态程序分析工具,可以帮助开发人员监控和改进 Flutter 代码的整体质量。开发人员可以查看的各种指标包括许多参数、可执行代码行等等。在 Dart Code Metrics 官方文档中提到的一些 Flutter 最佳实践如下:

https://dartcodemetrics.dev

  • 避免使用 Border.all 构造函数
  • 避免不必要的 setState ()
  • 避免返回 widget
  • 更喜欢提取回调
  • 首选每个文件一个 widget
  • 首选 const 边界-半径

使用 Fittedbox widget 使 Flutter 布局响应

为了在 Flutter 实现响应式设计,我们可以利用 FittedBox widget 。FittedBox 是一个 Flutter widget ,它限制子 widget 在一定限制之后的大小增长。它根据可用的大小重新调整子组件的大小。例如,我们创建一个 container ,其中将显示用户输入的文本,如果用户输入一个长的文本字符串,则 container 的大小将超出允许的大小。但是,如果我们用 FittedBox 包装 container ,它将根据 container 的可用大小适合文本。如果文本超过使用 FittedBox 的 container 的设置大小,它将缩小文本大小以适应 container 内的大小。

Flutter 安全最佳实践

安全是任何移动应用程序不可或缺的一部分,尤其是在这个移动优先的技术时代。对于许多应用程序正常运行,他们需要许多用户的设备权限和敏感信息,他们的财务状况,偏好和其他因素。开发者有责任确保应用程序足够安全以保护这些信息。Flutter 提供了极好的安全性,下面是可以使用的最佳 Flutter 安全实践:

代码混淆

代码混淆是一种调整应用程序的二进制代码的方法,这使得人类很难理解它。这样做可以帮助保护你的应用程序免受逆向工程攻击。这有助于保证 API 密钥、函数名、类和其他重要字符串的安全。你可以通过代码混淆在编译的 Dart 代码中隐藏这些细节,为试图反向工程你的应用程序的攻击制造障碍。

  • 如何在 Flutter 中混淆代码?

使用 --split-debug-info 标志构建发布版本的 **--obfuscate**

这样做看起来像这样:

$ flutter build apk — obfuscate — split-debug-info=/<project-name>/<directory>

防止背景快照

一般来说,当你的应用程序在后台运行时,它会自动在任务切换器或多任务屏幕上显示应用程序的最后状态。当您希望查看不同应用程序上的最后一个活动是什么时,这非常有用; 但是,在某些时候,您不希望在任务切换器中披露屏幕信息。例如,你不希望你的银行账户信息显示在你的应用程序的屏幕上。您可以使用 secure_application Flutter 包来保护您的 Flutter 应用程序不受此类问题的影响。

https://pub.dev/packages/secure_application

如果该变量未在代码块内使用,请使用 _ (下划线)。

//Do
someFuture.then((_) => someFunc());

//Do not
someFuture.then((DATA_TYPE VARIABLE) => someFunc());

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~

猫哥课程


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://ducafecat.com

Last Updated:
Contributors: ducafecat