最近在着手开发我的 《匠心星问》 ,它定位是一款 题库 应用,将集题目浏览、发布、解答、做题为一体。打算第一步先以 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]
也可用于 Set
和 Map
:
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 站 。