Flutter 踩坑之旅之 Dart 学习笔记(三)

Flutter 踩坑之旅之 Dart 学习笔记(三)


写在前面

本文是参考了 Dart 官网https://www.dartlang.org 的教程、参考的机翻以及对于其他语言学习的经验来翻译的本入门教程,译者精力和学历有限,如有不妥之处欢迎指正。

本文出于知识共享的目的,转载请注明出处,如果用于商用请联系 admin@jieec.cn

在线编译

DartPad https://dartpad.dartlang.org/

布尔型

Dart 用 bool 类表示布尔值,只有两个对象 true、false,它们都是编译时常量。

Dart 的类型安全意味着你不能使用类似于 if(非布尔值) 或者 assert(非布尔值) 的语句,不过可以明确地检查值,如示例:

  // 检查空字符串
  var fullName = '';
  assert(fullName.isEmpty);

  // 检查零
  var hitPoints = 0;
  assert(hitPoints <= 0);

  // 检查null
  var unicorn;
  assert(unicorn == null);

  // 检查NaN
  var iMeantToDoThis = 0 / 0;
  assert(iMeantToDoThis.isNaN);

列表

几乎每种语言中最常见的是数组或者有序对象组。在 Dart 中数组是 List 对象,因此大多人也称为列表。

Dart 列表看起来想 JavaScript 数组。示例:

  var list = [1,2,3];

分析器推断 list 类型为 list<int>。如果将非 int 类型对象加入此列表,会引发错误。获取更多的信息,阅读有关 类型推断

列表从零开始索引,0 是列表的第一个元素索引,list.length - 1 是列表的最后一个元素索引。可以像 JavaScript 那样获取一个列表的长度并引用元素。

  var list = [1,2,3];
  assert(list.length == 3);
  assert(list[1] == 2);

  list[1] == 1;
  assert(list[1] == 1);

创建一个编译时常量列表,在列表文字前添加 const:

  var constantList = const [1,2,3]
  // 同样,值不可以更改

List 类型有很多方便的方法来操作列表。有关更多信息,请参阅 泛型 Generics集合 Collections

地图型 Maps

译者注:根据译者对于其他语言的学习和开发经验,Dart 语言的 Maps 型和 Python 中的字典是一样的,其中键就是 key,值就是 value。

通常,map 型是一个有键值对构成的对象。键和值可以是任意类型的对象。键不能重复,而同样的值是可以的。Dart 对于 map 的支持是通过地图文字和 Map 类型。

以下是一些简单使用 map 文字创建的 Dart maps:

  var gifts = {
    // key:value
    'first': 'partridge',
    'second': 'turtledoves',
    'fifth': 'golden rings',
  };

  var nobleGases = {
    2: 'helium',
    10: 'neon',
    18: 'argon',
  };

解析推断 gifts 类型为 Map<String,String>,nobleGases 的类型为 Map<int,String>。如果尝试去添加非对应类型的值,解析器或者运行的时候会报错。获取更多的信息,请参阅 类型推断

你也可以使用构造函数 Map() 创建相同的对象:

  var gifts = Map();
  gifts['first'] = 'partridge';
  gifts['second'] = 'turtledoves';

  // 不想写了,省略···

你可能想看到的是 new Map(),而非 Map()。从 Dart 2 开始,new 关键字是可选的。有关详细信息,请参阅 使用构造函数

跟在 JavaScript 中一样,将新的键值对加到现有的地图中(译者注:在 python 的字典中其实也是这样的···

  var gifts = {'first': 'partridge'};
  gifts['fourth'] = 'calling birds';

跟在 JavaScript 中一样的方式在地图中检索值,不在就返回 null:(译者注:译者懒得注了

  var gifts = {'first': 'partridge'};
  assert(gifts['first'] == 'partridge');
  assert(gifts['fifth'] == null);

使用.length 获取 map 中键值对的数目

  var gifts = {'first': 'partridge'};
  gifts['fourth'] = 'calling birds';
  assert(gifts.length == 2);

常地图,定义与上面相似,不写了···

  final constantMap = const {
    2: 'helium',
    10: 'neon',
    18: 'argon',
  };
  // const改都报错,后面就不写了

获取更多的信息,请参阅 泛型 Generics地图型 Maps

符文

在 Dart 中,符文是字符串中 UTF-32 代码点

Unicode 为世界上所有书写系统中的每一个字母、数字、符号都定义了唯一的数值。由于 Dart 字符串是一系列的 UTF-16 代码单元,因此在字符串中表示 32 位要用特殊的语法。

表达 Unicode 代码点的常用的方法是 \uXXXX,其中 XXXX 是 4 位十六进制值。例如心(💗)是 \u2665。要指定多于或者少于 4 个十六进制值,请将值放在大括号里。例如,笑脸(😆)是 \u{1f600}。

该字符串类有几个属性,你可以用它来提取符文信息。codeUnitAt 和 codeUnit 属性返回 16 位编码单元。使用该 runes 属性获取字符串的符文。

以下示例说明了符文,16 位代码单元和 32 位代码点之间的关系。

  main()
  {
    var clapping = '\u{1f44f}';
    print(clapping);
    print(clapping.codeUnits);
    print(clapping.runes.toList());

    Runes input = new Runes(
      '\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
    print(new String.fromCharCodes(input));
  }

注意:使用列表操作符文要小心,这种方法容易分解,具体取决于特定的语言,字符集和操作。更多信息,请在 Stack Overflow 上参阅 如何在 Dart 中反转字符串? ——引用自 dart 官网