学习Flutter,你需要了解的Dart 编码规范

本文介绍了Dart编程中的各种最佳实践,包括命名约定(如使用小写下划线代替驼峰命名法),导入路径推荐,if语句的使用,文档注释的清晰性,以及避免常见错误如null值处理和字符串连接方式。此外,还提及了如何组织代码结构和提供有效的学习资源链接。
摘要由CSDN通过智能技术生成

DO: 将引用使用as转换的名字也应该是小写下划线

import ‘dart:math’ as math;
import ‘package:angular_components/angular_components’
as angular_components;
import ‘package:js/js.dart’ as js;

import ‘dart:math’ as Math;
import ‘package:angular_components/angular_components’
as angularComponents;
import ‘package:js/js.dart’ as JS;

DO: 变量名、方法、参数名都应该是小写开头的驼峰命名法

var item;

HttpRequest httpRequest;

void align(bool clearItems) {
// …
}

const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp(‘^([a-z]+):’);

class Dice {
static final numberGenerator = Random();
}

const PI = 3.14;
const DefaultTimeout = 1000;
final URL_SCHEME = RegExp(‘^([a-z]+):’);

class Dice {
static final NUMBER_GENERATOR = Random();
}

花括号

DO: 只有一个if语句且没有else的时候,并且在一行内能够很好的展示,就可以不用花括号

if (arg == null) return defaultValue;

但是如果一行内展示比较勉强的话,就需要用花括号了:

if (overflowChars != other.overflowChars) {
return overflowChars < other.overflowChars;
}

if (overflowChars != other.overflowChars)
return overflowChars < other.overflowChars;

文档规范

DO: 在dart的注释中,更加推荐使用///而非//

/// The number of characters in this chunk when unsplit.
int get length => …

// The number of characters in this chunk when unsplit.
int get length => …

至于为什么要这样做,官方表示是由于历史原因以及他们觉得这个在某些情况下看起来更方便阅读。

DO: 文档注释应该以一句简明的话开头

/// Deletes the file at [path] from the file system.
void delete(String path) {

}

/// Depending on the state of the file system and the user’s permissions,
/// certain operations may or may not be possible. If there is no file at
/// [path] or it can’t be accessed, this function throws either [IOError]
/// or [PermissionError], respectively. Otherwise, this deletes the file.
void delete(String path) {

}

DO: 将注释的第一句与其他内容分隔开来

/// Deletes the file at [path].
///
/// Throws an [IOError] if the file could not be found. Throws a
/// [PermissionError] if the file is present but could not be deleted.
void delete(String path) {

}

/// Deletes the file at [path]. Throws an [IOError] if the file could not
/// be found. Throws a [PermissionError] if the file is present but could
/// not be deleted.
void delete(String path) {

}

DO: 使用方括号去声明参数、返回值以及抛出的异常

/// Defines a flag with the given name and abbreviation.
///
/// @param name The name of the flag.
/// @param abbr The abbreviation for the flag.
/// @returns The new flag.
/// @throws ArgumentError If there is already an option with
/// the given name or abbreviation.
Flag addFlag(String name, String abbr) => …

/// Defines a flag.
///
/// Throws an [ArgumentError] if there is already an option named [name] or
/// there is already an option using abbreviation [abbr]. Returns the new flag.
Flag addFlag(String name, String abbr) => …

使用规范

依赖

PREFER: 推荐使用相对路径导入依赖

如果项目结构如下:

my_package
└─ lib
├─ src
│ └─ utils.dart
└─ api.dart

想要在 api.dart 中导入 utils.dart

import ‘src/utils.dart’;

import ‘package:my_package/src/utils.dart’;

赋值

DO: 使用??将null值做一个转换

在dart中 ?? 操作符表示当一个值为空时会给它赋值 ?? 后面的数据

if (optionalThing?.isEnabled) {
print(“Have enabled thing.”);
}

optionalThing 为空的时候,上面就会有空指针异常了。

这里说明一下。 ?. 操作符相当于做了一次判空操作,只有当 optionalThing 不为空的时候才会调用 isEnabled 参数,当 optionalThing 为空的话默认返回null,用在if判断句中自然就不行了

下面是正确做法

// 如果为空的时候你想返回false的话:
optionalThing?.isEnabled ?? false;

// 如果为空的时候你想返回ture的话:
optionalThing?.isEnabled ?? true;

optionalThing?.isEnabled == true;

optionalThing?.isEnabled == false;

字符串

在dart中,不推荐使用 + 去连接两个字符串

DO: 使用回车键直接分隔字符串

raiseAlarm(
'ERROR: Parts of the spaceship are on fire. Other ’
‘parts are overrun by martians. Unclear which are which.’);

raiseAlarm('ERROR: Parts of the spaceship are on fire. Other ’ +
‘parts are overrun by martians. Unclear which are which.’);

PREFER: 使用${}来连接字符串与变量值

‘Hello, $name! You are ${year - birth} years old.’;

'Hello, ’ + name + ‘! You are ’ + (year - birth).toString() + ’ y…’;

集合

dart中创建空的可扩展 List 有两种方法: []List();创建空的 HashMap 有三种方法: {}, Map(),和 LinkedHashMap()

如果要创建不可扩展的列表或其他一些自定义集合类型,那么务必使用构造函数。

DO: 尽可能使用简单的字面量创建集合

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

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

当你想要指定类型的时候

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

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

DON’T: 不要使用.lenght的方法去表示一个集合是空的

if (lunchBox.isEmpty) return ‘so hungry…’;
if (words.isNotEmpty) return words.join(’ ');

if (lunchBox.length == 0) return ‘so hungry…’;
if (!words.isEmpty) return words.join(’ ');

CONSIDER: 考虑使用高阶方法转换序列

var aquaticNames = animals
.where((animal) => animal.isAquatic)
.map((animal) => animal.name);

AVOID: 避免使用带有函数字面量的Iterable.forEach()

forEach()函数在JavaScript中被广泛使用,因为内置的for-in循环不能达到你通常想要的效果。在Dart中,如果要迭代序列,那么惯用的方法就是使用循环。

for (var person in people) {

}

people.forEach((person) {

});

DON’T: 不要使用 List.from() 除非你打算更改结果的类型

有两种方法去获取 Iterable,分别是List.from()Iterable.toList()

// 创建一个List:
var iterable = [1, 2, 3];

// 输出"List":
print(iterable.toList().runtimeType);

// 创建一个List:
var iterable = [1, 2, 3];

// 输出"List":
print(List.from(iterable).runtimeType);

DO: 使用 whereType()去用类型过滤一个集合

var objects = [1, “a”, 2, “b”, 3];
var ints = objects.where((e) => e is int);

var objects = [1, “a”, 2, “b”, 3];
var ints = objects.where((e) => e is int).cast();

var objects = [1, “a”, 2, “b”, 3];
var ints = objects.whereType();

参数

DO: 使用 = 给参数设置默认值

void insert(Object item, {int at = 0}) { … }

void insert(Object item, {int at: 0}) { … }

DON’T: 不要将参数的默认值设置为 null

void error([String message]) {
stderr.write(message ?? ‘\n’);
}

void error([String message = null]) {
stderr.write(message ?? ‘\n’);
}

变量

AVOID: 避免存储可以计算的值

class Circle {
num _radius;
num get radius => _radius;
set radius(num value) {
_radius = value;
_recalculate();
}

num _area;
num get area => _area;

num _circumference;
num get circumference => _circumference;

Circle(this._radius) {
_recalculate();
}

void _recalculate() {
_area = pi * _radius * _radius;
_circumference = pi * 2.0 * _radius;
}
}

class Circle {
num radius;

Circle(this.radius);

num get area => pi * radius * radius;
num get circumference => pi * 2.0 * radius;
}

成员

DON’T: 不要写没必要的getter 和 setter

class Box {
var contents;
}

class Box {
var _contents;
get contents => _contents;
set contents(value) {
_contents = value;
}
}

构造函数

DO: 尽可能使用简单的初始化形式

class Point {
num x, y;
Point(num x, num y) {
this.x = x;
this.y = y;
}
}

class Point {
num x, y;
Point(this.x, this.y);
}

DON’T: 不要使用 new 来创建对象

dart中不需要new

Widget build(BuildContext context) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

2020面试真题解析
腾讯面试真题解析

阿里巴巴面试真题解析

字节跳动面试真题解析
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

gtp.com/2024/03/13/H4lCoPEF.jpg" />

总结

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的14套腾讯、字节跳动、阿里、百度等2021最新面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

[外链图片转存中…(img-UohyJuxu-1713586877140)]
[外链图片转存中…(img-djJ4igyw-1713586877140)]

[外链图片转存中…(img-Xasjh6wv-1713586877141)]

[外链图片转存中…(img-pVEbXDEP-1713586877142)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值