Dart 学习笔记 (十) 新特性

161 阅读2分钟

Null safety

Null safety 翻译成中文的意思是空安全

null safety 可以帮助开发者避免一些日常开发中很难被发现的错误,并且额外的好处是可以改善性能

Flutter2.2.0 之后的版本都要求使用null safety

? 可空类型 / !类型断言

//- ? 可空类型案例
  String username = "hello"; // 表示非空类型
  username = null;  // 这里因为有空安全限制,所有会报错


  String? username = "hello"; // ? 表示可空类型
  username = null;
  print(username);
  
  List<String>? l1 = ["张三", "李四", "王五"];
  l1 = null;
  
  
  String? getData(apiUrl) {
      if (apiUrl != null) {
        return 'this is server data';
      }

      return null;
  }

  print(getData(null));
//- !类型断言
//- 类型断言:如果str不等于null 会打印str的长度,如果等于null会抛出异常

void printLength(String? str) {
  print(str!.length); //- 如果传递进来的是null,就会抛出异常,需要使用的时候可以使用try...catch
}

  // print(str!.length);
  printLength(null);

late 关键字

延迟初始化属性

// 如果初始化不定义值是多少,并且定义了构造函数,就不会报错
class Demo {
  String name;
  int age;
  Demo(this.name, this.age);
}

// 如果初始化不定义值是多少,也不需要定义构造函数,就可以使用late进行延迟初始化
class Demo {
 late String name;
 late int age;
}

required关键字

最开始 required 是注释

现在它已经作为内置修饰符

主要用于允许根据需要标记任何命名参数(函数或类),使得它们不为空。因为可选参数中必须有个 required 参数或者该参数有个默认值

String printUserInfo(String username, {int age, String sex}) { //- 这样写可选参数是不对的
  return "$username --- $age";
}

String printUserInfo(String username, {int age = 10, String sex = "男"}) { //- 给默认参数
  return "$username --- $age";
}
print(printUserInfo("张三"));
print(printUserInfo("张三", age: 20));



String printUserInfo(String username, {required int age, required String sex}) {//- required表示必须传入的参数
  return "$username --- $age";
}

print(printUserInfo("张三", age: 20, sex: "男"));

// 表示name是可选参数,age是必填参数
class Person {
  String? name; 
  int age;
  Person({this.name, required this.age});

  String getName() {
    return "${this.name} --- ${this.age}";
  }
}

  Person p = new Person(age: 20);
  print(p.getName()); //- null --- 20