那些你不知道的Dart细节之泛型和库(六)

前言

前几篇文章分别讲解了Dart中的变量、内置类型、函数(方法)、异常、类,对Dart的基本语法已经有了很多的了解,那么今天来说一下Dart中的泛型和库。前几篇文章没有看的,建议先看一下前几篇文章。

那些你不知道的Dart细节之变量
那些你不知道的Dart细节之内置类型
那些你不知道的Dart细节之函数(方法)
那些你不知道的Dart细节之操作符、流程控制语句、异常
那些你不知道的Dart细节之类的点点滴滴
那些你不知道的Dart细节之泛型和库

泛型

  • Java中的泛型信息是编译时的,泛型信息在运行时是不存在的
  • Dart的泛型类型是固化的,在运行时也有可以判断的具体类型
var names = List<String>();
print(names is List<String>);//true
print(names.runtimeType); // List<String> 

在Java中,可以测试对象是否为List,但无法测试它是否是List。但是在Dart中是预编译的。

其他的泛型使用方法和Java中的类似,这里就不赘述了。

库-使用核心库

使用import关键字来载入库:

import "dart:math";

void main() {
  print(sqrt(4));//开平方 2.0
}

对于内置的库,URI 使用特殊的 dart: scheme。对于其他的库,你可以使用文件系统路径或者 package: scheme。

库-载入第三方库

在Flutter中想使用第三方库的话需要在pubspec.yaml中的dependencies中添加依赖:

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^0.1.0
  dio: ^2.1.0

添加完成之后点击右上角的packages get进行导入依赖。下面是三方哭调用方法:

import "package:dio/dio.dart";

void main() {
  getHttp();
}

void getHttp() async {
  try {
    Response response = await Dio().get("https://www.baidu.com");
    print(response);
  } catch (e) {
    print(e);
  }
}

这里给大家一个网站,需要寻找第三方库的时候直接在里面搜索即可:https://pub.dev/

库-指定库前缀

在Java编码过程经常会出现一个类中调用两个类中相同名字的方法,这时就需要全限定名称来调用了,但是在Dart中是不需要的:

import 'MyLib1.dart' as lib1; 
import 'MyLib2.dart' as lib2; 

void main() {
  var myLib = lib1.MyLib();
  var myLib2 = lib2.MyLib();
}

上面代码中MyLib1.dart 和 MyLib2.dart 都有一个名字为 MyLib 的类。

库-选择性载入

  • show-只载入库的某些部分
  • hide-筛选掉库的某些部分
import 'Mylib1.dart' as lib1 show Test;
import 'Mylib2.dart' as lib2 hide Test;

var test = lib1.Test();
var lib = lib2.MyLib();

如果只使用库的一部分功能,则可以选择需要导入的 内容。

库-延迟载入

  1. 使用deferred as导入
  2. 使用标识符调用loadLibrary()加载库
import 'MyLib1.dart' deferred as lazyLib;

void main() {
  lazyLoad();
}
lazyLoad() async {
  await lazyLib.loadLibrary();
  var t = lazyLib.Test();
  t.test();
}

使用 await 关键字暂停代码执行一直到库加载完成。可提高程序启动速度。用在不常使用的功能和载入时间过长的包。

库-自定义库

  1. 首先将一个文件作为library:

    library mylib;
    
    part 'util.dart';
    part 'tool.dart';
    
    void printMyLib() => print('mylib');
    
  2. 然后使用part 把一个库分开到多个 Dart 文件中。

    part of mylib;
    void printTool() => print('tool');
    
    part of mylib;
    void printUtil() => print('util');
    
  3. import不会完全共享作用域,而part之间是完全共享的。如果说在A库中import了B库,B库import了C库,A库是没有办法直接使用C库的对象的。而B,C若是A的part,那么三者共享所有对象。并且包含所有导入。

    import 'mylib/mylib.dart';
    
    void main() {
      printMyLib();
      printUtil();
      printTool();
    }
    

总结

到这里为止Dart的第六篇文章完成。本篇文章主要讲解了一下Dart语言的泛型和库。下一篇文章讲解一下Dart中的异步操作,希望大家能够喜欢,对大家如果有帮助的话,欢迎点赞关注,如果有异议,可以留言进行讨论。

Dart 是一种支持泛型的面向对象语言,它允许我们在定义类、函数或方法时使用参数化类型。泛型允许我们在不指定具体类型的情况下编写通用的代码,提高代码的重用性和安全性。 在 Dart 中,泛型的类型变化可分为两种:类型的协变(Covariance)和类型的逆变(Contravariance)。 类型的协变指的是可以将泛型类型的子类型赋值给父类型,这样就可以确保在使用泛型类型时不会发生类型不匹配的错误。例如,如果有一个泛型类 Animal<T>,其中 T 是一个类型参数,那么 Animal<Dog> 就是 Animal<Animal> 的子类型。这样我们可以使用 Animal<Animal> 类型的变量来持有 Animal<Dog> 的实例,而不会出现类型错误。 类型的逆变与协变相反,指的是可以将泛型类型的父类型赋值给子类型。这样可以更灵活地使用泛型类型,更好地符合实际的业务需求。例如,如果有一个泛型类 Comparator<T>,其中 T 是一个类型参数,那么 Comparator<Animal> 就是 Comparator<Dog> 的父类型。这样我们可以使用 Comparator<Dog> 类型的变量来持有 Comparator<Animal> 的实例,而不会出现类型错误。 泛型的型变在 Dart 中使用通配符来表示,泛型类型的协变使用 extends 关键字,逆变使用 super 关键字。例如,在声明一个泛型类型时,我们可以使用 Animal<? extends Animal> 表示协变,使用 Comparator<? super Dog> 表示逆变。这样的声明帮助我们在使用泛型类型时确保类型的正确性。 总结来说,Dart 中的泛型支持类型的协变和逆变,这样可以更灵活、更安全地使用泛型类型。泛型的型变通过使用通配符、extends 和 super 关键字来表示,使得泛型类型的赋值更加灵活,能够满足不同的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱 江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值