Flutter 學習(二) dart基礎語法

dart 語法的 構造函數生成 繼承 實現 泛型 導包方式java

構造函數

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); //建立的是非 常量對象json

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;
}
複製代碼

重載運算符

能夠對對象進行比較 + - * / > <bash

//重載操做符
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);
  }
}
複製代碼

使用方式ide

//重載操做符
  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';
複製代碼
相關文章
相關標籤/搜索