Flutter笔记-Dart

数据类型

Dart 中常用的数据类型有:number、bool、string、list、map 等。

number

Dart 中 number 类型分为:int、double。其中

  • int 类型对应 Java 中的 int 和 long。
  • double 类型:64位双精度浮点数。
var x = 1;
var hex = 0x12345678;
// ↑↑↑ 不包含小数点,int 类型
// ↓↓↓ 包含小数点,double 类型
var x = 1.1;
var exponents = 1.42e5

ps:Dart 中没有 float 类型。

bool

Dart 中 bool 类型只包括 true 和 false。不支持 null、0、1等类型的判断。

string

与 Java 相同,Dart 中 string 对象包含一系列 UTF-16 代码单元。可以使用 '' 或 "" 来创建 string 对象。

string 对象支持使用 + 或者 进行字符串拼接,也支持 ${value} 表达式 。

var s = '单引号' "双引号" + "+" + "引号'嵌套'";
var s = """
        第一行
        第二行
        第三行
    		""";
var s = 's: $s , upper: ${s.toUpperCase()}';

List

Dart 中 List 即数组,数组中可存放不同类型的对象。

var list = [];
var list = new list();
var list = [1, "2", null];

Dart 同样支持扩展运算符......?

var list = [1, 2, 3];
var list2 = [0, ...?list];

Map

使用方式基本与 kotlin 一致。

变量

Dart 可以使用 var 和 dynamic 来声明变量。使用 var 声明变量时,编译期会自动推导出数据类型。使用 dynamic 来声明动态类型,编译期为 object 类型,运行期进行类型检查。

var a = 1;
var b = "2";
var c = true;
var d = {};
dynamic e = 1;
dynamic f = "2";

final、const 用来声明常量,static const 用来声明静态常量。const 在编译期确定值,final 在运行期确定值。所以,使用 const 声明常量时,必须在定义时进行赋值,final 则不必。

const g = "g";
final h = {"h", "i"};
static const j = "j";

与 kotlin 类似,Dart 变量自带 getter、setter 方法,当变量被 final 或 const 声明时,只有 getter 方法。

函数

Dart 中万物皆对象,所以函数也是一种对象,对象类型为 Function。

Dart 中没有 public、private 修饰符,以_开头的函数直接代表 private。Dart 中函数可以使用 @Protect 注解。

参数

函数中可以有任意数量个必选参数,后面可以跟有任意数量的命名参数或可选参数。

命名参数

命名参数是可选的,除非已将其明确标记为必填项。

定义函数时,使用 {param1,param2,…} 指定命名参数,调用函数时,使用paramName:value 指定命名参数。

// 定义
void enableFlags({bool? bold, bool? hidden}) {
  // ...
}
// 调用
enableFlags();
enableFlags(bold: true, hidden: false);

可选参数

在参数外包裹一层[],可以将其标记为可选参数。

// 定义
String say(String from, String msg, [String? device]) {
  // ...
}
// 调用
say('Bob', 'Howdy')
say('Bob', 'Howdy', 'smoke signal');

参数默认值

使用=定义参数的默认值。默认值必须是编译时常量,如果未提供默认值,则默认值是 0。

// 定义命名参数的默认值
void enableFlags({bool bold = false, bool hidden = false}) {
  // ...
}
// 调用
enableFlags(bold: true);

注意:命名参数和可选参数不能同时使用在一个函数内。

// 定义可选参数的默认值
String say(String from, String msg, [String device = 'carrier pigeon']) {
  ...
}
// 调用
say('Bob', 'Howdy');

Dart 中可被 const 修饰的数据类型均可作为参数的默认值进行传递。

构造函数

同 Java 一样,在未声明构造函数时,Dart 会提供默认的无参构造函数。不同的是,子类不会从父类继承构造函数,相当于父类的构造函数被标上了 @inherited 注解。

命名构造函数

Dart 支持对声明的构造函数进行命名,方法名称可以随意设置。

class A {
  String name;
  A.init(this.name);
  // A.init(); error
}

class B extends A {
  B.init(String name) : super.init(name);
}

void main() {
  var b = B.init("b");
  print(b.name);
}
  • 子类不会继承父类的命名构造函数,当需要使用父类定义的命名函数来创建子类,则必须在子类中实现该命名构造函数。

  • 命名构造函数不可被重载。

混合继承

不同于 Java,Dart 支持混合继承。使用with关键字,后跟一个或多个 mixin 名称,即可在多个类层次结构中重用类代码。

class A extends B with C {
  // ···
}

mixin B {
  bool b = false;
}
  • 若被混合继承的类,不会作为一个常规类被创建实体对象,推荐使用mixin关键字替代class,并且不声明构造函数。
  • 类的无参构造函数执行有先后顺序:B -> C -> A

运算符

除常规的运算符外,Dart 也支持部分特殊的运算符。

条件表达式

Dart 有两种快速实现 if-else 判断的条件表达式,分别为???

condition ? expr1 : expr2

与 Java 中三目运算符相同,如果条件为 true,则求值 expr1(并返回其值);否则为 false,求值并返回expr2的值。

expr1 ?? expr2

如果 expr1 不为 null,则返回其值;否则,求值并返回 expr2 的值。

该运算符同样支持赋值语句expr1 ??= expr2,当且仅当 expr1 为 null 时,为其赋 expr2 的值。

控制流表达式

Dart 中的控制流表达式与 Java 中的大同小异,主要在 switch-case 中有些差异。

switch-case

  • switch 支持 string。
  • 支持使用 continue + tag,来执行指定的 case 语句。

级联操作符

.. 允许对同一对象执行一系列操作。除了函数调用,还可以访问同一对象上的字段。

getPaint()
  ?..color = Colors.black
  ..strokeCap = StrokeCap.round
  ..strokeWidth = 5.0;

?..短路级联可以对级联操作的对象进行判空,避免异常的发生。


常用的 Dart 语法就这些,后续有需要会进行更新。不得不说,Dart 老缝合怪了。。。


参考

https://dart.dev/guides/language/language-tour

上一篇:文学-谚语-英文谚语:英文谚语


下一篇:Flutter高级进阶实战 仿哔哩哔哩APP