Dart & Flutter系列教程【3】——Dart2.13之后新特性

216 阅读2分钟

看文需知:该文为观看B站大地老师讲解课程所作笔记,该篇为P15的内容。

该部分为Dart2.13之后的新特性,包括Null safety、late关键字、空类型声明符?、非空断言!、required关键字。

Null safety & 空类型声明符?

顾名思义,意思为空安全,该特性可以帮助开发者避免一些日常开发中很难被发现的错误,并且改良性能。

Flutter2.2.0(2021年5月19日发布),之后的版本都要求使用null safety。

void main(List<String> args) {
  // int a = 123;
  // a = null; //A value of type 'Null' can't be assigned to a variable of type 'int'.


  // String b = "123";
  // b = null;//A value of type 'Null' can't be assigned to a variable of type 'String'.


  String? aa = "123";
  aa = null;

  print(aa);
}

输出:

null

String?表示可空类型。类似的有:

List<String>? list = ["小红"];

非空断言!

如果不为空,会

void main(List<String> args) {
  String? str = "123";
  str = null;
  print(str!.length);//类型断言
}

这样的写法会抛出异常。 image.png 所以。同时需要的是进行try catch进行抛出。

void main(List<String> args) {
  printStr("123");
  printStr(null);
}

void printStr(String? str){
    try{
      print(str!.length);
    }catch(e){
      print("str is null");
    }
  }

late关键字

用于延迟初始化。

class Person{
  // String name;//Non-nullable instance field 'name' must be initialized.
  late String name;

  setName(String name){
    this.name = name;
  }

  getName(){
    return name;
  }
}

void main(List<String> args) {
  Person p1 = new Person();
  p1.setName("小红");
  print(p1.getName());
}

required关键字

老版本中,最开始使用 @required 注解。

现在是作为内置修饰符。主要用于允许根据需要标记任何命名参数(函数或类),使得它们不得为空。

String printName(String name, {int age = 10, String sex = "男"}){
  return "名字:$name---性别:$age----sex:$sex";
}

// String printName1(String name, {int age, String sex}){//会报错
//   return "名字:$name---性别:$age----sex:$sex";
// }

String printName2(String name, {required int age, required String sex}){
  return "名字:$name---性别:$age----sex:$sex";
}

void main(List<String> args) {
  print(printName("小红"));

  // print(printName1("小红"));

  // print(printName2("小红"));//加入关键字后只传入一个参数会报错

  print(printName2("小红", age:20, sex:"女"));
}