Flutter 学习笔记 - Dart 语法要点记录

395 阅读2分钟

声明字段关键字

  • var:用来修饰变量。
  • const:用来修饰常量,编译时需要一个确定的值,一般会赋值一个常量值。
  • final:用来修饰常量,运行时需要一个确定的值,可以赋值一个表达式。
main(List<String> args) {
    var name = "jack";
    final age = getAge();
    const height = 2.0;
    // const height = getHeight();这句代码会报错
}
getAge() {
    return 20;
}

getHeight() {
    return 2.0;
}

布尔值

值为 true 和 false。判断表达式必须为 Bool 类型,Dart 不支持 非 0 即真非空即真

格式化输出

使用 ${}的格式来拼接字段。若拼接的为变量或者常量,则 {} 可省略,若拼接的为表达式则 {} 不可省略。

var name = "jack";
final age = 20;
const height = 2.0;
print("name is $name, age is $age, height is $height");
print(" age type is ${age.runtimeType});

运算符

  • ?? :用来给值为空的变量提供默认值(与 Swift 中的解包给默认值作用一样)。
var name = "jack";
var null_name = null;
print("name is $name, null_name is $null_name");
final result = null_name ?? "default";
print("result is $result");
  • 级联运算符

函数

  • Dart 中函数为一等公民。
  • Dart 中没有函数重载。
  • Dart 中的可选参数,只有可选参数才有默认值。
    • 位置可选,用 [] 修饰。强调位置,顺序不能搞错。
    run("aaa", 1); // run("aaa", 1.0); 会报错,因为 age 为 int 类型
    void run(String name, [int? age, double? height]) {}
    
    • 命名可选,用 {} 修饰。不强调顺序,一般使用这个。
    run("aaa", age: 1);
    void run(String name, {int? age, double? height}) {}
    
  • 匿名函数
typedef Handler = void Function();
void send(Handler handler) {
    handler();
}

send(() {
    print("send function");
});
  • 箭头函数:函数体只有一行的匿名函数
send(() => print("send function"));
  • 必传参数:必须传的参数,不传编译直接报错; @require 可选命名参数的注解,不传编译不报错,但有警告。

  • 构造函数语法糖
class Person {
    String name = "";
    int age = 0;
    Person(this.name, this.age); // 效果等同下面
    // Person(String name, int age) {
        // this.name = name;
        // this.age = age;
    // }
}
  • Object 与 dynamic
// 编译报错
Object name = "abcd";
print(name.substring(1));
// 编译不报错可正常运行,存在安全隐患,可能会类型不对导致方法找不到。
dynamic name2 = "abcd";
print(name2.substring(1));
  • 重定向构造函数。
class Person {
    String name;
    String level;
    Person(String name) : this._internal(name, "default");
    // 重定向构造函数
    Person._internal(this.name, this.level);
}
  • 工厂构造函数,通过 factory 关键字标识。它可以手动返回对象。
class Person {
  String name;
  String level;

  Person(String name) : this._internal(name, "default");
  Person._internal(this.name, this.level);
  // 工厂构造函数的实现
  factory Person.WithNameAndLevel(String name, String level) {
    if (name.isEmpty) {
      return Person("default");
    } else {
      Person p = Person(name);
      p.level = level;
      return p;
    }
  }
}
  • 常量构造函数,每个类只能有一个常量构造函数。
class Person {
  final String name;
  const Person(this.name);
}
  • 抽象类,使用 abstract 标识。继承自抽象类的子类必须实现抽象方法。类似于 Swift 中的 protocol。
abstract class DoHomeWork {
  void dowork();
}

class Person extends DoHomeWork {
  @override
  void dowork() {
    print("dowork");
  }
}
  • mixin,使用 mixin 和 with 关键字。
mixin DoHomeWork {
  void dowork();
}

class Person with DoHomeWork {
  void dowork() {
    print("dowork");
  }
}
  • 库的使用
    • 可以使用 as 关键字给库起别名。
    • 导入默认会导入所有的代码,可以使用 show 或 hide 来控制。
    • _ 用来区分公开和私有。