5) 使用库 引入 按需加载
其中 pag.Calc.dart
文件内容,简单的 相加求和 ,还有一个相减求差。
int add(int x,int y){
return x+y;
}
class Calc {
int x;
int y;
Calc(int x , int y){
this.x = x;
this.y = y;
}
minus(){
print(this.x-this.y);
}
}
主程序如下:
import 'dart:convert';
//import 'dart:math';
import 'pkg/Calc.dart'; //引入
import 'package:http/http.dart' as http; //调用外部的包
// deferred 延时加载 使用时 加载
import 'dart:math' deferred as math; //调用dart自身的包
void main() async {
int start = 1;
int count = 2;
int result = add(2, 4);
print(result); // 6
var m = new Calc(5,85);
m.minus(); //-80
//简单json序列化
//官方↓↓↓↓↓↓↓
//JSON.decode()仅返回一个Map<String, dynamic>,这意味着我们直到运行时才知道值的类型。
// 通过这种方法,我们失去了大部分静态类型语言特性:类型安全、自动补全和最重要的编译时异常。
// 这样一来,我们的代码可能会变得非常容易出错
//简而言之 就像js处理数据一样不够严谨 没有数据类型 TS就是为了解决这个问题
var json1 = '''
{
"name": "John Smith",
"email": "john@example.com"
}
''';
Map<String,dynamic> jsonp1 = json.decode(json1);
assert(jsonp1 is Map);
print("hello,${jsonp1["name"]}"); //hello,John Smith
print("email,${jsonp1["email"]}"); //email,john@example.com
// 模型类中序列化JSON
var json2 = '''
{
"name": "John2 Smith",
"email": "john2@example.com"
}
''';
Map userMap = json.decode(json2);
var jsonp2 = new Jsonp2.fromJson(userMap);
print("hello,${jsonp2.name}"); //hello,John2 Smith
print("email,${jsonp2.email}"); //email,john2@example.com
// ---------------------------------
var url = 'https://douban.uieee.com/v2/movie/top250?start=${start}&count=${count}';
var response = await http.get(url);
print('Response status: ${response.statusCode}'); //Response status: 200
// print('Response body: ${response.body}');
var encoded = json.decode(response.body.toString());//json解析 转对象 需引入 'dart:convert';
print(encoded); //打印数据
print(await http.read('https://www.baidu.com')); //返回百度 html格式
// ------------------------------------
// 引入了math库
math.loadLibrary(); //用于延时加载 使用时 告知需加载 按需加载
var random = new math.Random();
print(random.nextInt(10));
}
//json解析成实例对象
class Jsonp2 {
final String name;
final String email;
Jsonp2(this.name,this.email);
Jsonp2.fromJson(Map<String,dynamic> json):name = json["name"],email = json["email"];
Map<String,dynamic> toJson()=>{
'name':name,
'email':email
};
}
6) 异步
因为Dart是单线程,所以代码在运行线程中阻塞的话,会使程序冻结
,在Dart中Future
表示异步操作的结果,异步操作可以允许程序在等待操作完成期间可以去完成其他工作。
最基本的异步表现:
void main(){
print('say hello');
Future.delayed(new Duration(seconds: 5),(){
print('吃饱了--这是异步');
});
print('play game');
/*
say hello
play game
//5秒后↓
吃饱了--这是异步
*/
}
异步操作 同步调用 async...await
void main() async {
print('say hello');
await Future.delayed(new Duration(seconds: 5),(){
print('吃饱了--这是异步,但同步调用');
});
print('play game');
Future.wait([
//异步 程序同时进行
Future.delayed(new Duration(seconds: 1),(){
print('异步001');
}),
Future.delayed(new Duration(seconds: 2),(){
print('异步002');
}),
Future.delayed(new Duration(seconds: 5),(){
print('异步003');
}),
Future.delayed(new Duration(seconds: 4),(){
print('异步004');
}),
]).then((List result){ //then 同js中then await +异步 执行结束后 执行
// 在async函数中使用try-catch来捕获异常(或者使用catchError())
print('异步all over');
});
// 要想同时运行代码,就要为一个web app或者一个worker创建一个isolate
//所有Dart代码都在一个拥有Dart代码使用的所有内存的isolate上下文中运行。Dart代码在运行的时候,在同一隔离中的其他代码不能运行。
//如果你希望Dart代码的多个部分同时运行,你可以将它们在不同的isolate中运行(Weba pps使用workers代替isolates)。多个isolate同时运行,通常是各自运行在各自的CPU上。isolate不共享内存,它们可以交互的唯一方式就是互相发送消息。
//同步写法 此时 时间需累加 时间变长
await Future.delayed(new Duration(seconds: 1),(){
print('005');
});
await Future.delayed(new Duration(seconds: 2),(){
print('006');
});
await Future.delayed(new Duration(seconds: 5),(){
print('007');
});
await Future.delayed(new Duration(seconds: 4),(){
print('008');
});
/*
say hello
吃饱了--这是异步,但同步调用
play game
异步001
005
异步002
006
异步004
异步003
异步all over
007
008
*/
}
太长啦,还不支持锚点,所以拆成三篇