条件成员访问 ?.
class Person{
String name;
int age;
}
void main(){
Person person;
// 这里会报错,因为都初始化出 person
print(person.age);
// 这里不会报错, ?. 是先判断是否存在 person
print(person?.name);
}
语法糖 ??
A??B
如果 A 等于 null,那么 A??B 为 B
如果 A 不等于 null,那么 A??B 为 A
类型转换 as 操作符
class Person{
String name;
int age;
void work(){
print("working...");
}
}
void main(){
var person ;
person = "";
person = new Person();
// 将变量转为 Person 对象的格式,如果 不是 Person 对象,就会报错
(person as Person).work();
}
是否指定类型 is,is! 操作符
class Person{
String name;
int age;
void work(){
print("working...");
}
}
void main(){
var person ;
person = "";
// 判断 person 变量是 Person 类的实例化出来的
if (person is Person) {
}
// 判断 person 变量不是 Person 类的实例化出来的
if (person is! Person) {
}
}
.. 级联 操作
void main(){
var person = new Person();
// 这段表示给 age 和 name 赋值,然后调用 work 方法
person..age=10
..name="Tommi"
..work();
// 也可以这样子写,匿名类的方式
new Person()
..age=10
..name="Tommi"
..work();
}
对象中的 call 方法
当我们声明一个类的时候,如果给这个类指定一个 call 方法,就可以直接使用类名作为方法名来调用 call 方法了。
class Person {
String name;
int age;
call() {
print("call object");
}
}
void main() {
Person person = new Person();
person(); // call object
}
Extension 方法
和kotlin的扩展函数一样,扩展已有的类,方便使用
extension NumberParsing on String {
int parseInt() {
return int.parse(this);
}
// ···
}
print('42'.parseInt()); // Use an extension method.
for 语法糖
class _HomePageState extends State<HomePage> {
String text;
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
if (text != null) Text(text) else Text("空的"),
if (text != null) Text(text),
],
);
}
}
if 语法糖
在 flutter 中可能会这样的情况: 如果条件是假,则不显示某个 Widget
class _HomePageState extends State<HomePage> {
String text;
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
if (text != null) Text(text) else Text("空的"),
if (text != null) Text(text),
],
);
}
}
…语法
展开
void list3Point() {
var list1 = <int>[1, 2, 3, 4];
var list2 = <int>[
0,
...list1,
6,
];
print(list2); // [0, 1, 2, 3, 4, 6]
}
空安全修饰符
空安全是在Dart 2.12中引入的,如果开启空安全,默认情况下代码中的类型不能为空,也就是说除非声明该类型是可以为空的,否则值不能为空。
空安全在Dart 2.12 和 Flutter 2.0中可用,可通过指定Dart SDK版本为2.12那么就会开启空安全
environment:
sdk: ">=2.12.0 <3.0.0"
将类型分为了非空类型和可空类型
String a;//a为非空类型,默认非空
String? a;//a为可空类型
!修饰符
空断言:表示确保该表达式不会为空,如果为空会报错,引起空指针异常;
一个作为后缀的感叹号标记 (!) 会让左侧的表达式转换成其对应的非空类型
late
由于在空安全中声明的变量默认是非空类型,所以必须赋初始值。但如果不想这么早赋初始值,可以用late(必须确保在使用前赋值,否则会报错)
late String description;
想给一个非空变量赋值 null 要如何处理?
只需在类型后面添加 ?
String? name = null;
print('name length:${name?.length}');
还可以使用操作符 !
String? name = null;
print('name length:${name!.length}');
还可构造出类型提升,使该变量类型提升为非空类型
int getLength(String? str) {
// 此处报错,因为 str 可能为空
return str.length;
}
//这个例子中,因为 str 可能为空,所以使用 str.length 会提示错误,通过类型提升我们可以这样修改:
int getLength(String? str) {
// 判断 str 为空的场景 str 提升为非空类型
if (str == null) return 0;
return str.length;
}
网友评论