Dart 2.1 的细节变化笔记总结(一)

编码风格默认规范

UpperCamelCase 每个单词的首字母都大写,包含第一个单词。

lowerCamelCase 除了第一个字母始终是小写(即使是缩略词),每个单词的首字母都大写。

lowercase_with_underscores 只是用小写字母单词,即使是缩略词,并且单词之间使用 _ 连接。

UpperCamelCase 风格

  1. 使用 UpperCamelCase 风格命名类型。

Classes(类名)、 enums(枚举类型)、 typedefs(类型定义)、以及 type parameters(类型参数)应该把每个单词的首字母都大写(包含第一个单词),不使用分隔符。

PS:这里包括使用元数据注解的类。,如果注解类的构造函数是无参函数,则可以使用一个 lowerCamelCase 风格的常量来初始化这个注解。

  1. 使用 UpperCamelCase 风格类型作为扩展名

extension MyFancyList<T> on List<T> { ... }

lowercase_with_underscores 风格

  1. 文件夹源文件中使用 lowercase_with_underscores 方式命名。

library peg_parser.source_scanner;
import 'file_system.dart';
import 'slider_menu.dart';

  1. lowercase_with_underscores 风格命名库和源文件名。

DO name import prefixes using lowercase_with_underscores.

import 'dart:math' as math;
import 'package:angular_components/angular_components' as angular_components;
import 'package:js/js.dart' as js;

lowerCamelCase 风格

  1. 类成员、顶级定义、变量、参数以及命名参数等 除了第一个单词,每个单词首字母都应大写,并且不使用分隔符

var count = 3;
HttpRequest httpRequest;
void align(bool clearItems) {
// ...
}

  1. 推荐 使用 lowerCamelCase 来命名常量。

const pi = 3.14;
const defaultTimeout = 1000;
final urlScheme = RegExp('^([a-z]+):');
class Dice {
static final numberGenerator = Random();
}

把超过两个字母的首字母大写缩略词和缩写词当做一般单词来对待

class HttpConnection {}
class DBIOPort {}
class TVVcr {}
class MrRogers {}
var httpRequest = ...

var uiHandler = ...
Id id;

使用 _, __, etc. 作为无用回调参数

futureOfVoid.then((_) {
print('Operation complete.');
});

顺序

要 把 “dart:” 导入语句放到其他导入语句之前。
要 把 “package:” 导入语句放到项目相关导入语句之前。

import 'dart:async';
import 'dart:html';

import 'package:bar/bar.dart';
import 'package:foo/foo.dart';
import 'package:bar/bar.dart';
import 'package:foo/foo.dart';

import 'util.dart';

要 把导出(export)语句作为一个单独的部分放到所有导入语句之后。

import 'src/error.dart';
import 'src/foo_bar.dart';

export 'src/error.dart';

避免 单行超过 80 个字符。

对所有流控制结构使用花括号。

变量

  1. 所有变量引用的都是 对象,每个对象都是一个 的实例。数字、函数以及 null 都是对象。除去 null 以外(如果你开启了 空安全), 所有的类都继承于 [Object][] 类。
  2. 在声明变量时指定类型是可选的,因为 Dart 可以进行类型推断
  3. 开启了 空安全,变量在未声明为可空类型时不能为 null。你可以通过在类型后加上问号 (?) 将类型声明为可空。例如,int? 类型的变量可以是整形数字或 null。如果你 明确知道 一个表达式不会为空,但 Dart 不这么认为时,你可以在表达式后添加 ! 来断言表达式不为空(为空时将抛出异常)。例如:int x = nullableButNotNullInt!
  4. 显式地声明允许任意类型,使用 Object?(如果你 开启了空安全)、 Object 或者 特殊类型 dynamic 将检查延迟到运行时进行。
  5. Dart 支持泛型,比如 List<int>(表示一组由 int 对象组成的列表)或 List<Object>(表示一组由任何类型对象组成的列表)。
  6. Dart 支持顶级函数(例如 main 方法),同时还支持定义属于类或对象的函数(即 静态 和 实例方法)。你还可以在函数中定义函数(嵌套 或 局部函数)。
  7. Dart 支持顶级函数(例如 main 方法),同时还支持定义属于类或对象的函数(即 静态 和 实例方法)。你还可以在函数中定义函数(嵌套 或 局部函数)。
  8. Dart 支持顶级 变量,以及定义属于类或对象的变量(静态和实例变量)。实例变量有时称之为域或属性。
  9. Dart 没有类似于 Java 那样的 public、protected 和 private 成员访问限定符。如果一个标识符以下划线 (_) 开头则表示该标识符在库内是私有的。
var name = 'Bob';
Object name = 'Bob';
String name = 'Bob';

10.默认值

在 Dart 中,未初始化的变量拥有一个默认的初始化值:null。(如果你未迁移至 空安全,所有变量都为可空类型。)即便数字也是如此,因为在 Dart 中一切皆为对象,数字也不例外。

int? lineCount;
assert(lineCount == null);

assert() 的调用将会在生产环境的代码中被忽略掉。在开发过程中,assert(condition) 将会在 条件判断 为 false 时抛出一个异常。

  1. Late variables 和 Kotlin 很像,延迟初始化
late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}
  1. Final 和Const

如果你不想更改一个变量,可以使用关键字 final 或者 const 修饰变量,这两个关键字可以替代 var 关键字或者加在一个具体的类型前。一个 final 变量只可以被赋值一次;一个 const 变量是一个编译时常量(const 变量同时也是 final 的)。顶层的 final 变量或者类的 final 变量在其第一次使用的时候被初始化。

const arr=[];
var arr2 = const[];
final foo = const[];

这三种区别,只能 arr2=[1];

  1. 内置类型
  • Numbers (int, double)

  • Strings (String)

  • Booleans (bool)

  • Lists (也被称为 arrays)

  • Sets (Set)

  • Maps (Map)

  • Runes (常用于在 Characters API 中进行字符替换)

  • Symbols (Symbol)

  • The value null (Null)

  • Object: The superclass of all Dart classes except Null.

  • Future and Stream: Used in asynchrony support.

  • Iterable: Used in for-in loops and in synchronous generator functions.

  • Never: Indicates that an expression can never successfully finish evaluating. Most often used for functions that always throw an exception.

  • dynamic: Indicates that you want to disable static checking. Usually you should use Object or Object? instead.

  • void: Indicates that a value is never used. Often used as a return type.

Dart2.1 int to double 小变化

看注释不解释

import 'dart:math' as math;

class Circle {
  double radius;

  Circle(this.radius);

  double get area => math.pi * math.pow(radius, 2);
}

void main() {
  // Before Dart 2.1, you had to provide a trailing `.0` – `42.0` – when
  // assigning to fields or parameters of type `double`.
  // A value like `42` was not allowed.

  print(Circle(2.0).area); // Before Dart 2.1, the trailing `.0` is required.

  // With Dart 2.1, you can provide whole-number values when assigning to
  // a double without the trailing `.0`.
  print(Circle(2).area); // Legal with Dart 2.1
}

mixin, with, on 的使用

mixin AnswerMixin {
  int get answer => 42;

  @override
  String toString() => '[ $runtimeType ]';
}

class Answer with AnswerMixin {}

void main() {
  print('''
*
* Simple usage of `mixin`
*
''');
  printAnswer(Answer(), 'Use `with` to include a mixin');

  print('''
*
* More advanced usage of `mixin`
*
''');
  printAnswer(
      LogAnswer(),
      'Include many mixins by separating with commas. '
      '`$LoggingAnswerMixin` prints every time `answer` is accessed.');

  print('''
*
* The order in which mixins are included matters.
*
''');

  printAnswer(LogVerifyAnswer(), 'In this case, log then verify.');
  printAnswer(VerifyLogAnswer(), 'In this case, verify then log.');

  print('''
*
* You can extend classes that include mixins, too.
*
''');

  printAnswer(DeltaLogVerifyAnswer(), 'Verify will fail.');
  printAnswer(DeltaLogVerifyAnswer(1), 'Verify will succeed.');
}

void printAnswer(AnswerMixin obj, String description) {
  print(obj);
  print('- $description');
  print('answer: ${obj.answer}');
  print('');
}

/// [LoggingAnswerMixin] can only be used as a mixin when the superclass
/// (or one of the mixins that comes before it in a "with" clause) implements
/// [AnswerMixin].
mixin LoggingAnswerMixin on AnswerMixin {
  @override
  int get answer {
    var value = super.answer;
    print('  LOG: `answer` property was accessed');
    return value;
  }
}

class LogAnswer with AnswerMixin, LoggingAnswerMixin {}

mixin VerifyingAnswerMixin on AnswerMixin {
  @override
  int get answer {
    var value = super.answer;
    if (value == 42) {
      print('  VERIFY: Invalid Result!');
    } else {
      print('  VERIFY: valid result');
    }
    return value;
  }
}

class LogVerifyAnswer
    with AnswerMixin, LoggingAnswerMixin, VerifyingAnswerMixin {}

class VerifyLogAnswer
    with AnswerMixin, VerifyingAnswerMixin, LoggingAnswerMixin {}

abstract class DeltaAnswer with AnswerMixin {
  final int delta;

  DeltaAnswer(this.delta);

  @override
  int get answer => super.answer + delta;
}

class DeltaLogVerifyAnswer extends DeltaAnswer
    with LoggingAnswerMixin, VerifyingAnswerMixin {
  DeltaLogVerifyAnswer([int delta = 0]) : super(delta);
}

结果,可以讨论下这里,确实有点不好理清逻辑

* * Simple usage of `mixin` *
[ Answer ]
- Use `with` to include a mixin
answer: 42
* * More advanced usage of `mixin` *
[ LogAnswer ]
- Include many mixins by separating with commas. `LoggingAnswerMixin` prints every time `answer` is accessed.
LOG: `answer` property was accessed
answer: 42
* * The order in which mixins are included matters. *
[ LogVerifyAnswer ]
- In this case, log then verify.
LOG: `answer` property was accessed
VERIFY: Invalid Result!
answer: 42
[ VerifyLogAnswer ]
- In this case, verify then log.
VERIFY: Invalid Result!
LOG: `answer` property was accessed
answer: 42
* * You can extend classes that include mixins, too. *
[ DeltaLogVerifyAnswer ]
- Verify will fail.
LOG: `answer` property was accessed
VERIFY: Invalid Result!
answer: 42
[ DeltaLogVerifyAnswer ]
- Verify will succeed.
LOG: `answer` property was accessed
VERIFY: valid result
answer: 43

所有语言课本上的开胃菜

void main() {
  var i = 20;
  print('fibonacci($i) = ${fibonacci(i)}');
}

/// Computes the nth Fibonacci number.
int fibonacci(int n) {
  return n < 2 ? n : (fibonacci(n - 1) + fibonacci(n - 2));
}

result

fibonacci(20) = 6765

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容