flutterパッケージdio+json汎用解析
7453 ワード
例を通して比較した
私が選んだのはhttps://javiercbk.github.io/json_to_dart/ベースクラスjsonをdart classエンティティクラスに生成し、
その他のクラスは、プラグインFlutterJsonBeanFactoryを使用してdart classエンティティークラスを生成します.プラグインのインストール後、IDEを再起動してください.
pubspec.yaml dio依存性の追加
ネットワークツールクラス
対応するベースクラス定義
使用
postリクエスト
コードアドレスhttps://gitee.com/jiangzhuqingfeng/flutter_demo.git
HttpClient,http dio,github star , dio ;
json_serializable+json_annotation json , ;
私が選んだのはhttps://javiercbk.github.io/json_to_dart/ベースクラスjsonをdart classエンティティクラスに生成し、
その他のクラスは、プラグインFlutterJsonBeanFactoryを使用してdart classエンティティークラスを生成します.プラグインのインストール後、IDEを再起動してください.
pubspec.yaml dio依存性の追加
dio: ^3.0.9
ネットワークツールクラス
import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
class HttpManager {
static HttpManager _instance;
static HttpManager getInstance() {
if (_instance == null) {
_instance = new HttpManager();
}
return _instance;
}
HttpManager() {
dio = createInstance();
}
/// global dio object
static Dio dio;
/// default options
static const String _BASE_URL = "https://www.wanandroid.com/";
static const int _CONNECT_TIMEOUT = 15000;
static const int _RECEIVE_TIMEOUT = 15000;
/// http request methods
static const String GET = 'get';
static const String POST = 'post';
static const String PUT = 'put';
static const String PATCH = 'patch';
static const String DELETE = 'delete';
get(
String url, FormData param, Function onSuccess, Function onError) async {
requestHttp(
url,
param: param,
method: GET,
onSuccess: onSuccess,
onError: onError,
);
}
post(
String url, FormData param, Function onSuccess, Function onError) async {
requestHttp(
url,
param: param,
method: POST,
onSuccess: onSuccess,
onError: onError,
);
}
/// T is Map or List
static requestHttp(
String url, {
param,
method,
Function(T map) onSuccess,
Function(String error) onError,
}) async {
dio = createInstance();
try {
Response response = await dio.request(
url,
data: param,
options: new Options(method: method),
);
if (response.statusCode == HttpStatus.ok) {
onSuccess(json.decode(response.data));
} else {
onError("【statusCode】${response.statusCode}");
}
} on DioError catch (e) {
///
print("【 】${e.toString()}");
onError(e.toString());
}
}
/// dio
static Dio createInstance() {
if (dio == null) {
/// : 、 、
var options = new BaseOptions(
baseUrl: _BASE_URL,
connectTimeout: _CONNECT_TIMEOUT,
receiveTimeout: _RECEIVE_TIMEOUT,
responseType: ResponseType.plain,
// contentType: Headers.jsonContentType,
);
dio = new Dio(options);
dio.interceptors.add(new LogInterceptors());
}
return dio;
}
// /// request method
// static Future
対応するベースクラス定義
///convert FlutterJsonBeanFactory
class BaseEntity {
T data;
int errorCode;
String errorMsg;
BaseEntity({this.data, this.errorCode, this.errorMsg});
BaseEntity.fromJson(Map json) {
if (json['data'] != null&&json['data']!='null') {
data = JsonConvert.fromJsonAsT(json['data']);
}
errorCode = json['errorCode'];
errorMsg = json['errorMsg'];
}
Map toJson() {
final Map data = new Map();
if (this.data != null) {
data['data'] = this.data;
}
data['errorCode'] = this.errorCode;
data['errorMsg'] = this.errorMsg;
return data;
}
}
JsonConvert.fromJsonAsT(json['data']); FlutterJsonBeanFactory , Object List
使用
HttpManager.getInstance().get("banner/json", null, (data) {
BaseEntity> baseEntity = BaseEntity.fromJson(data);
baseEntity.data.forEach((element) {
print(element.imagePath);
});
}, (error) {
ToastUtil.showToastCenter(error);
});
postリクエスト
var map = Map();
map["username"] = " ";
map["password"] = "xxxxx";
FormData formData = FormData.fromMap(map);
HttpManager.getInstance().post("user/login", formData, (data) {
BaseEntity baseModel = BaseEntity.fromJson(data);
print(" ${baseModel.errorMsg}");
}, (error) {
ToastUtil.showToastCenter(error);
});
コードアドレスhttps://gitee.com/jiangzhuqingfeng/flutter_demo.git