▩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:
- 创建一个顶级函数:
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');
- 创建一个工厂构造函数:
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:coreIterable map (T Function(int) toElement)
dart:corevoid forEach(void Function(String) action)
例子五:
使用更多的迭代器特性。List
和Iterable
类支持fold()
、where()
、join()
、skip()
等等。Dart也有maps和sets的内置支持。
values.skip(1).take(3).map(scream).forEach(print);
输出:
Aaah!
Aaaah!
Aaaaaah!
以上是关于▩Dart-五例知识点的主要内容,如果未能解决你的问题,请参考以下文章