文章内容是我在学习Flutter过程中对知识点的梳理和总结。如有不对的地方,欢迎指出。
本文承接Dart语言基础,看完这篇文章就够了(一),进一步了解Dart语法知识。
var collection = [0, 1, 2];
//forEach
collection.forEach((item) => print('forEach: $item'));
//for-in遍历元素
for (var item in collection) {
print('for-in: $item');
}
// 抛出Exception 对象
// throw new FormatException(‘格式异常');
// 抛出Error 对象
// throw new OutOfMemoryError();
// 抛出任意非null对象
// throw '这是一个异常';
try {
throw new NullThrownError();
// throw new OutOfMemoryError();
} on OutOfMemoryError {
//on 指定异常类型
print('没有内存了');
// rethrow; //把捕获的异常给 重新抛出
} on Error {
//捕获Error类型
print('Unknown error catched');
} on Exception catch (e) {
//捕获Exception类型
print('Unknown exception catched');
} catch (e, s) {
//catch() 可以带有一个或者两个参数, 第一个参数为抛出的异常对象, 第二个为StackTrace对象堆栈信息
print(e);
print(s);
}
}
Java中写法
class Point {
double x;
double y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
Dart建议写法
class Point {
num x;
num y;
Point(this.x, this.y);
}
var p = new Point(1, 1); //new 可省略 var point = Point(1, 2);
print(p.x);
// Point p1;
// print(p1.runtimeType); //可以使用Object类的runtimeType属性,获取对象的类型
class Point {
int x;
int y;
Point(this.x, this.y);
//命名构造函数
Point.mingMing(Map map) {
this.x = map['x'];
this.y = map['y'];
}
}
调用如下:
p = Point.mingMing({'x': 2, 'y': 2});
print(p.x);
class Point {
int x;
int y;
Point(this.x, this.y);
Point.mingMing(Map map) {
this.x = map['x'];
this.y = map['y'];
}
//重定向构造函数
Point.chongDingXiang(num x) : this(x, 0);
}
调用如下:
var p = Point.chongDingXiang(3);
print(p.x);
import 'dart:math';
class Point {
//final变量不能被修改,必须被构造函数初始化
final num x;
final num y;
final num distanceFromOrigin;
//初始化列表
Point(x, y)
: x = x,
y = y,
distanceFromOrigin = sqrt(x * x + y * y);
}
class Parent {
int x;
int y;
Parent.f(x, y)
: x = x,
y = y {
print("父类命名构造函数");
}
}
class Child extends Parent {
int x;
int y;
Child(x, y)
: x = x,
y = y,
super.f(x, y) {
print('子类默认构造函数');
}
Child.f(x, y)
: x = x,
y = y,
super.f(x, y) {
print("子类命名构造函数");
}
}
调用:
var c = Child(1, 2);
print(c);
class Point2 {
//定义const构造函数要确保所有实例变量都是final
final num x;
final num y;
static final Point2 origin = const Point2(0, 0);
//const关键字放在构造函数名称之前,且不能有函数体
const Point2(this.x, this.y);
}
调用:
Point2 p =const Point2(1, 2);
var p2 =const Point2(1, 2);
print(identical(p, p2));
输出结果:true
class Singleton{
String name;
//工厂构造函数无法访问this,所以这里要用static
static Singleton _cache;
//工厂方法构造函数,关键字factory
// factory Singleton({String name = 'name'}){
// if(Singleton._cache == null){
// Singleton._cache = Singleton._newObject(name);
// }
// return Singleton._cache;
// }
//注释内容简写
factory Singleton([String name = 'name']) =>Singleton._cache ??=Singleton._newObject(name);
//定义一个命名构造函数用来生产实例
Singleton._newObject(this.name);
}
调用:
var s = Singleton('555');
var s2 = Singleton('666');
print(identical(s, s2));
运行结果:true
class Rectangle {
num left;
num top;
num width;
num height;
Rectangle(this.left, this.top, this.width, this.height);
num get right => left + width;
set right(num value) => left = value - width;
num get bottom => top + height;
set bottom(num value) => top = value - height;
}
调用:
var rect = new Rectangle(1, 1, 10, 10);
print(rect.left);
rect.right = 12; //调用set
print(rect.left);//调用get
两种实现方式:
void main() {
var footM = new Massage("foot");
var backM = new Massage("back");
var specialM = new Massage("special");
footM.doMassage();
backM.doMassage();
specialM.doMassage();
}
abstract class Massage {
//工厂模式
factory Massage(String type) {
switch (type) {
case "foot":
return FootM();
case "back":
return BackM();
case "special":
return specialM();
}
}
void doMassage();
}
class FootM implements Massage {
@override
void doMassage() {
print("FootM ---- doMassage()");
}
}
class BackM implements Massage {
@override
void doMassage() {
print("BackM ---- doMassage()");
}
}
class specialM implements Massage {
@override
void doMassage() {
print("specialM ---- doMassage()");
}
}
void main() {
var footM = massageFactory("foot");
footM.doMassage();
}
//顶级函数
Massage massageFactory(String type) {
switch (type) {
case "foot":
return FootM();
case "back":
return BackM();
case "special":
return specialM();
}
}
//抽象类
abstract class Massage {
void doMassage() {
print("Massage");
}
}
class FootM extends Massage {
@override
void doMassage() {
print("FootM ---- doMassage()");
}
}
class BackM extends Massage {
@override
void doMassage() {
print("BackM ---- doMassage()");
}
}
class specialM extends Massage {
@override
void doMassage() {
print("specialM ---- doMassage()");
}
}
实现call() 方法可以让类像函数一样能够被调用。
void main(){
var cf = new ClassFunction();
var out = cf("tutou","flutter","laowang");
print('$out');
print(cf.runtimeType);
print(out.runtimeType);
print(cf is Function);
}
class ClassFunction {
call(String a, String b, String c) => '$a $b $c!';
}
示例如下:
void main() {
var p1 = Person("小王", 18, 170);
var p2 = Person("老王", 28, 180);
if (p2 > p1) {
print("老王比小王年龄大");
}
if (p1 < p2) {
print("老王比小王高");
}
print('老王比小王大${p2 - p1}岁');
print("老王和小王的年龄和${p1 + p2}");
}
class Person {
String name;
int age;
int height;
Person(this.name, this.age, this.height);
bool operator >(Person p) {
return this.age > p.age;
}
bool operator <(Person p) {
return this.height < p.height;
}
int operator +(Person p) {
return this.age + p.age;
}
int operator -(Person p) {
return this.age - p.age;
}
}
关键字: with
示例如下:
void main() {
print(AB().getMessage());
print(BA().getMessage());
print(C().getMessage());
print(CC().getMessage());
}
class A {
String getMessage() => 'A';
}
class B {
String getMessage() => 'B';
}
class P {
String getMessage() => 'P';
}
class AB extends P with A, B {}
class BA extends P with B, A {}
class C extends P with B, A {
String getMessage() => 'C'; //优先级最高的是在具体类中的方法。
}
class CC extends P with B implements A {
} //这里的implement只是表明要实现A的方法,这个时候具体实现是再B中mixin了具体实现
var names = List();
print(names is List);//true
print(names.runtimeType); // List
注:在Java中,可以测试对象是否为List,但无法测试它是否是List。
var list = List();
list.add('aaa');
list.add('bbb');
list.add('ccc');
print(list);
var map = Map();
map[1] = 'aaaa';
map[2] = 'bbbb';
map[3] = 'cccc';
print(map);
void main() {
V addCache(K key, V value) {
V temp = value;
print('key:$key--------------value:$value');
return temp;
}
var v = addCache("秃头", "老王");
}
main() {
var p = Phone('123456');
print(p.mobileNumber);
}
class Phone {
final T mobileNumber;
Phone(this.mobileNumber);
}
main() {
var footMassage = FootMassage();
var m = Massage(footMassage);
m.massage.doMassage();
}
class Massage {
final T massage;
Massage(this.massage);
}
class FootMassage {
void doMassage() {
print('脚底按摩');
}
}
关键字: as
如果两个库有冲突的标识符,可以为其中一个或两个库都指定前缀;
1.新建dart文件
2.选择性导入(只使用库中一部分,或者隐藏库中一部分)
- 使用 await 关键字暂停代码执行一直到库加载完成。
- 可提高程序启动速度。
- 用在不常使用的功能。
- 用在载入时间过长的包。
- 执行 A/B 测试,例如 尝试各种算法的 不同实现。
摘自:Flutter 一些常用库
- 字体图标生成 http://fluttericon.com/
- Flutter中文网 https://flutterchina.club
- Flutter官网 https://flutter.io
- Flutter中文开发者论坛 http://flutter-dev.cn/
- Flutter|Dart语言中文社区 http://www.cndartlang.com/flutter
- Dart开源包 https://pub.dartlang.org/packages
- Dart SDK文档 https://api.dartlang.org/stable/1.24.3/index.html
- 学习资料 https://marcinszalek.pl/
- Flutter布局控件 https://juejin.im/post/5bab35ff5188255c3272c228
- Flutter开发者 http://flutter.link/
- Flutter开源APP https://itsallwidgets.com/
- 深入理解(Flutter Platform Channel )https://www.jianshu.com/p/39575a90e820
- 简书 - 闲鱼技术 https://www.jianshu.com/u/cf5c0e4b1111