@JsonSerializable()
class News extends Object with _$NewsSerializerMixin {
final String author;
final String title;
final String description;
final String url;
final String urlToImage;
final String publishedAt;
final Source source;
News(this.author,
this.title,
this.description,
this.url,
this.urlToImage,
this.publishedAt,
this.source);
factory News.fromJson(Map<String, dynamic> json) => _$NewsFromJson(json);
}
@JsonSerializable()
class Source extends Object with _$SourceSerializerMixin {
final String id;
final String name;
Source(this.id, this.name);
factory Source.fromJson(Map<String, dynamic> json) => _$SourceFromJson(json);
}
@JsonSerializable()
class NewsList extends Object with _$NewsListSerializerMixin {
final String status;
final int totalResults;
final List articles;
final code;
final message;
NewsList(this.status, this.totalResults, this.articles, this.code, this.message);
factory NewsList.fromJson(Map<String, dynamic> json) => _$NewsListFromJson(json);
}
看起来既有熟悉的字段,又有陌生的注解和代码?没关系,只要你按照这里的要求来做就行了。可以看出反序列化是在_$NewsListFromJson(json);
里完成的。那么这个函数从何而来呢?这需要我们运行命令flutter packages pub run build_runner build
来生成对应的代码。生成的代码存放在news.g.dart中。
至此model类以及反序列化我们就已经做完了,那么下面就看看网络请求怎么来实现。
网络请求
对应于Android中的OkHttp, Flutter中的网络请求库是http.dart。如下所示,代码比较简单
import ‘dart:async’;
import ‘dart:convert’;
import ‘package:flutter/foundation.dart’;
import ‘package:http/http.dart’ as http;
import ‘package:flutter_news/model/news.dart’;
class NewsApi {