这是我参与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中的库主要有三种:
- 我们自定义的库
import 'lib/class.dart';
- 系统内置库
import 'dart:math';
- Pub 包管理系统中的库
pub.dev/packages
pub.flutter-io.cn/packages
pub.dartlang.org/flutter
- 需要在自己想项目根目录新建一个 pubspec.yaml
- 在 pubspec.yaml 文件配置名称、描述、依赖等信息
- 在控制台运行
pub get获取包下载到本地 - 项目中引入库
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}) {
// ...
}