Flutter常用语法糖

2023-02-09  本文已影响0人  __素颜__

条件成员访问 ?.

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;
}


上一篇下一篇

猜你喜欢

热点阅读