1.Null safety 空安全
帮助开发者发现一些难以发现的错误,改善性能
//以下?可空类型不适用
String? userName="";
userName=null;
现在这个也可以
String getData(apiUrl){
if(apiUrl!=null){
return “数据返回”;
}
return null;
}
void main(List args) {
print(getData(“hello”));
print(getData(null));
}
断言类型–可能不需要
以下无效
void main() {
String? str="this is ";
str=null;
print(str!.length); //!原意是不为空则正常输出,为空则抛出异常
}
延时–可能不需要
类中没有用构造函数赋值,可能报错未初始化,加late
late String name;
Required
最初@Required是注解,现在变成了内置修饰符
要求命名参数(函数,类)不得为空
String printUserInfo(String userName,{required int age,String sex}){
也就是要求必须提供某个参数
常量
const:编译时确定
final 可先声明
identical函数:检查两个对象是否指向了同一个空间
var a1=new Object();
var a2=new Object();
print(identical(a1, a2));//fasle
print(identical([1], [1]));//false
但是用了const:
const 在多个地方创建相同对象时,内存中只保留一个对象
const 声明两个数组值相同时,共享一个存储空间
var a1=const Object();//省略了new
var a2=const Object();
print(identical(a1, a2));//true
print(identical([1], [1]));//false
print(identical(const [1], const [1]));//true
const a=[2];
const b=[2];
print(identical(a, b));//true
## ```常量构造函数
1)常量构造函数必须用const修饰
2)const构造函数必须用于成员变量都是final修饰的
3)实例化时如果不加const,即使调用的是常量构造函数,实例化的对象也不是常量
4)实例化常量构造函数的时候,多个地方创建这个对象,如果传入的值相同,只会保留一个
5)Flutter中const修饰不仅仅是节省组件构建时的内存开销,
```dart
class Container{
final int width;
final int height;
const Container(this.height, this.width); //requested应该不是必须
}
void main(List<String> args) {
var c1=new Container(12, 10);
var c2=new Container(12, 10);
print(identical(c1, c2));//false
var c3=const Container(12, 10);
var c4=const Container(12, 10);
print(identical(c3, c4));//true
}
ff