import '1.first.dart';
/**
* Flutter2.2.0之后的版本都要求使用null safety
* 其实和swift差不多
*
* ? 可空类型
*
* !类型断言
*
*
*
* late 关键字主要用于延迟初始化
*
*
*
*/
main(List<String> args) {
// 通过?定义一个可空类型,这样在才能给a=null, 新版本都要这样写了
int? a = 10;
print("a = $a");
a = null;
print("a = $a");
List<String>? l = ["1", "2", "3"];
print("l = $l");
l = null;
print("l = $l");
var le = getData("哈喽");
print("str.length = $le");
// ! 类型断言
String? s = null;
// print(s!.length); //这样会抛出一个异常, 因为此刻值是null
Person p = new Person("张三", 20);
print("${p.name},${p.age}");
String sss = printInfo("李四", age: 20, score: 100);
print("sss = $sss");
sss = printInfo1("王五");
print("sss = $sss");
}
// 函数返回一个可空类型
int? getData(String? str) {
try {
var l = str!.length;
return l;
} catch (e) {
return null;
}
}
// 在2.13之后需要给属性初始化, 延迟初始化值,就需要late前置声明
class Person {
late String name;
late int age;
Person(this.name, this.age);
get des {
return this.name + "," + this.age.toString();
}
set setDes(String name) {
this.name = name;
}
}
//require
// 最开始@required是注解
// 现在作为内置修饰符
// 主要用于允许根据需要标记任何命名参数(函数或类),是他们不为空
// 下面代码命名参数, 本来是可以可选的传入,加了required就是必须传入的
String printInfo(String name, {required int age, required double score}) {
if (age != 0) {
return "$name, $age, $score";
} else {
return "$name";
}
}
// 下面这样也可以, 直接给可选参数一个默认值, 就不会报错了
String printInfo1(String name, {int age = 0, double score = 0.0}) {
if (age != 0) {
return "$name, $age, $score";
} else {
return "$name";
}
}