▩Dart-五例知识点

Posted itzyjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了▩Dart-五例知识点相关的知识,希望对你有一定的参考价值。

例子一:

class Bicycle 
  int cadence;
  int speed;
  int gear;

main() 

有什么问题吗?

提示:
非空实例字段‘cadence’必须初始化。
➀尝试添加一个初始值,或➁创建一个构造函数去初始化它,或➂标记它为late

现添加一个构造函数,来完成Bicycle类字段的初始化:

Bicycle(this.cadence, this.speed, this.gear);// 这个构造函数没有函数体,这在Dart中是有效的。

这样就不再报错了:

上面构造函数的等效代码如下(用了初始化列表的方式):

Bicycle(int cadence, int speed, int gear) : this.cadence=cadence, this.speed=speed, this.gear=gear;
main() 
	var bike = Bicycle(2, 0, 1);// 在Dart2中`new`关键字是可选的!
	print(bike);// 打印:Instance of 'Bicycle'

可以重写Object类的toString()方法,让打印信息更清晰:

@override
String toString() => 'Bicycle: $speed mph';

例子二:

import 'dart:math';
abstract class Shape // 显示接口定义
  num get area;// this interface must be implemented

class Circle implements Shape 
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);// must implement interface

class Square implements Shape 
  final num side;
  Square(this.side);
  num get area => pow(side, 2);// must implement interface

main() 
  final circle = Circle(2);
  final square = Square(2);
  print(circle.area);// 12.566370614359172
  print(square.area);// 4

对比如下 1 vs 2:

  1. 创建一个顶级函数:
Shape shapeFactory(String type) 
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    throw 'Can\\'t create $type.';// 也可以用双引号:"can't create $type."

main() 
    final circle = shapeFactory('circle');
    final square = shapeFactory('square');

  1. 创建一个工厂构造函数:
abstract class Shape 
  factory Shape(String type) 
      if (type == 'circle') return Circle(2);
      if (type == 'square') return Square(2);
      throw 'Can\\'t create $type.';
  
  num get area;

main() 
    final circle = Shape('circle');
    final square = Shape('square');

例子三:

class CircleMock implements Circle 

会报错,根据IDE提示,生成:

class CircleMock implements Circle 
  @override
  // TODO: implement area
  num get area => throw UnimplementedError();

  @override
  // TODO: implement radius
  num get radius => throw UnimplementedError();

如果这样,也是不报错的:

class CircleMock implements Circle 
  @override
  num area = 0;
  @override
  num radius = 0;

即使CircleMock类没有定义任何行为,但它是有效的Dart,分析器不会引发错误。
实际上是CircleMock的实例变量area实现了Circle里area的getter方法。对于radius也一样。否则@override也不可能加上去。

例子四:

String scream(int length) => "A$'a' * lengthh!";
main() 
  final values = [1, 2, 3, 5, 10, 50];
  for (var length in values) 
    print(scream(length));
  

输出:

Aah!
Aaah!
Aaaah!
Aaaaaah!
Aaaaaaaaaaah!
Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaah!

注:‘a’ * 6 = 6个连续的’a’ = “aaaaaa”,即,字符’a’被重复6次!

将命令式代码转换为函数式代码:
将例子的for循环,改为如下,效果一样,也是打印同样的输出:

values.map(scream).forEach(print);

map()、forEach()原型(针对本例而言):
dart:core Iterable map (T Function(int) toElement)
dart:core void forEach(void Function(String) action)

例子五:
使用更多的迭代器特性。ListIterable类支持fold()where()join()skip()等等。Dart也有maps和sets的内置支持。

values.skip(1).take(3).map(scream).forEach(print);

输出:

Aaah!
Aaaah!
Aaaaaah!

以上是关于▩Dart-五例知识点的主要内容,如果未能解决你的问题,请参考以下文章

Android面试准备 第二天 第五例 数据存储

Dart值得注意的知识点(一)

dart基础语法

dart基础语法

初探 Dart 语法 02

初探 Dart 语法 02