「 Dart 」快速上手 Dart - 泛型、类库、Dart 2.12

204 阅读2分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

泛型

泛型对不特定数据类型的支持使方法、类、接口具有复用性。

泛型方法

T getData<T>(T value) {
  return value;
}

main() {
  print(getData<num>(123)); // 123
  print(getData<String>('Jack')); // Jack
}

泛型类

// 调用泛型类
List list = List.filled(2, '');
list[0] = 'Tom';
list[1] = 12;
print(list); // [Tom, 12]

// 要求传入的数据是 String 类型
List list1 = List<String>.filled(2, '');
list1[0] = 'Tom';
list1[1] = 'Jerry';
print(list1); // [Tom, Jerry]

// 定义泛型类
class MyList<T> {
  List list = <T>[];
  add(T value) {
    this.list.add(value);
  }
  List getList() {
    return list;
  }
}

泛型接口

abstract class Cache<T> {
  getByKey(String key);
  setByKey(String key, T value);
}

class MemoryCache<T> implements Cache<T> {
  @override
  getByKey(String key) {
    return null;
  }

  @override
  setByKey(String key, T value) {
    print("MemoryCache key=${key} value=${value}");
  }
}

void main() {
  MemoryCache mc = MemoryCache<Map>();
  mc.setByKey('index', {"name": "Jack", "age": 20}); // MemoryCache key=index value={name: Jack, age: 20}
}

类库

Dart中的库主要有三种:

  1. 我们自定义的库
import 'lib/class.dart';
  1. 系统内置库
import 'dart:math';
  1. Pub 包管理系统中的库

pub.dev/packages
pub.flutter-io.cn/packages
pub.dartlang.org/flutter

  1. 需要在自己想项目根目录新建一个 pubspec.yaml
  2. 在 pubspec.yaml 文件配置名称、描述、依赖等信息
  3. 在控制台运行 pub get 获取包下载到本地
  4. 项目中引入库 import 'package:http/http.dart' as http;

引入库的时候使用as重命名防止名称重复:

import 'package:http/http.dart' as http;

如果你只需要使用库中的部分功能,可以使用show显示或hide隐藏部分方法来部分导入

import 'dart:math' show max;

Dart 2.12

Null Safety 空安全

Null safety 可以帮助开发者避免一些日常开发中很难被发现的错误,并且可以改善性能。

int a = 123;
a = null; // 报错,Null 类型的值不能赋值给 int 类型的变量

类型后加?表示改变量是可空类型

int? a = 123;
a = null;

List<int>? l=[1, 2, 3];
l=null;
print(l); // null

String? getData(value) {
  if (value != null) {
    return 'This is a string.';
  }
  return null;
}

类型断言 ! 用于判断变量是否为空,若为空则抛出异常。在下面的例子中,由于 str 为空,所以抛出异常:

void main() {
  String? str = 'String';
  str = null;
  print(str!.length); // Null check operator used on a null value
}
void printLength(String? str) {
  try {
    print(str!.length);
  } catch (e) {
    print("str is null");
  }
}

void main() {
  printLength(null); // str is null
}

late 关键字

late 关键字用于延迟初始化。下面的类中没有构造函数,如果没有late关键字就会报错,加上late关键字即可:

class Person {
  late String name;

  void setInfo(String name) {
    this.name = name;
  }

  String getInfo() {
    return "${this.name}";
  }
}

void main(args) {
  Person p = Person();
  p.setInfo("Jack");
  print(p.getInfo()); // Jack
}

required 关键字

required 作为内置修饰符,主要用于允许根据需要标记任何命名参数(函数或类),使其不为空。可选参数必须要有 required 或默认值。

String printInfo(String name, {int age = 20, String sex = "male"}) {
  // ...
}

String printInfo2(String name, {required int age, required String sex}) {
  // ...
}