Skip to content

Fultter开发 —— Dart语法 #39

@Hancoson

Description

@Hancoson

变量

var name = 'Bob';

Default value(默认值)

没有初始化的变量自动获取一个默认值为 null。

int lineCount;
assert(lineCount == null);
// Variables (even if they will be numbers) are initially null.

Optional types(可选的类型)

在声明变量的时候,你可以选择加上具体 类型:

String name = 'Bob';

添加类型可以更加清晰的表达你的意图。 IDE 编译器等工具有可以使用类型来更好的帮助你, 可以提供代码补全、提前发现 bug 等功能。

Final and const

如果你以后不打算修改一个变量,使用 final 或者 const。 一个 final 变量只能赋值一次;一个 const 变量是编译时常量。 (Const 变量同时也是 final 变量。) 顶级的 final 变量或者类中的 final 变量在 第一次使用的时候初始化。

Built-in types(内置的类型)

Dart 内置支持下面这些类型:

  • numbers
    • int
    • double
  • strings
  • booleans
  • lists(array)
  • maps
  • runs(用于在字符串中表示 Unicode 字符)
  • symbols

使用三个单引号或者双引号也可以 创建多行字符串对象

var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";

Dart 有一个名字为 bool 的类型。 只有两个对象是布尔类型的:true 和 false 所创建的对象, 这两个对象也都是编译时常量。

赋值操作符

??= 操作符用来指定 值为 null 的变量的值。

b ??= value; // 如果 b 是 null,则赋值给 b;
             // 如果不是 null,则 b 的值保持不变

条件表达式

expr1 ?? expr2
如果 expr1non-null,返回其值; 否则执行 expr2 并返回其结果。

级联操作符 ..

级联操作符 (..) 可以在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操作符可以避免创建 临时变量, 并且写出来的代码看起来 更加流畅:

例如下面的代码:

querySelector('#button') // Get an object.
  ..text = 'Confirm'   // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

第一个方法 querySelector()`` 返回了一个 selector` 对象。 后面的级联操作符都是调用这个对象的成员, 并忽略每个操作 所返回的值。

上面的代码和下面的代码功能一样:

var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

断言(Assert)

如果条件表达式结果不满足需要,则可以使用 assert 语句俩打断代码的执行。 下面介绍如何使用断言。 下面是一些示例代码:

// Make sure the variable has a non-null value.
assert(text != null);

// Make sure the value is less than 100.
assert(number < 100);

// Make sure this is an https URL.
assert(urlString.startsWith('https'));

注意: 断言只在检查模式下运行有效,如果在生产模式 运行,则断言不会执行。

使用 import 来指定一个库如何使用另外 一个库。import 必须参数为库的 URI。 对于内置的库,URI 使用特殊的 dart: scheme。 对于其他的库,你可以使用文件系统路径或者 package: schemepackage: scheme 指定的库通过包管理器来提供, 例如 pub 工具。

import 'dart:io';
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';

Lazily loading a library(延迟载入库)

Deferred loading (也称之为 lazy loading) 可以让应用在需要的时候再 加载库。 下面是一些使用延迟加载库的场景:

  • 减少 APP 的启动时间。
  • 执行 A/B 测试,例如 尝试各种算法的 不同实现。
  • 加载很少使用的功能,例如可选的屏幕和对话框。
  • 要延迟加载一个库,需要先使用 deferred as 来 导入:
import 'package:deferred/hello.dart' deferred as hello;

当需要使用的时候,使用库标识符调用 loadLibrary() 函数来加载库:

greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

元数据(Metadata)

使用元数据给代码添加更多的信息。
元数据是以@开始的修饰符。在`@`` 后面接着编译时的常量或调用一个常量构造函数。
目前Dart语言提供的三个可用的@修饰符:

工厂构造函数

  • 工厂构造函数是一种构造函数,与普通构造函数不同,工厂函数不会自动生成实例,而是通过代码来决定返回的实例对象。
  • 工厂构造函数的关键字为factory,下面我们用工厂构造函数写一个只能创造一个实例的类。
  • 工厂构造函数类似于static静态成员,无法访问this指针,所以在工厂构造函数中能处理的任务较为有限。
  • 使用工厂构造函数时往往需要定义一个命名构造函数用来生产实例。
    例子:
class Model {
  final String id;
  final String name;

  Recommend({this.id, this.name});

  factory Model.fromJson(Map<String, dynamic> json) {
    return Model(
      id: json['id'],
      name: json['name']
    );
  }
}

3.8 工厂构造函数 – 《简单易懂的Dart》 - BlackGlory

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions