Dart语法(二)

Dart语法学习

  • 运算符
  1. 特殊运算符
  var name = "lilei";
  name ??= "who";
  print(name);

??= - 原来的变量有值时,那么??=不执行

  var age = null;
  var tmp = age ?? 20;
  print(tmp);

?? - 前面的数据有值,那么就使用前面的值;前面值为null,那么就使用后面的值

  1. 级联运算符
main(List args) {
  var p = Person();
  p.name = "why";
  p.run();
  p.eat();

  //02_级联
  var p2 = Person()
           ..name = "why"
           ..eat()
           ..run();
}

class Person {
  String name;
  void run() {
    print("runing");
  }
  void eat() {
    print("eating");
  }
}
  1. for循环
main(List args) {
  //1. 基础for循环
  for (var i = 0; i < 10; i++) {
        print(i);
  }

  for (var name in ['a', 'b', 'c', 'd']) {
            print(name);
  }
}
  • 面向对象
  1. 类的定义
main(List args) {
  var p = Person('why', 18);

  var s = Student('二年级', 180.0);
}

class Person {
  String name;
  int age;
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

  class Student {
    String level;
    double height;
    Student(this.level, this.height);
  }
  1. 类的构造函数
    2.1 创建对象
main(List args) {
  //1. 创建Person对象
  var p0 = Person("namei", 16);
  print(p0.toString());
}
  class  Person  {
    String name;
    int age;
    double height;

    Person(this.name, this.age);

    @override
    String toString() {
    // TODO: implement toString
    return "$name $age $height";
    }
}

2.2 Object与dynamic的区别

  Object obj = "who";
  obj = 1;
  print(obj.substring(1));

编译报错

  dynamic obj2 = "who";
  obj2 = 1;
  print(obj2.substring(1));

编译不报错,但是运行时肯能报错
注:定义指定类型变量后,需要赋值其他类型值,使用dynamic,编译时不报错,但是运行时可能会因为找不到方法而报错
2.3 命名构造函数

main(List args) {
  //命名构造函数
  var p = Person.withNameAgeHeight("lufei", 18, 175.0);
  print(p.toString());

   var p1 = Person.fromMap({"name":"qiaozhi", "age":19, "height":170.0});
   print(p1);
  }

  class  Person  {
    String name;
    int age;
    double height;

    //命名构造函数
    Person.withNameAgeHeight(this.name, this.age, this.height);
    Person.fromMap(Map map) {
      this.name = map["name"];
      this.age = map["age"];
      this.height = map["height"];
    }

    @override
   String toString() {
     // TODO: implement toString
     return "$name $age $height";
  }
}
  1. 类的初始化列表
main(List args) {
  var p = Person("lufei");
}

class  Person {
  final String name;
  final int age;
  Person(this.name, {int age}): this.age = age ?? 10;
} 
  1. 重定向构造函数
main(List args) {
  var p = Person("who");
  print(p.age);
}

class  Person  {
  String name;
  int age;

  //构造函数的重定向
  Person(String name): this._internal(name, 10);
  //命名构造函数
  Person._internal(this.name, this.age);
}
  1. 常量构造函数
main(List args) {
  const p1 = Person("why");
  const p2 = Person("why");
  print(identical(p1, p2));
}

class Person {
  final String name;

  const Person(this.name);
}
  1. 工厂构造函数
main(List args) {
  //要求:两个对象的name或者color相同,则返回同一个对象
  final p1 = Person.withName("why");
  final p2 = Person.withName("why");
  print(identical(p1, p2));

  final p3 = Person.withColor("red");
  final p4 = Person.withColor("red");
  print(identical(p3, p4));
}

class  Person  {
  String name;
  String color;

  static final Map _nameCache = {};
  static final Map _colorCache = {};

  factory Person.withName(String name) {
    if (_nameCache.containsKey(name)) {
      return _nameCache[name];
    } else {
      final p = Person(name, "default");
      _nameCache[name] = p;
      return p;
    }
  }

  factory Person.withColor(String color) {
    if (_colorCache.containsKey(color)) {
      return _colorCache[color];
    } else {
      final p = Person("normal", color);
      _colorCache[color] = p;
      return p;
    }
  }

  Person(this.name, this.color);
}
  1. 类的setter和getter
main(List args) {
  
  final p = Person();
  //直接访问属性
  p.name = "who";
  print(p.name);

  p.setName = "haha";
  print(p.getName);
}
  
class Person {
  String name;

  //setter
  set setName(String name) {
    this.name = name;
  }

  //getter
  String get getName {
    return name;
  }
}
  1. 类的继承
class Animal {
  int age;

  Animal(this.age);
}

class Person extends Animal {
  String name;

  Person(this.name, int age): super(age);
}
  1. 抽象类
main(List args) {
  // final Shape shape = Shape();
}
//抽象类不能实例化;实现工厂构造函数后可以初始化
abstract class Shape {
  double getArea();

  String getInfo() {
    return "形状";
  }

  // factory Shape() {
  //   return null;
  // }
}

class Rectangle extends Shape {
  @override
  double getArea() {
    // TODO: implement getArea
    return 100.0;
  }
  1. 隐式接口
//Dart中没有哪一个关键字是来定义接口的
//没有这些关键字interface/protocol
//当 讲一个类当做接口使用时,那么实现这个接口的类,必须实现这个接口中所有方法
class  Runner {
  void running() {

  }
}

class Flyer {
  void flying() {

  }
}

class Animal {
  void eating() {
  }
}

class Surper extends Animal implements Runner, Flyer {
  //继承的类调用方法时可以调用super的方法
  @override
  void eating() {
    // TODO: implement eating
    super.eating();
  }
  //实现的类的方法不能调用super的方法
  @override
  void running() {
    // TODO: implement running
  }

  @override
  void flying() {
    // TODO: implement flying
  }
  1. mixin混入
main(List args) {
    final sm = Surper();
    sm.running();
    sm.flying();
}

mixin  Runner {
  void running() {
    print("Runner runing");
  }
}

mixin Flyer {
  void flying() {
    print("Flyer flying");
  }
}

class Animal {
  void eating() {
    print("Animal eating");
  }
}

//混入的语法:
//1. 定义可混入的类时,不能用class,用mixin
//2.with进行混入
//3. 自己实现了混入类的方法时,调用自己的
class Surper extends Animal with Runner, Flyer {
  //继承的类调用方法时可以调用super的方法
  @override
  void eating() {
    // TODO: implement eating
    super.eating();
  }

  void running() {
    print("Surper running");
  }
}
  1. 类属性和类方法
class Person {
  //成员变量
  String name;

  //静态属性(类属性)
  static String courseTime;

 //对象方法
  void eating() {
    print("eating");
  }

 //静态方法(类方法)
 static void gotoCourse() {
   print("去上课");
 }

}
  1. 枚举
main(List args) {
  final color = Colors.red;

  switch(color) {
    case Colors.red:
      print("红色");
      break;
    case Colors.blue:
      print("蓝色");
      break;
    case Colors.green:
      print("绿色");
      break;
  }

  print(Colors.values);
  print(Colors.red.index);
}

enum Colors {
  red,
  blue,
  green
}
  • Dart中库的使用
  1. 系统库的使用
import 'dart:math'; //核心库不需要导入

//系统库: import ‘dart:库名‘;
main(List args) {
  final num1 = 20;
  final num2 = 30;
  print(min(num1, num2));
}
  1. 自定义库的使用
/*
* 1. as关键字给库起别名
* 2. 默认情况导入一个库时,导入这个库中所有的公共属性和方法
*   2.1 show:指定导入的内容
*  2.2 hide:因此某个要导入的内容,导入其他内容
* 3. 公共的dart文件的抽取:export
* 4. _用来区分私有方法
*/
// import 'utils/math_utils.dart' as mUtils;
// import 'utils/math_utils.dart' show sum hide mul;
// import 'utils/date_utils.dart';

import 'utils/utils.dart';

main(List args) {
  print(sum(20, 30));
  // print(mul(20, 30));
  print(dateFormat());

  min(20, 30);
}
//utils/
//date_utils.dart
String dateFormat() {
  return "2020-06-23";
}
//math_utils.dart
int sum(int num1,int  num2) {
    return num1 + num2;
}

int mul(int num1,int num2) {
    return num1 - num2;
}

int min(int num1, int num2) {
  return num1 > num2 ? num2 : num1;
}
//utils.dart
export 'math_utils.dart';
export 'date_utils.dart';
  1. 第三方库的使用
import 'package:http/http.dart' as http;
//导入第三方库 在pubspec.yaml中 dependencies  加入http: ^0.12.1
//安装第三方库 pub get
//await关键字必须在async中才能使用
main(List args) async {
var url = 'https://example.com/whatsit/create';
var response = await http.post(url, body: {'name': 'doodle', 'color': 'blue'});
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');

print(await http.read('https://example.com/foobar.txt'));
}
//pubspec.yaml
name:  coderwhy
description: a dart libary
dependencies: 
  http: ^0.12.1

生活如此美好,今天就点到为止。。。

你可能感兴趣的:(Dart语法(二))