1.import 问题
import 'package:flutter_app/a/b.dart';
import 'pb.dart';
注: 上面两种引用方式是有区别的, 两种方式想要导入的是同一个文件, 但是却对应着两个库.推荐使用第一种.
2.布局思考
- 找出行和列.
- 布局包含网格吗?
- 有重叠的元素吗?
- 是否需要选项卡?
- 注意需要对齐、填充和边框的区域.
3.常用Widget
Text
:该 widget 可让创建一个带格式的文本。Row
、Column
: 这些具有弹性空间的布局类Widget可让您在水平(Row)和垂直(Column)方向上创建灵活的布局。其设计是基于web开发中的Flexbox布局模型。Stack
: 取代线性布局 (译者语:和Android中的LinearLayout相似),Stack
允许子 widget 堆叠, 你可以使用Positioned
来定位他们相对于Stack
的上下左右四条边的位置。Stacks是基于Web开发中的绝度定位(absolute positioning )布局模型设计的。Container
:Container
可让您创建矩形视觉元素。container 可以装饰为一个BoxDecoration
, 如 background、一个边框、或者一个阴影。Container
也可以具有边距(margins)、填充(padding)和应用于其大小的约束(constraints)。另外,Container
可以使用矩阵在三维空间中对其进行变换。
4.懒加载
懒加载使用deferred as关键字来指定
import 'package:deferred/hello.dart' deferred as hello;
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
5.部分导入
只导入需要的部分,使用show关键字
import 'package:lib1/lib1.dart' show foo;
隐藏不需要的部分,使用hide关键字
import 'package:lib2/lib2.dart' hide foo;
6.冲突解决
使用as关键字来指定库的前缀
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// ...
Element element1 = new Element(); // Uses Element from lib1.
lib2.Element element2 = new lib2.Element(); // Uses Element from lib2
7.不确定类型
使用特殊的dynamic来表示当前的类型
8.库的拆分
Dart允许我们把一个库拆分成一个或者多个较小的part组件。或者我们想让某一些库共享它们的私有对象的时候,我们需要使用part.
part of 'xxxx.dart';
part 'xxxx.g.dart';
9.赋值
使用特殊的??=来表示进行赋值,最常用的是在写单例的时候.如果 _instance 为null , 则进行赋值, 否则 _instance 保持不变~
static DartBridge _getInstance() {
_instance??= DartBridge._internal();
return _instance;
}
10.级联操作符
使用特殊的..来表示进行赋值
var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
11.混入
使用特殊的 with 来表示进行赋值
概念和 extends, implement相似.
extends 可以 选择 复写 父类的方法,
implement 可以实现任意一个类, 但是 需要 复写 所有方法.
with 类似于 extends , 但是 其使用场景是 一个类 已经有父类的情况, 这个时候 通过with,可以再添加一个父类(可以这么想).以此来缓和 Dart 单继承特性的问题.
class A {
void setA() {}
void setACopy() {}
}
class B {
void setB() {}
}
class D extends A with B {
@override
void setA() {
// TODO: implement setA
super.setA();
}
@override
void setB() {
// TODO: implement setB
super.setB();
}
}