为了学 Flutter 入门了一下 Dart,长得还挺像 ES6 的(既然如此那你为什么没有函数式编程.jpg

五种基本类型

  1. int

  2. double

  3. String

  4. bool

  5. dynamic 动态类型

int, double

main(){
    int amount1 = 100;
    var amount2 = 200;
    print('Amount1: $amount1 | Amount2: $amount2 \n');

    double dAmount1 = 100.11;
    var dAmount2 = 200.22;

    bool isTrue = true;
    var isFalse = false;

    dynamic weakVariable = 100;
    weakVariable = 'newValue';
}

String

    String name1 = 'name1';
    var name2 = "name2";    // 单双引号都可以
    var s = r'In a raw string, not even \n gets special treatment.';   // Raw String,这里的 \n 也会被打印出来

    // 换行字符串
    var s1 = '''
    you can create
    multi-line strings like this one.
    ''';
    var s2 = """This is also a
    multi-line string.""";

字符串和数字的转化

    // Stirng -> int
    var one = int.parse('1');
    assert(one == 1);

    // String -> double
    var onePointOne = double.parse('1.1');
    assert(onePointOne == 1.1);

    // int -> String
    String oneAsString = 1.toString();
    assert(oneAsString == '1');

    // double -> String
    String piAsString = 3.14159.toStringAsFixed(2);
    assert(piAsString == '3.14');

常量 const

const aConstNum = 0;

运算符

(?.), (??), (??=)

main(){
    var n;
    int number;

    number = n?.num ?? 0;
}
main(){
    int number;
    print(number ??= 100);  // 100
    print(number);  // 同样输出 100。100 被永久分配给 number
}

Type Test

main(){
    var x = 100;

    if(x is int){
        print('integer');
    }
}

条件语句

main(){
    int number = 90;

    if(number % 2 == 0){
        print("Even");
    }
    else if (number % 3 == 0){
        print('Odd');
    }
    else {
        print('Confused');
    }
}
main(){
    int number = 0;

    switch(number){
        case 0:
            print('Even');
            break;
        case 1:
            print('Odd');
            break;
        default:
            print('Confused');
    }
}

笔记内容来自:Dart Programming Tutorial - Full Course

循环

standard for loop

for(var i = 0; i < 10; i++){
    print(i);
}

for-in loop

var numbers = [1, 2, 3];

for(var n in numbers) {
    print(n);
}

forEach loop

var numbers = [1, 2, 3];

numbers.forEach((n) => print(n));

while loop

int num = 5;

while(num > 0){
    print(num);
    num -= 1;
}

// 或者
do {
    print(num);
    num -= 1;
} while(num > 0);

break and continue

for(var i = 0; i < 10; i++){
    if(i > 5)   break;
    print(1);
}

for(var i = 0; i < 10; i++){
    if(i % 2 == 0)   continue;
    print(1);
}

collection

list 数组

// 其中 <String> 可选,能限制数组的类型;const 也是可选的,防止数组的元素被变更
List <String> names = const ['lzz', 'nz'];
print(names[0], names.length);

复制数组

// 直接 names2 = names,获得的只是引用
List <String> names = ['Jack', 'Jill'];

var names2 = [...names];

Set

var halogens = {'name1', 'name2', 'name1'};

for(var x in halogens){
    print(x);   // name1 只打印一次
}

创建空集合

var halogens = <String>{};
Set <String> names = {};

Map

var map = {
    'one': 'one',
    'two': 'two'
};

print(map['one']);
var map = Map();
map['first'] = 'one';

Function

dynamic square(var num) {
    return num * num;
}

// 或者箭头函数
dynamic square(var num) => num * num;

命名参数

main(){
    print(sum(num2: 4, num1: 2));
}

dynamic sum({var num1, var num2}) => num1 + num2;

或者像这样混用也可以:

main(){
    print(sum(4, num2: 2));
}

dynamic sum(var num1, {var num2}) => num1 + num2;

dart 也支持默认参数

main(){
    print(sum(4));
}

dynamic sum(var num1, {var num2=0}) => num1 + num2;

还支持将某参数设置为可选

main(){
    // 没有传第二个参数的情况下也不会报错
    print(sum(4));
}

dynamic sum(var num1, [var num2=0]) => num1 + (num2 ?? 0);

Class

class Person {
    final name; // 只能在构造函数里被赋值一次
    int age;

    static const int number = 10;   // 静态常量。只能通过类访问(Person.age),而不能通过实例(person1.age)

    // 或者:Person(this.name, [this.age = 18]);
    Person(String name, [int age = 18]) {
        this.name = name;
        this.age = age;
    }

    // 在默认构造函数之外,如何创造其他构造函数(name constructor)
    Person.guest() {
        // 在 Dart 中,this 关键字用于明确区分类的 实例变量 和构造函数或方法中的 局部变量/参数,但当没有歧义时,可以省略 this。
        name = 'Guest';
        age = 18;
    }

    // 实例方法
    void showOutput() {
        print(name);
        print(age);
    }
}

void main() {
    Person person1 = Person();

    person1.name = 'name';
    person1.age = 18;
    person1.showOutput();

    // 或者
    Person person2 = Person('name2');

    var person3 = Person.guest();
    person3.showOutput();
}

继承

class Vehicle {
    String model;
    int year;

    Vehicle(this.model, this.year) {
        print(this.model);
        print(this.year);
    }

    void showOutput() {
        print(model);
        print(year);
    }
}

class Car extends Vehicle {
    double price;

    Car(String model, int year, this.price) : super(model, year);

    void showOutput() {
        super.showOutput();
        print(this.price);
    }
}

方法覆盖:@override

class Vehicle {
    String model;
    int year;

    Vehicle(this.model, this.year) {
        print(this.model);
        print(this.year);
    }

    void showOutput() {
        print(model);
        print(year);
    }
}

class Car extends Vehicle {
    double price;

    Car(String model, int year, this.price) : super(model, year);

    @override
    void showOutput() {
        print(this.price);
    }
}

getter 和 setter

class Rectangle {
    num left, top, width, height;

    Rectangle(this.left, this.top, this.width, this.height);

    num get right => left + width;
    // 这并不是真的在给 right 赋值,而是:left 应该自动变成 value - width,才能使 right = value 成立
    set right(num value) => left = value - width;
}

Exception Handling

int mustGreaterThanZero(int val) {
    if(val < 0){
        throw Exception('Value must be greater than zero');
    }
    return val;
}

void letVerifyTheValue(var val) {
    var valueVerification;

    try {
        valueVerification = mustGreaterThanZero(val);
    }
    catch(e) {
        print(e);
    }
    finally {

    }
}

// 如果程序有特定类型的错误
try {

} on OutOfLlamasException {

} on Exception catch (e) {

} catch (e) {

}