每日一题 Flutter#9 | Dart 四种点符号

334 阅读4分钟

最近在着手开发我的 《匠心星问》 ,它定位是一款 题库 应用,将集题目浏览、发布、解答、做题为一体。打算第一步先以 Flutter 为核心,准备题库资源。于是诞生《每日一题》 系列,准备精心设计一些 Flutter 的问题与解答,作为题库的养料。本文的焦点是探讨:

Dart 语法中,和 . 符号相关的语法

Dart 是一门简洁、强大且现代的编程语言,而它的语法设计中,有一些“点”操作符极具特色和实用性。本题将介绍 ., .., ... ...? 四种操作符在 Dart 中的作用。

--

1.Dart 中的点操作符

Dart 中的一些语法糖可以让一些操作变得简洁,当下面四个符号同时展示在你目前,不知道您不能一口说出它们的作用。本文将对这四个操作符进行 全面深入的讲解

  • .:成员访问符
  • ..:级联操作符(Cascade)
  • ...:展开操作符(Spread)
  • ...?:空安群展开操作符(Spread)

2. 成员访问符 .(Member Access Operator)

. 是 Dart 中最基础的语法符号之一,和其他主流语言类似,用于访问对象的属性和方法。

  • 语法结构
object.property; //访问属性   
object.property = x; //设置属性  
object.method(); //访问方法

比如下面案例中,定义 Person 对象,在实例化后可以通过 . 来访问成员属性和成员方法:

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void sayHello() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

void main() {
  Person p = Person('Tom', 30);
  print(p.name); // Tom
  print(p.age); // 30
  p.name = "toly";
  p.sayHello(); // Hello, my name is toly and I am 30 years old.
}

2、 级联操作符 ..(Cascade Operator)

.. 是 Dart 的特色之一,它允许你对同一个对象连续进行多个操作,而不必重复对象名。 适用于需要多次调用方法或设置属性的场景,提升代码的可读性与优雅性。

  • 语法结构:
Object()
  ..method1()
  ..property = value
  ..method2();

比如下面代码中 通过 .. 简化 StringBuffer 对象调用方式,不免写很多此对象名。 .. 操作会返回当前对象,这一点非常重要:

void main1() {
  StringBuffer buffer = StringBuffer()
    ..write('Toly ')
    ..write('Hello, ')
    ..write('World!');

  StringBuffer stringBuffer = StringBuffer();
  stringBuffer.write('Hello, ');
  stringBuffer.write('Hello, ');
  stringBuffer.write('World!');
}

级联操作在创建画笔时非常有用,创建完后通常会设置很多属性,这样可以避免写很对此变量名操作:

Paint paint = Paint()
  ..color = Colors.red
  ..strokeWidth = 2.0
  ..style = PaintingStyle.stroke;

三、 展开操作符 ...(Spread Operator)

... 用于将一个集合的所有元素插入到另一个集合中。这对于构建列表、集合、映射等非常有用。

  • 语法结构:
List<int> list1 = [1, 2, 3];
List<int> list2 = [0, ...list1, 4]; // => [0, 1, 2, 3, 4]

也可用于 SetMap

Set<int> set1 = {1, 2};
Set<int> set2 = {...set1, 3}; // => {1, 2, 3}

Map<String,int> map1 = {'a': 1};
Map<String,int> map2 = {...map1, 'b': 2}; // => {'a': 1, 'b': 2}

如果你不确定被展开的对象是否为 null,可以使用 ...? 来避免空指针异常:

List<int>? maybeNullList = null;

List<int> list3 = [0, ...?maybeNullList, 4]; // => [0, 4]

四、总结

符号名称用途简述使用示例
.成员访问符访问对象属性或方法object.property, object.method()
..级联操作符链式操作同一个对象,提高可读性object..method1()..method2()
...展开操作符将一个集合展开插入到另一个集合中[1, 2, ...list, 5]
...?空安全展开符当展开的集合可能为 null 时使用[1, ...?nullableList]

Dart 的 ., .., ... , ...? 点操作符不仅提升了语法的简洁性,还让你写出更流畅、更易读的代码。理解它们的工作机制和适用场景,是每一位 Dart 或 Flutter 开发者的备知识。
希望这题能帮助你更深入地理解和使用这些看似简单却极具威力的 点操作符。下面编了一首打油诗,助助兴,

一个点(.)老传统,访问成员大过天,
两个点(..)连成链,重复对象不再显。
三个点(...)来展开,列表集合一锅端,
三点问(...?)护城河,防止空群来作乱!


如果你有其他的看法,或者有什么想要的题目、或者想提供题目和答案,都欢迎在评论区留言。更多文章和视频知识资讯,大家可以关注我的公众号、掘金和 B 站 。