Flutter 学习(二) dart基础语法

501 阅读3分钟

dart 语法的 构造函数生成 继承 实现 泛型 导包方式

构造函数

1. 普通构造函数

//普通构造函数
class Point {
  num x;
  num y;
  Point(num x, num y){
    this.x = x;
    this.y = y;
  }
}

2. 简化构造函数

class Point {
  num x;
  num y;
  //简化构造
  Point(this.x, this.y);
}

3. 命名构造

class Point {
  num x;
  num y;
  //命名构造函数
  Point.fromJson(Map json) {
    x = json['x'];
    y = json['y'];
  }
}

4. 重定向构造

class Point {
  num x;
  num y;
  Point(this.x, this.y);
  //重定向构造函数 使用冒号调用其他构造函数
  Point.alongXAxis(num x) : this(x, 0);
  }

5. 调用超类构造函数


class Parent {
  int x;
  int y;

  //超类命名构造函数不会传递,如果希望使用超类中定义的命名构造函数创建子类,则必须在子类中实现该构造函数
  Parent.fromJson(x, y)
      : x = x,
        y = y {
  }
}

class Child extends Parent {
  int x;
  int y;

  //如果超类没有默认构造函数, 则你需要手动的调用超类的其他构造函数
  Child(x, y) : super.fromJson(x, y) {
    //调用超类构造函数的参数无法访问 this
  
  }
  //在构造函数的初始化列表中使用 super(),需要把它放到最后
  Child.fromJson(x, y)
      : x = x,
        y = y,
        super.fromJson(x, y) {

  }
}

6. 常量构造

用const 创建的对象 为同一个对象 var p2 = const Point2(4, 4);//常量对象 var p21 = Point2(4, 4); //创建的是非 常量对象

class Point2 {
  //定义const构造函数要确保所有实例变量都是final
  final num x;
  final num y;
  static final Point2 origin = const Point2(0, 0);

  //const关键字放在构造函数名称之前,不能有函数体
  const Point2(this.x, this.y);

  @override
  String toString() {
    return 'Point2(x = $x, y = $y)';
  }
}

7. 工厂方法构造函数

class Singleton {
  String name;
  static Singleton _cache; //工厂构造函数无法访问 this。所以这里要静态的

  //工厂构造函数,关键字factory
  //工厂构造函数是一种构造函数,与普通构造函数不同,工厂函数不会自动生成实例,而是通过代码来决定返回的实例对象.
  factory Singleton([String name = 'singleton']) => Singleton._cache ??= Singleton._newObject(name);

//定义一个命名构造函数用来生产实例
  Singleton._newObject(this.name);
}

get set 方法

每个实例变量都隐含的具有一个 getter, 如果变量不是 final 的则还有一个 setter,可以通过实行 getter 和 setter 来创建新的属性, 使用 get 和 set 关键字定义 getter 和 setter

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

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

  //获取right值
  num get right => left + width;
  //设置right值,同时left也发生变化
  set right(num value) => left = value - width;
  //获取bottom值
  num get bottom => top + height;
  //设置bottom值,同时top也发生变化
  set bottom(num value) => top = value - height;
}

重载运算符

可以对对象进行比较 + - * / > <

//重载操作符
class Vector {
  final int x;
  final int y;

  const Vector(this.x, this.y);

  //重载+
  Vector operator +(Vector v) {
    return new Vector(x + v.x, y + v.y);
  }

  //重载-
  Vector operator -(Vector v) {
    return new Vector(x - v.x, y - v.y);
  }
}

使用方式

//重载操作符
  final v1 = Vector(2, 3);
  final v2 = Vector(2, 2);
  final r1 = v1 + v2;
  final r2 = v1 - v2;
  print([r1.x, r1.y]);
  print([r2.x, r2.y]);

多继承 mixins 实现 implements

java 不可以多继承在dart中 with 来实现多继承

class Car extends Transportation
    with
        FourWheelTransportation,
        MiddleSafetyIndex,
        GasolineEnergyTransportation {
  @override
  void transport() {
    print(
        "汽车:\n动力组件: ${powerUnit()} , 安全指数: ${safetyIndex()} , 动力来源:${energy()}");
  }

泛型

1.构造方法泛型

//构造函数泛型
class Phone<T> {
  final T mobileNumber;
  Phone(this.mobileNumber);
}

2. 泛型函数

  //泛型函数
  K addCache<K, V>(K key, V value) {
    K temp = key;
    print('${key}: ${value}');
    return temp;
  }

3. 泛型限制 extends


//泛型限制
class Massage<T extends FootMassage > {
  final T massage;
  Massage(this.massage);
}

导入类库 import

  • as 冲突标识符号,区分不同类库同样名字的两个引用 as后面的名称可以随便写
  • show 载入库的某些部分
  • hide 筛选掉库的某些部分
  • deferred 延迟载入 使用时再去引入
  • library 组合导入,将多个文件组合导入
import 'dart:math'; //载入核心库

import 'package:dio/dio.dart'; //载入第三方库

import 'mylib1.dart' as lib1; //载入文件
import 'mylib2.dart' as lib2; //如果两个库有冲突的标识符,可以为其中一个或两个库都指定前缀

import 'mylib1.dart' as lib1 show Test; //只载入库的某些部分
import 'mylib2.dart' as lib2 hide Test; //筛选掉库的某些部分

import 'mylib1.dart' deferred as lazyLib; //延迟载入

import 'mylib/mylib.dart';//载入自定义库****

//组合导入

library material;
export 'ScreenAdapter.dart';
export 'AutoSizeConfig.dart';