1、Flutter 类名规范
1、文件名使用小写字母加下划线 例如 login_widget
2、类名使用大驼峰 LoginWiget
3、child 里面 需要加 const
2、const 和 final 的却别
1、const只能定义常量。 值不能变且一开始的时候就要赋值
2、final 不仅可以定义常量,而且有运行时的特性。定义对象。且定义的时候不需要赋值,可以在运行时赋值。但是也只能赋值一次。不能二次修改。
3、dart 基础数据 运算符
// 如果b为空的话。 23赋值给b
var b;
b ??= 23
var a = 23
var b = a ?? 20
// 如果a为空的话。 给23 可用于可空类型解包
// 类型判断
var str = "hellow";
print(str is String)
List dataArray = [1, 2];
dataArray.reversed.toList(); // 数组翻转
dataArray.addAll([3, 4]); // 数组拼接
List array2 = List.filled(2, [2, 3]); // 固定长度数组
dataArray.fillRange(0, 2, [1, 2]); // 修改数组
dataArray.join("-"); // 数组转字符串
"123".split("-"); // 字符串转数组
// 数组遍历使用 forEach
dataArray.forEach((element) { });
// 修改数组使用 map
dataArray.map((e) => e * 2).toList();
// 数组条件查询
dataArray.where((element) => element > 2).toList();
// 只要有满足就返回 true
dataArray.any((element) => element > 2);
// 都满足才会返回 true
dataArray.every((element) => element > 2);
4、面向对象
// 可选参数、命名参数、参数默认值
void fn(String name, {required int age, bool? sex, int height = 170}) {
}
// 计算属性 set get
int height = 180;
int weight = 10;
get areaHeight => height * weight;
get area { return height * weight;}
set name(height) {
this.height = height;
}
// 继承 接口 抽象类
entends 和 implements 的区别
1、如果需要复用抽象类的实体方法。 并且想让他约束自己的话, 用entends
2、如果只想帮抽象类当作一个标准的话。 那就用implements
(继承抽象类。 可以不实现他的实体方法。 如果implements 的话需要全部都实现)
// art 没有 interface 接口就是通过抽象类来实现的。
// mixins
1. 作为 mixins 的类 只能继承自 Object
2. 作为 mixins 的类 不能有构造函数 (子类需要实现父类的构造方法。 如果mixins 有构造方法, 子类怎么办)
3. 一个类 可以 多个mixins 但是mixins的类,里面有同样的方法。后面的会覆盖前面的。就算是继承过来的方法 mixins 一样会覆盖
4. 如果 class a extentds C with d,e {}
那么 a is C = true; a is d = true; a is e = true;
// 泛型
T getData<T>(T value) {
return value;
}
class Cache<T> {
setValueForkey(T value, String key) {
}
}
5、空安全
Flutter 2.2.0 之后必须使用空安全
? 可空类型 !不可空
// 四种可空类型解包方式
testNullSafe(String? name) {
// 1、 使用可选类型接收
String? str = name;
// 2 tru catch 解包
String str;
try {
str = name!;
} catch (error) {
str = "name 为空";
}
print(str);
// 3、判断解包
if (name != null) {
str = name;
} else {
str = "name 为空";
}
// 4、?? 解包
str = name ?? "xiaowu";
print(str);
}
6、基础组件
0、Container 自带对其方式。
alignment: Alignment.topRight,
1、图片
// ClipOval 可以帮助图片处理成圆形图片。 切圆角看基础控件
// https://juejin.cn/post/7008072188322381831
ClipOval {
child:Image.newWork(...)
}
2、row cloumn
// listView 有 padding 和 GrideView.count 也有
// GrideView.build 没有,只能在外层家一个 padding 了。
// row 和 column 是有布局方式的
Row(
// mainAxisAlignment: MainAxisAlignment.center, //居中显示
// mainAxisAlignment: MainAxisAlignment.spaceBetween, // 左右靠边。中间居中
// mainAxisAlignment: MainAxisAlignment.spaceEvenly, // 等分
mainAxisAlignment: MainAxisAlignment.spaceAround, // 两边边距 = 中间间距 / 2
crossAxisAlignment: CrossAxisAlignment.start, // 副轴对齐方式
);
3、Expanded 是结合 row cloumn 使用的。
- 处理等分: 1, 2, 1,。 或者其他等分。
- 如果不设置 flex 就是固定宽度
- 左边固定、右边弹性的问题。
4、Stack 自身携带 alignment 属性。 Aliment(0, 0) 为中心点
5、处理控件宽高比
AspectRatio( // 处理 宽/长 比例显示的图片
aspectRatio: 20/9.0,
child: Image.network(
this.listData[1]["imageUrl"],
fit: BoxFit.cover,
),
),
7、控件冲突
1、ListView 里面 不能用 ListView