Dart基本语法(三)
Dart基本语法(三)
- 泛型
- 泛型方法
- 泛型类
- 泛型接口
- Dart中的库
- 自定义的库
- 系统内置库
- Pub包管理系统中的库
- 库的重命名
- 部分导入
- 结束
泛型
通俗理解:泛型就是解决类,接口,方法的复用性,以及对不特定数据类型的支持(类型校验)
泛型方法
我们想要输入什么类型数据返回什么类型数据,下面这种写法可以,但每种类型都要写一个方法。
int getData(int value) {return value;
}String getData1(String value) {return value;
}
引入泛型方法
//这种不指定类型的写法放弃了类型校验,我们把返回的value写成固定的值也不会检查报错
getData1(value) {return value;
}//使用类型校验,会检查我们输入输出的属性值类型和要求类型是否一致
T getData<T>(T value) {return value;
}main() {print(getData(21)); //这种写法也没有进行类型校验print(getData<String>('你好'));
}
泛型类
我们使用集合时规定list为String类型就是泛型类的一个例子
main() {List list = new List<String>.filled(2, "");list[0] = "张三";list[1] = "李四";print(list);
}
通过查看源码发现list就是一个泛型类

接下来我们用代码把一个普通类改为泛型类
class MyList {List list = <int>[];void add(int value) {this.list.add(value);}List getList() {return list;}
}main() {
//我们可以给类中的集合添加int类型的数据MyList l = MyList();l.add(1);l.add(12);l.add(5);
}
我们想要实现给类中的集合添加任意类型的数据
class MyList<T> {List list = <T>[];void add(T value) {this.list.add(value);}List getList() {return list;}
}main() {//可以传入任意类型的数据MyList l = new MyList();l.add(1);l.add("hello");l.add(true);//规定只能传入String类型的数据,会进行类型校验MyList l1 = new MyList<String>();l1.add("张三");l1.add('12');
}
泛型接口
//定义一个泛型接口
abstract class Cache<T> {getByKey(String key);void setByKey(String key, T value);
}class FileCache<T> implements Cache<T> {@overridegetByKey(String key) {}@overridevoid setByKey(String key, T value) {print("我是文件缓存 把key=${key} value=${value}的数据写入到文件中");}
}class MemoryCache<T> implements Cache<T> {@overridegetByKey(String key) {}@overridevoid setByKey(String key, value) {print("我是内存缓存 把key=${key} value=${value}的数据写入到内存中");}
}main() {MemoryCache m = new MemoryCache<String>();m.setByKey('index', '首页数据');
}

Dart中的库
Dart中的库主要有三种:自定义的库,系统内置库,Pub包管理系统中的库
自定义的库
前面我们将类分离成的单独的文件就叫库
import 'lib/XXX.dart'
系统内置库
import 'dart:math';
import 'dart:io';
import 'dart:convert';
import 'dart:math';main() {print(max(12, 15));
}

一个获取接口数据的例子
import 'dart:convert';
import 'dart:io';void main() async {var result = await _getDataFromZhuhuAPI();print(result);
}_getDataFromZhuhuAPI() async {//创建HttpClient对象var httpClient = new HttpClient();var uri = new Uri.http('news-at.zhihu.com', '/api/3/stories/latest');var request = await httpClient.getUrl(uri);var response = await request.close();return await response.transform(utf8.decoder).join();
}

async和await的使用
- 只有async方法才能使用await关键字调用方法
- 如果调用别的async方法必须使用await关键字
- async是让方法变成异步
- await是等待异步方法执行完成
下面是一个普通方法的调用
void main() {var result = testAsync();print(result);
}testAsync() {return 'hello async';
}
假如我们要将testAsync()改为异步方法testAsync() async则我们在调用时要在方法前加await(await testAsync())而且必须async方法才能使用await关键字调用方法,因此main方法也必须加上async关键字
main() async {var result = await testAsync();print(result);
}testAsync() async {return 'hello async';
}

Pub包管理系统中的库
https://pub.dev/packages
https://pub.flutter-io.cn/packages
https://pub.dev/flutter/packages
- 需要在自己项目根目录新建一个pubspec.yaml
- 在pubspec.yaml文件 然后配置名称,描述,依赖等信息

首先查看文档,将相应的依赖添加到文件配置下,这里需要注意的是文件有严格的格式,分号后面必须有空格,没有空格会报如图错误

解决问题参考了这篇博客
name: XXX
description: A new flutter module project
dependencies: http: ^0.13.4
environment: sdk: '>=2.10.0 <3.0.0'
- 运行pub get获取包下载到本地
然后在终端项目文件下输入命令
我当时遇到了如下问题:

按照提示又在配置文件下加了
environment: sdk: '>=2.10.0 <3.0.0'
然后Ctrl+S保存,发现系统好像自动帮我pub get了

(好像配置文件正确后保存,系统都会自动pub get下载,由于第一次使用,可能走了很多弯路)
5. 项目中引入库import ‘package:http/http.dart’ as http; 看文档使用
如果第四步下载错误的话,import时汇报红
运行一下官方示例
import 'dart:convert' as convert;import 'package:http/http.dart' as http;void main(List<String> arguments) async {var url =Uri.https('www.googleapis.com', '/books/v1/volumes', {'q': '{http}'});// Await the http get response, then decode the json-formatted response.var response = await http.get(url);if (response.statusCode == 200) {var jsonResponse =convert.jsonDecode(response.body) as Map<String, dynamic>;var itemCount = jsonResponse['totalItems'];print('Number of books about http: $itemCount.');} else {print('Request failed with status: ${response.statusCode}.');}
}

库的重命名
当我们导入的两个库存在同名的类时,我们在main中实例化的话会判断不出是哪一个类,因此我们对库进行重命名。
// Person1.dartclass Person {String name;int age; Person(this.name, this.age);Person.setInfo1(String name, int age) {this.name = name;this.age = age;}void getInfo() {print("$name----$age");print("Person1:${this.name}----${this.age}");}
}
//Person2.dartclass Person {String name;int age;Person(this.name, this.age);Person.setInfo1(String name, int age) {this.name = name;this.age = age;}void getInfo() {print("$name----$age");print("Person2:${this.name}----${this.age}");}
}
import 'lib/Person1.dart';
import 'lib/Person2.dart' as lib;void main() {Person p1 = new Person("张三", 20);p1.getInfo();lib.Person p2 = new lib.Person("李四", 30);p2.getInfo();
}

部分导入
只导入库中的一部分来使用。
//MyMath.dart(我们要导入的库)
void getName() {print("张三");
}void getAge() {print(20);
}void getSex() {print("男");
}
show表示只导入
//这里只导入getName()方法,其他方法不可使用
import 'lib/MyMath.dart' show getName;void main() {getName();//下面两个方法使用时会报错getSex();getAge();
}

hide表示隐藏
import 'lib/MyMath.dart' hide getName;
void main() {
//getName()方法使用时会报错,其他两个可以使用getName();getSex();getAge();
}

结束
到这里Dart中的一些基础语法就学习完啦!!!!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
