2个小时学懂Dart语言

2023-03-18  本文已影响0人  iOS虞
  1. Dart基本语法
// 程序入口
void main(List<String> args) {
  print("hello world");
}

1.1 声明变量

//明确声明一个字符串变量
String name = "yzk";

//类型推导方式
var age = 30;

//声明常量
//const和final区别:const在编译期间必须要有一个确定的值;final可以在运行期间确定值
final pi = 3.14;
const city = "北京市";

1.2字符串类型

// 定义字符串
var str1 = 'abc';
var str2 = "abc";
var str3 = """
                        abc
                        def
                        xyz
            """

// 字符串拼接
var name = "yzk";
var age = 10
var height = 100

// ${变量名} 也可以省略{}
var message = "my name is ${name}, age is $age, height is $height";

1.3 集合类型

// List列表
var names = ["张三", "李四", "王五"];
//Set集合
var games = {"王者荣耀", "刺激战场", "英雄联盟"}
//Map映射(字典)
var hero = {
    "name" : "鲁班",
    "hp" : 50,
    "mp" : 50
}
  1. 函数使用
    返回类型 方法名(参数类型 参数名,...) {}
// 返回值可以省略(开发中不推荐,容易挨揍)
int sum(int num1, int num2) {
  return num1 + num2;
}

// 必选参数
void test1(String str) {
}
// Dart中没有函数重载,不能定义方法名相同,方法签名不一样的函数

// 位置可选参数,调用的时候必须按顺序传值也可以省略,但是只能省略右面的,只有这样赋值的时候才不会歧义
void test2(String str, [int? age, double? height]) {
}

// 命名可选参数
// 调用时名字不能省略,参数顺序可以任意(推荐使用这种方式)
void test3(String str, {int? age, double? height}) {
}

2.1 函数式

// 函数可以做为另一个函数的参数

void main(List<String> args) {
  test(add);
  //匿名函数
  test(() {
      print("匿名函数");
  });
  //箭头函数,条件是函数体只有一行代码
  test(() => print("箭头函数"));
}
void test(Function foo) {
}

void add() {
}
// 使用Function作为参数,不能约束是否一定要传参数或参数类型
// 例如:

void main(List<String> args) {
  // 调用
  test(name);

  test2((n1, n2) {
    print(n1);
    print(n2);
  });


}
void test(Function foo) {
  // 这时候就不能约束参数和类型了
  foo();
  foo("yzk");
  foo(123);
}
void name(String n) {

}

//转变成这种写法
void test2(void foo(int n1, int n2)) {
    foo(20, 30);
}

// 优雅的写法
typedef Calculate = void Function(int n1, int n2);

void test3(Calculate calculate) {
  calculate(100, 200);
}
  1. 特殊的运算符
//赋值运算符
//当name是null的时候,执行赋值操作
var name;
name ??= "yzk";

// 当name1是null时,把??后面的赋值给temp
// 当name1非null时,把??前面的赋值给temp
var name1;
var temp = name1 ?? "yzk";
  1. 面向对象

4.1 类的定义

class Person {

}

4.2 构造函数

class Person {
  String? name;
  int? age;
  double? height;
  
  Person(this.name, this.age);
  
  // 命名构造函数
  Person.whith(this.name, this.age, this.height);
  
  Person.forMap(Map<String, dynamic> map) {
      this.name = map["name"];
      this.age = map["age"];
      this.height = map["height"];
  } 
}
// 构造函数成定向
class Person {
  String name;
  int age;
  // 构造函数重定向
  Person(String name): this.internal(name, 0);
  Person.internal(this.name, this.age);
}
// 常量构造函数
void main(List<String> args) {
  
  const p1 = Person("yzk");
  const p2 = Person("yzk");
  print(identical(p1, p2));

}
class Person {
  final String name;
  const Person(this.name);
}  
class Person {
  String name;
  String color;
  
  static final Map<String, Person> nameCache = {};
  static final Map<String, Person> colorCache = {};

  // 工厂构造函数最大的特点:可以手动的返回一个对象
  factory Person.withName(String name) {
    if (nameCache.containsKey(name)) {
      return nameCache[name]!;
    } else {
      final p1 = Person(name, "default");
      nameCache[name] = p1;
      return p1;
    }
  }

  factory Person.withColor(String color) {
    if (colorCache.containsKey(color)) {
      return colorCache[color]!;
    } else {
      final p1 = Person("default", color);
      colorCache[color] = p1;
      return p1;
    }
  }

  Person(this.name, this.color);
}

4.3 类的setter getter方法

void main(List<String> args) {
  final p = Person();
  //直接访问属性
  p.name = "yzk";
  print(p.name);
  //通过getter和setter
  p.setName = "zk";
  print(p.getName);
}

class Person {
  String? name;
  set setName(String name) => this.name = name;
  String get getName => name!;
}

4.4 类的继承

class Animal {
  int age;
  Animal(this.age);
}

class Person extends Animal {
  String name;
  Person(this.name, int age): super(age);
}

4.5 抽象类

abstract class Shape {
  int getArea();
  String getInfo() {
    return "形状";
  }
}

// 继承自抽象类后,必须实现抽象类的抽象方法
// 抽象类不能被实例化
class Rectangle extends Shape {
  @override
  int getArea() {
    return 100;
  }
}

4.6 隐式接口

// Dart中没有哪一个关键字来定义接口
// 默认情况下所有类都是隐式接口
// Dart是单继承的
// 当一个类做为接口使用时,必须实现这个接口中所有的方法
class Runner {
  void running() {
  }
}
class Flyer {
  void flying() {
  }
}

class SuperMan implements Runner, Flyer {
  @override
  void running() {
  }
  @override
  void flying() {
  }
}

4.7 类属性和类方法

class Person {
  // 成员变量
  String? name;
  // 静态属性(类属性)
  static String? courseTime;
  // 对象方法
  void eating() {
    print("eating");
  }
  // 静态方法(类方法)
  static void test() {
    print("test");
  }
}

4.7 枚举


void main(List<String> args) {
  final color = Colors.red;
  switch (color) {
    case Colors.red :
      print("红色");
      break;
    
    case Colors.green:
      print("绿色");
      break;
    
    case Colors.blue: 
      print("蓝色");
      break;
  }
print(Colors.values);
print(Colors.red.index);
}
enum Colors {
  red,
  green,
  blue
}
  1. 库的使用
// 系统的库:import 'dart:库的名称'
import 'dart:io';
import 'dart:isolate';
import 'dart:async';
import 'dart:math';
// 第三方库
// 1. 创建pubspec.yaml文件
name: yzk
description: a dart library
environment:
  sdk: ">=2.7.0 <3.0.0"
dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.5
// as 给第三方库起别名
import 'package:http/http.dart' as http;
上一篇 下一篇

猜你喜欢

热点阅读