Flutter二次学习遗忘点统计

206 阅读3分钟

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