dart 教程

dart 特征

  • 一切变量皆是对象,每个对象都是类的实例。int、double、函数、 null 等都是对象,所有对象都继承自 Object 类
  • dart 是强类型语言,但由于具备类型推导功能所以类型声明是可选的
  • dart 支持顶级函数、静态函数、实例函数,也允许在函数中嵌套函数,即局部函数。类似的,dart 也支持顶级变量、静态变量和实例变量
  • dart 没有关于 public、protected、private 的关键字。通过为变量标识符添加下划线前缀,表明该标识符对其库是私有的

示例

/**
 * 多行注释
 */
void printString(String msg) {
  print("msg value: $msg");
}
 
void main() {
  var msg = "Hello, World!";
  printString(msg); //msg value: Hello, World!
  printString(null); //msg value: null
}
  • 多行注释和单行注释
  • 已分号结尾
  • 应用程序的入口:main 函数
  • 一种方便的插入变量值的方式,字符串字面值:$msg

数据类型

数字

  int intValue = 20;
  intValue = 20.0; //error无法将一个 double 值赋值到一个 int 类型变量上
  
  
  
  //但是num可以,因为int 和 double 类都是 num 类的子类 
  num numValue = 10;
  print(numValue.runtimeType); //int
  numValue = 10.22;
  print(numValue.runtimeType); //doubl

字符串

除了可以通过单引号或者双引号来声明一个字符串外,也可以通过相邻的字符串字面量来声明一个组合字符串(相当于使用 + 把字符串相加为一个整体)

var stringValue = "leavesC";

var stringValue2 = 'leavesC =_=';

var stringValue3 = "分段 "
    "换行了也可以"
    '又换了一行';

print(stringValue3); //分段 换行了也可以又换了一行

bool

布尔数据类型表示布尔值truefalse.

list

//因此 listValue 自动被赋予为 List<int> 类型,因此在声明 listValue 后就无法为其添加其他类型变量的值了
var listValue = [1, 2, 3];
// listValue.add("4"); error
print(listValue.runtimeType); //List<int>

//如果想要为 List 添加不同数据类型的变量,则需要直接指明数据类型为 Object
var listValue = <Object>[1, 2, 3];
listValue.add("4");
print(listValue.runtimeType); //List<Object>

//为了限制 List 的可存储数据类型,在使用时就直接指明数据类型
var intList = <int>[1, 2, 3, 4];

map

//map 是一个关联键和值的数据类型,键和值可以是任何类型的对象
void main() {
    var mapValue = {"name": "leavesC", "age": 24};
    mapValue["url"] = "https://github.com/leavesC";
    print(mapValue); //{name: leavesC, age: 24, url: https://github.com/leavesC}
    print(mapValue.length); //3
    print(mapValue.runtimeType); //_InternalLinkedHashMap<String, Object>
}

//也可以限定 map 可以存储的数据类型
var mapValue = <String, String>{"name": "leavesC"};


//要创建一个编译时常量的 map 需要在 map 的字面量前加上 const 关键字
var mapValue = const {"name": "leavesC", "age": 24};

枚举

enum State { RESUME, STOP, PAUSE }

dart 是一门完全面向对象的语言,其关于类的内容和 Java 较为类

class Person {
    String name;
    int age;
    //构造函数
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
  • dart 会自动为 nameage 提供隐式的 gettersetter 方法,且未经初始化的实例变量均为 null

构造函数

dart 为用于赋予初始值的构造函数提供了简便写法,以下两种写法的语义是一致的

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

dart 也提供了命名构造函数,用于方便调用者生成不同用途或含义的变量

Person.getDefault() {
    this.name = "leavesC";
    this.age = 25;
}

继承

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

抽象类

抽象类和java基本一致

abstract class Printer {
  void print(String msg);
}
 
class HpPrinter extends Printer {
  @override
  void print(String msg) {
    // TODO: implement print
  }
}

实例化

var object_name = new class_name([ arguments ])

var obj = new Car("Engine 1")

Car c = new Car('E1001');

变量定义

//var关键字来实现相同的目标
var name = 'Smith';

//Dart 通过在变量名前加上数据类型来支持 类型检查 
String name = 'Smith';
int num = 10;

dynamic

声明没有静态类型的变量被隐式声明为动态。也可以使用dynamic关键字代替var关键字声明变量。

final 和 const

  • finalconst关键字来声明常量。Dart阻止修改使用finalconst关键字声明变量的值。
  • const关键字用来表示一个编译时常数。使用const关键字声明的变量是隐式final的。
final variable_name
final data_type  variable_name
const variable_name
const data_type variable_name

循环

和其他语言区别不大

void main() {
  //if
  int value = 20;
  if (value < 10) {
    print("value < 10");
  } else if (value < 30) {
    print("value < 30");
  } else {
    print("value unknown");
  }
 
  //while
  int score = 10;
  while (score < 100) {
    score++;
  }
 
  //switch
  String strValue = "leavesC";
  switch (strValue) {
    case "ye":
      break;
    case "leavesC":
      print(strValue);
      break;
    default:
      print("default");
      break;
  }
 
  //for
  var list = [];
  for (int index = 1; index < 10; index++) {
    list.add(index.toString());
  }
  for (var item in list) {
    print("循环遍历:$item");
  }
}

包管理pub

Dart的软件包管理器是pub

序号命令和描述
1'pub get' 帮助您获取应用程序所依赖的所有包。
2'pub upgrade' 将所有依赖项升级到较新版本。
3'pub build' 这用于构建您的Web应用程序,它将创建一个构建文件夹,其中包含所有相关脚本。
4'pub help' 这将为您提供所有不同pub命令的帮助

import

  • 需要隐藏一部分的时候,使用 hide 关键字
    import 'xxx' hide A 除了"xxx"中的A,其余都导入

  • 当名字出现冲突,使用 as 关键字
    import 'xxx' as B 将库重命名,当有名字冲突时

  • 只需要导入一部分的时候,使用 show 关键字
    import 'xxx' show A,B 只导入A,B

test.dart

var name = "xzw";

int getSum(int a, int b) {
  return a + b;
}

index.dart

import 'test.dart';

void main(List<String> args) {
  print(name);
  int sum = getSum(37, 63);
  print(sum);
}

async/await

  • async修饰的函数为异步函数,表示此函数中存在耗时操作并且需要对其异步处理
  • await只能用在异步函数中,用来修饰耗时操作的部分,这部分会被加入到事件队列中,表示会等待异步方法执行

例如:我们需要在加载图片异步执行,不影响其他的启动流程

main() {
 printBootTime();
 loadImg(); //由于不影响后续其他的启动流程所以在此处调用异步函数不使用await
 init();
}

printBootTime(){
 print("启动时间"+DateTime.now().millisecondsSinceEpoch.toString());
}

loadImg() async{
  print("开始加载图片");
  await Future.delayed(new Duration(seconds: 3));
  print("图片加载完成");
}

init(){
  print("初始化参数");
}
打印结果
启动时间1624708372396
开始加载图片
初始化参数
//3秒后
图片加载完成

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×