Flutter 技术入门与实战 (27):开启 Flutter 之旅 3.4

阅读数:41 2019 年 12 月 15 日 18:48

Flutter技术入门与实战(27):开启Flutter之旅 3.4

(运算符)

内容简介
第 1 章介绍 Flutter 的基本概念,并搭建第 yi 个 Flutter 程序,来感受一下 Flutter 之美。
第 2 章介绍几个重要知识点,如入口程序、Material Design、Flutter 主题、无状态组件和有状态组件、使用包资源、Http 请求。
第 3 章简单介绍 Dart 语言。Dart 语言是 Flutter SDK 指定的语言,我们很有必要补充一下它的基础知识,包括语法特性、基本语句、面向对象等。
第 4 章介绍常用组件。Flutter 里有一个非常重要的核心理念:一切皆为组件,本章主要讲解开发中用得 * 频繁的组件,如容器组件、图片组件、文本组件、图标组件和表单组件等。
第 5 章介绍 Material Design 风格的组件,Material Design 风格是一种非常有质感的设计风格,并提供一些默认的交互动画。本章将分类介绍这些组件。
第 6 章介绍 Cupertino 风格的组件,这是一类 iOS 风格的组件,如 CupertinoTabBar、CupertinoPageScaffold、CupertinoTabScaffold、CupertinoTabView 等。
第 7 章介绍页面布局的基础知识和技巧,如基础布局处理、宽高尺寸处理、列表及表格布局等,* 后通过一个综合布局示例来演示如何编写复杂的页面。
第 8 章介绍如何处理手势,如轻击、拖动和缩放等。Flutter 中提供 GestureDetector 进行手势检测,并为手势检测提供了相应的监听。
第 9 章介绍如何加载、处理、展示资源和图片,如添加资源和图片、自定义字体等。
第 10 章介绍路由及导航是如何处理的,包括页面的渲染以及数据传递。
第 11 章介绍组件装饰和视觉效果的处理,如 Opacity(透明度处理)、DecoratedBox(装饰盒子)、RotatedBox(旋转盒子)、Clip(剪裁处理)和 CustomPainter(自定义画板)。
第 12 章介绍动画效果的制作,包含两个动画组件的使用:用 AnimatedOpacity 实现渐变效果、用 Hero 实现页面切换动画。
第 13 章介绍 Flutter 插件开发的入门知识。Flutter 插件可以和原生程序打交道,比如调用蓝牙、启用 WIFI、打开手电筒,等等。
第 14 章介绍开发工具及使用技巧,介绍几款常用的 IDE 工具,从代码的编写、辅助功能、程序调试、性能分析等多方面讲解工具及使用技巧。
第 15 章介绍测试与发布应用,包括:测试应用、发布 Android 版和 iOS 版 App。
第 16 章通过一个综合案例介绍如何使用 Flutter 实现即时通讯 App 的界面。

Dart 支持各种类型的运算符,并且其中的一些操作符还能进行重载。完整的操作符如表 3-2 所示。

描述 运算符
一元后缀 expr++ expr-- () [] . ?.
一元前缀 -expr !expr ~expr ++expr --expr
乘法类型 * / % ~/
加法类型 + -
移动位运算 << >>
与位运算 &
异或位运算 ^
或位运算 |
关系和类型测试 >= <= > < as is is!
等式 == !=
逻辑与 &&
逻辑或 ||
条件 expr1 ? expr2 : expr3
级联 ..
赋值 = *= /= ~/= %= += -= <<= >>= &= ^= |= ??=

使用运算符时可以创建表达式,以下是运算符表达式的一些示例:

复制代码
a++
a--
a + b
a = b
a == b
expr ? a : b
a is T

在表 3-2 操作符表中,操作符的优先级由上到下逐个减小,上面行内的操作符优先级大于下面行内的操作符。例如,“乘法类型”操作符 % 的优先级比“等价”操作符 == 要高,而 == 操作符的优先级又比“逻辑与”操作符 && 要高。注意使用运算符时的顺序,方法如下所示:

复制代码
// 1. 使用括号来提高可读性
if ((n % i == 0) && (d % i == 0))
// 2. 难以阅读,但是和上面等价
if (n % i == 0 && d % i == 0)

提示 对于二元运算符,其左边的操作数将会决定使用的操作符的种类。例如,当你使用一个 Vector 对象以及一个 Point 对象时,aVector + aPoint 使用的 + 是由 Vector 所定义的。

1. 算术运算符

Dart 支持常用的算术运算符如下所示:

操作符 含义
+
-
-expr 一元减号,也命名为负号(使后面表达式的值反过来)
*
/
~/ 返回一个整数值的除法
% 取余,除法剩下的余数

示例代码如下:

复制代码
assert(3 + 6 == 9);
assert(3 - 6 == -3);
assert(3 * 6 == 18);
assert(7 / 2 == 3.5); // 结果是浮点型
assert(5 ~/ 2 == 2); // 结果是整型
assert(5 % 2 == 1); // 求余数

Dart 还支持前缀和后缀递增和递减运算符,如下所示:

操作符 含义
++var var=var+1 表达式的值为 var+1
var++ var=var+1 表达式的值为 var
–var var=var-1 表达式的值为 var-1
var– var=var-1 表达式的值为 var

示例代码如下:

复制代码
var a, b;
a = 0;
b = ++a; // 在 b 获得其值之前自增 a
assert(a == b); // 1 == 1
a = 0;
b = a++; // 在 b 获得值后自增 a
assert(a != b); // 1 != 0
a = 0;
b = --a; // 在 b 获得其值之前自减 a
assert(a == b); // -1 == -1
a = 0;
b = a--; // 在 b 获得值后自减 a
assert(a != b); // -1 != 0

2. 关系运算符

等式和关系运算符的含义如下:

操作符 含义
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

有时需要判断两个对象是否相等,请使用 = = 运算符。

下面是使用每个等式和关系运算符的示例:

复制代码
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

3. 类型测试操作符

as、is 和 is! 操作符在运行时用于检查类型非常方便,含义如下所示:

操作符 含义
as 类型转换
is 当对象是相应类型时返回 true
is! 当对象不是相应类型时返回 true

如果 obj 实现了 T 所定义的接口,那么 obj is T 将返回 true。

使用 as 操作符可以把一个对象转换为指定类型,前提是能够转换。转换之前用 is 判断一下更保险。如下面这段代码:

复制代码
if (user is User) {
// 类型检测
user.name = 'Flutter';
}

如果能确定 user 是 User 的实例,则你可以通过 as 直接简化代码:

复制代码
(user as User).name = 'Flutter';

注意 上面两段代码并不相等。如果 user 的值为 null 或者不是一个 User 对象,第一段代码不会做任何事情,第二段代码会报错。

4. 赋值操作符

可以使用 = 运算符赋值。要仅在变量为 null 时赋值,请使用??= 运算符。如下面代码所示:

复制代码
// 赋值给 a
a = value;
// 如果 b 为空,则将值分配给 b;否则,b 保持不变
b ??= value;

诸如 += 之类的复合赋值运算符将操作与赋值相结合。以下是复合赋值运算符的工作方式:

复合赋值 等式表达式
a op b a = a op b
a += b a = a + b
a -= b a = a - b

5. 逻辑运算符

可以使用逻辑运算符反转或组合布尔表达式,逻辑运算符如下所示:

操作符 含义
!expr 反转以下表达式(将 false 更改为 true,反之亦然)
|| 逻辑或
&& 逻辑与

示例代码如下:

复制代码
if (!expr && (test == 1 || test == 8)) {
// ...TODO...
}

6. 位运算符

通常我们指位运算为 << 或 >> 移动位运算,通过操作位的移动来达到运算的目的,而 &、 |、 ^、 ~expr 也是操作位来达到运算的目的。具体含义如下所示:

操作符 含义
&
|
^ 异或
~expr 一元位补码(0s 变为 1s;1s 变为 0s)
<< 左移
>> 右移

示例代码如下:

复制代码
final value = 0x22;
final bitmask = 0x0f;
assert((value & bitmask) == 0x02); // 与
assert((value & ~bitmask) == 0x20); // 与非
assert((value | bitmask) == 0x2f); // 或
assert((value ^ bitmask) == 0x2d); // 异或
assert((value << 4) == 0x220); // 左移
assert((value >> 4) == 0x02); // 右移

7. 条件表达式

Dart 有两个运算符,可用来简明地评估可能需要 if-else 语句的表达式。如下代码即为一种条件表达式,也可以称为三元表达式。如果条件为真,返回 expr1,否则返回 expr2:

复制代码
condition ? expr1 : expr2

第二种如下所示,如果 expr1 为非空,则返回其值;否则,计算并返回 expr2 的值:

复制代码
expr1 ?? expr2

8. 级联操作

级联操作用两个点(…)表示,可对同一对象执行一系列操作。类似于 Java 语言里点点点处理或 JavaScript 里的 Promise 的 then 处理。级联操作主要的目的是为了简化代码,示例如下:

复制代码
querySelector('#btnOK) // 获取一个 id 为 btnOK 的按钮对象
..text = '确定' // 使用它的成员
..classes.add('ButtonOKStyle')
..onClick.listen((e) => window.alert('确定'));

第一个方法调用 querySelector,返回一个按钮对象,然后再设置它的文本为“确定”,再给这个按钮添加一个样式叫’ButtonOKStyle’,最后再监听单击事件,事件弹出一个显示“确定”的 Alert。这个例子相当于如下操作:

复制代码
var button = querySelector('#btnOK);
button.text = '确定';
button.classes.add(''ButtonOKStyle'');
button.onClick.listen((e) => window.alert('确定'));

注意 严格来说,级联的“双点”符号不是运算符,这只是 Dart 语法的一部分。

Flutter技术入门与实战(27):开启Flutter之旅 3.4

购书地址 https://item.jd.com/12526484.html?dist=jd

评论

发布