Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fultter开发 —— Dart语法 #39

Open
Hancoson opened this issue Aug 6, 2019 · 0 comments
Open

Fultter开发 —— Dart语法 #39

Hancoson opened this issue Aug 6, 2019 · 0 comments
Labels

Comments

@Hancoson
Copy link
Owner

Hancoson commented Aug 6, 2019

变量

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant