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代码规范的主要内容,如果未能解决你的问题,请参考以下文章

php Yoast SEO规范输出的代码片段

php Yoast SEO规范输出的代码片段

在 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(代码片段