Flutter - 基础内容

181 阅读3分钟

三、类

3.1 类基础

  • 创建

    class Animal {
      var name = "gou";
      var age = 12;
      info() {
        print("姓名 ${this.name}  年龄 ${this.age}");
      }
    }
    
  • 导入

    import 'class/Animal.dart';
    
  • 构造函数

      Person(String name, int age) {
        this.name = name;
        this.age = age;
      }
    
  • 默认构造函数

    Person(this.name, this.age);
    
  • 命名构造函数

    Person.setName(name) {
        this.name = name;
      }
    
  • 私有属性 (没有 public private) 加下划线也可以。 那属性就不能直接访问了, 但是如果想访问的话,可以通过公用的方法来访问。

    var _sex;
    
  • getter setter

    // get 方法相当于计算属性了
      get info {
        return "名字: wu  姓名: aaa";
      }
    ​
      // set 
      p.height = 22;
      print(p.animalHeight);
    ​
      set height(int height) {
        this.animalHeight = height;
      }
    
  • 实例化之前 初始化属性

      Person():this.name = "shuai" {
        print("${this.name}");
      }
    
  • 私有方法 和 私有属性是一样的。 加下划线就可以了。

3.2 类、静态成员、操作符、继承

  • 静态属性 和 静态方法 通过类名访问。 用static修饰就是静态的。 static String name = "xiaowu"

    • 非静态方法、 访问 静态属性。

      直接使用 name访问。 不需要前缀
      调用静态方法, 也是直接调用就可以。
      show();
      
    • 运算符

      1. ?

        // 如果p为空则不会调用方法了
        p?.info()
        
      2. as

        // 类型转换。 
        var p = new Object()
        var p = new Person()
        (p as Person).name; // 不转换访问不到 name
        
      3. is

        // 类型判断
        if (p is Person) {}
        
      4. ..

        // .. 可以连续访问对象的属性 和 方法。
        p1..name = "xiaowu"
          ..age = 14
          ..show();
        
      5. 继承 extends

        1. 子类要实现 父类的构造方法

          Animal(this.name, this.age);
          Dog(name, age) : super(name, age);
          
        2. 子类重写父类方法

          @override
          info() {
            super.info();
            print("姓名 ${this.name}  年龄 ${this.age}  性别: ${this.sex}");
          }
          

3.3 抽象类 、 接口、 多态

abstract class Car {
  run();
  info() {
    print("这是汽车");
  }
}
​
class audi extends Car {
  @override
  run() {
    print("奥迪再跑");
  }
}
​
class msds extends Car {
  @override
  run() {
    print("奔驰再跑");
  }
}
​
class bmw implements Car {
  @override
  info() {
    print("如果是 implements 就必须要重写父类的方法. extends 继承则不需要");
  }
​
  @override
  run() {
    print("宝马再跑");
  }
}
​
main(List<String> args) {
  Car car1 = new audi();
  Car car2 = new msds();
  car1.run();
  car2.run();
  car2.info();
​
  var bao = new bmw();
  bao.run();
}
  • 抽象类

    1. 抽象类的没有实现的方法,子类必须全部实现。
    2. 抽象类的方法,可以继承。
    用户定义一套标准。 子类可以继承抽象类、也可以实现抽象类的接口。
    
  • 多态

    父类定义变量,指向子类的实例。 父类定义方法,子类实现。每个子类有不同的表现形式。
    
  • 接口

    1. 什么是接口

      就是协议,定义一套规范

    2. 抽象类和接口有什么区别

      Dart 的就接口 就是通过抽象类来实现的。 子类如果 implements 就是实现了接口。 
      extendsimplements 的却别
      ​
      

      如果子类只是想使用父类的规范,不想继承他实现的方法。 就使用 implements

3.4 多继承、多接口。 with关键字

  • Dart 的 类 可以同时实现多个接口

    class LongCity implements Car, GuoChan {
      @override
      info() {
        // TODO: implement info
        throw UnimplementedError();
      }
    ​
      @override
      proInfo() {
        // TODO: implement proInfo
        throw UnimplementedError();
      }
    ​
      @override
      run() {
        // TODO: implement run
        throw UnimplementedError();
      }
    }
    
  • Dart 可以使用with 关键字实现多继承。

    注意 :

    1. 父类方法重复,根据继承关系,后面覆盖前面的
    2. with关键字的父类。称之为 mixins 类。 他不能继承别的类,只能继承 Object
    3. mixins 类 不能有构造函数
    class Car {
      var name = "Car";
      var num = 10000;
      run() {
        print("汽车再跑");
      }
    }
    ​
    class YiQi {
      info() {
        print("一汽大众");
      }
      productInfo() {
        print("中国一汽");
      }
    }
    ​
    class DaZhong {
      run() {
        print("大众再跑");
      }
    }
    ​
    class YiQiDaZhong extends Car with YiQi, DaZhong {
    }
    

3.5 泛型

  • 泛型方法

    getFormat<T>(T value) {
      return value;
    }
    getFormat<String>("Str");
    
  • 泛型类

    class MyList<T> {
      var list = [];
      add(T value) {
        this.list.add(value);
      }
      getList() {
        return this.list;
      }
    }
    ​
      var list = new MyList<String>();
      list.add("只能添加String类型的value");
      print(list.getList());
    
  • 泛型接口

    abstract class Cash<T> {
      saveObject(String key, T value);
      getObject(String key);
    }
    ​
    class meoryCash<T> implements Cash<T> {
      @override
      getObject(String key) {
      }
    ​
      @override
      saveObject(String key, T value) {
      }
    }
    

3.6 库

  • Dart 第三方库依赖于 pub 地址如下。

    pub.dev

  • 系统库使用

    // 系统库
    import 'dart:math';
    ​
    main(List<String> args) {
      var a = min(1, 2);
      print(a);
    }
    
  • 第三方库使用

    • 添加依赖。在项目根目录创建文件夹 pubsepec.yaml 文件。
    • 编辑内容如下
    name: startup_namer
    description: A new Flutter application.
    publish_to: 'none' # 希望项目能托管到 pub.dev 需要指定
    
    version: 1.0.0+1 # 版本号
     
    environment:  #  flutter sdk版本
      sdk: ">=2.7.0 <3.0.0"
     
    dependencies:
      # flutter:
      #   sdk: flutter
      cupertino_icons: ^0.1.3 # 一个图标库
      # https://pub.flutter-io.cn/packages/cupertino_icons
      # https://flutter.github.io/cupertino_icons/
      http: ^0.13.3
    
    # dev_dependencies: # 开发环境下依赖的包
    #   flutter_test:
    #     sdk: flutter
    # flutter:
    #   uses-material-design: true # 是否使用material-design 设计风格
    
    // 依赖库
    import 'package:http/http.dart' as http;
    
    • 下载依赖。 执行 pub get

    • 导入使用