Flutter代码规范
Posted Flutter入门
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter代码规范相关的知识,希望对你有一定的参考价值。
之前开Flutter-go的代码,有代码规范,再看其他的大多都是这样的,特此分享出来,选了其中常见的一些问题。
更多移步github: https://github.com/alibaba/flutter-go/blob/master/Flutter_Go%20代码开发规范.md
大驼峰
类、枚举、typedef和类型参数
class SliderMenu { ... }
class HttpRequest { ... }
typedef Predicate = bool Function<T>(T value);
使用小写加下划线来命名库和源文件
library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';
使用小写加下划线来命名导入前缀
import 'dart:math' as math;
import 'package:angular_components/angular_components'
as angular_components;
import 'package:js/js.dart' as js;
优先使用小驼峰法作为常量命名
const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}
尽可能使用集合字面量
如果要创建一个不可增长的列表,或者其他一些自定义集合类型,那么无论如何,都要使用构造函数。
var points = [];
var addresses = {};
var lines = <Lines>[];
不推荐如下写法:
var points = List();
var addresses = Map();
考虑使用高阶方法转换序列
如果有一个集合,并且希望从中生成一个新的修改后的集合,那么使用.map()、.where()和Iterable上的其他方便的方法通常更短,也更具有声明性
var aquaticNames = animals
.where((animal) => animal.isAquatic)
.map((animal) => animal.name);
避免使用带有函数字面量的Iterable.forEach()
在Dart中,如果你想遍历一个序列,惯用的方法是使用循环。
for (var person in people) {
...
}
不要使用List.from(),除非打算更改结果的类型
给定一个迭代,有两种明显的方法可以生成包含相同元素的新列表
var copy1 = iterable.toList();
var copy2 = List.from(iterable);
明显的区别是第一个比较短。重要的区别是第一个保留了原始对象的类型参数
// Creates a List<int>:
var iterable = [1, 2, 3];
// Prints "List<int>":
print(iterable.toList().runtimeType);
// Creates a List<int>:
var iterable = [1, 2, 3];
// Prints "List<dynamic>":
print(List.from(iterable).runtimeType);
不要使用显式默认值null
如果参数是可选的,但没有给它一个默认值,则语言隐式地使用null作为默认值,因此不需要编写它
不推荐如下写法:
void error([String message = null]) {
stderr.write(message ?? '\n');
}
不要显式地将变量初始化为空
在Dart中,未显式初始化的变量或字段自动被初始化为null。不要多余赋值null
不推荐如下写法:
int _nextId = null;
class LazyId {
int _id = null;
int get id {
if (_nextId == null) _nextId = 0;
if (_id == null) _id = _nextId++;
return _id;
}
}
避免储存你能计算的东西
在设计类时,您通常希望将多个视图公开到相同的底层状态。通常你会看到在构造函数中计算所有视图的代码,然后存储它们:
应该避免的写法:
class Circle {
num radius;
num area;
num circumference;
Circle(num radius)
: radius = radius,
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;
}
尽可能使用初始化的形式
class Point {
num x, y;
Point(this.x, this.y);
}
不要使用new
Dart2使new 关键字可选
推荐写法:
Widget build(BuildContext context) {
return Row(
children: [
RaisedButton(
child: Text('Increment'),
),
Text('Click!'),
],
);
}
异步
优先使用async/await代替原始的futures
async/await语法提高了可读性,允许你在异步代码中使用所有Dart控制流结构。
Future<int> countActivePlayers(String teamName) async {
try {
var team = await downloadTeam(teamName);
if (team == null) return 0;
var players = await team.roster;
return players.where((player) => player.isActive).length;
} catch (e) {
log.error(e);
return 0;
}
}
以上是关于Flutter代码规范的主要内容,如果未能解决你的问题,请参考以下文章
在 webview_flutter 中启用捏合和缩放,在哪里添加代码片段 [this.webView.getSettings().setBuiltInZoomControls(true);]
Flutterflutter doctor 报错Android license status unknown. Run `flutter doctor --android-licenses‘(代码片段
flutter解决 dart:html 只支持 flutter_web 其他平台编译报错 Avoid using web-only libraries outside Flutter web(代码片段
Flutter 报错 DioError [DioErrorType.DEFAULT]: Bad state: Insecure HTTP is not allowed by platform(代码片段