一.网络请求
1.导入http.dart
import 'package:http/http.dart' as client;
2.封装请求方法
//封装的方法
getData(cbk) async {
var api =getBaseUrl() + 'cats/lv2/statistics';
print(api);
try {
final response =await client.get(api);
if (response.statusCode == 200) {
cbk(response.body);
}
} catch (e) {
print(e);
}
}
String getBaseUrl () {
return "https://xxx.com/";
}
//调用
getData((data){
var a = json.decode(data);
});
二. 序列化
JSON.decode是将一个json格式的string 转化成一个Map<String,dynamic>类型的Map 官方无法转化成模型。以下有三种方法可以转化成模型
- 直接使用Map,不转换成Object。 这一点对于一些小型项目,数据量不大的情况下是可以使用的,原生默认支持。
- 通过添加额外的方法来转换成Object。这里所说的额外的方法是指,给你需要转换的类添加formJson(Map<String,dynamic> map)和Map<String,dynamic> toJson()这两个方法。
- 使用json_serializable 进行转换。这里简单说一下使用方式,官方文档中都有的。
官方推荐第三种,以下是实现方式
1.创建模型类
import 'package:menu_test/models/Author.dart';
import 'package:json_annotation/json_annotation.dart';
//报错忽略 后面会自动生成此文件
part 'Book.g.dart';
@JsonSerializable()
class Book extends Object with _$BookSerializerMixin {
String name;
Author author;
String publishDate;
String publisher;
Book(this.name, this.author, this.publishDate, this.publisher);
@override
String toString() {
return 'Book{name: $name, author: $author, publishDate: $publishDate, publisher: $publisher}';
}
factory Book.fromJson(Map<String, dynamic> json) => _$BookFromJson(json);
}
import 'package:json_annotation/json_annotation.dart';
//报错忽略 后面会自动生成此文件
part 'Author.g.dart';
@JsonSerializable()
class Author extends Object with _$AuthorSerializerMixin {
String name;
Author(this.name);
@override
String toString() {
return 'Author{name: $name}';
}
factory Author.fromJson(Map<String, dynamic> json) => _$AuthorFromJson(json);
}
2.在pubspec.yaml中引入json_serializable相关的库
# Your other regular dependencies here
json_annotation: ^0.2.2
dev_dependencies:
# Your other dev_dependencies here
build_runner: ^0.7.6
json_serializable: ^0.3.2
保存此文件后,可能会出现以下错误
Because new_trend depends on build_runner >=0.9.0 which requires SDK version >=2.0.0-dev.61 <3.0.0, version solving failed.
pub get failed (1)
只需修改 ,并且保存
build_runner: any
安装相关依赖库之后,去pubspec.lock中查找当前库的版本,修改并保存
为什么不直接使用any作为版本号呢
在实际项目开发中,拥有不确定性的版本号会成为未来应用崩溃的一个极大的隐患。这可能将会使您的应用难以调试。所以请记住,不要在你的项目中留下any关键字!
3.在开发工具终端 输入
flutter packages pub run build_runner build
会自动生成两个文件 Author.g.dart和Book.g.dart
使用
//模型
var book = new Book("book1", new Author("Jack"), "2018-10-10", "xxx company");
//模型=>json字符串
String jsonStr= json.encode(book);
//json字符串转map
json.decode(jsonStr)
//json字符串=>模型
var bookAfter= Book.fromJson(json.decode(jsonStr));
以上就是自己学习的flutter相关网络请求和序列化~