提交 e0db3382 authored 作者: 张国庆's avatar 张国庆

网络请求dio
上级 6c817aa7
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_clx_base/flutter_clx_base.dart'; import 'package:flutter_clx_base/flutter_clx_base.dart';
import 'package:flutter_clx_base_example/sample/base_list_widget_test.dart'; import 'package:flutter_clx_base_example/sample/base_list_widget_test.dart';
import 'package:flutter_clx_base_example/sample/dio_widget_test.dart';
class Sample extends StatelessWidget { class Sample extends StatelessWidget {
const Sample({super.key}); const Sample({super.key});
...@@ -14,6 +15,10 @@ class Sample extends StatelessWidget { ...@@ -14,6 +15,10 @@ class Sample extends StatelessWidget {
fullWidthButton: true, fullWidthButton: true,
onPressed: () => Get.to(const BaseListWidgetTest()), onPressed: () => Get.to(const BaseListWidgetTest()),
text: '列表'), text: '列表'),
GFButton(
fullWidthButton: true,
onPressed: () => Get.to(const DioWidgetTest()),
text: 'dio'),
], ],
); );
} }
......
import 'package:flutter/material.dart';
import 'package:flutter_clx_base/api/dio_utils.dart';
import 'package:flutter_clx_base/flutter_clx_base.dart';
class DioWidgetTest extends StatefulWidget {
const DioWidgetTest({super.key});
@override
State<DioWidgetTest> createState() => _DioWidgetTestState();
}
class _DioWidgetTestState extends State<DioWidgetTest> {
static const String getSystemVersionByNumber =
'/user-service/system/version/getSystemVersionByNumber';
String _result = '';
@override
Widget build(BuildContext context) {
return MyScaffold(
title: 'DioWidget',
children: [
Text(_result),
TextButton(
onPressed: () {
DioUtils.instance.request(
requestUrl: getSystemVersionByNumber,
method: Method.get,
queryParameters: {
'versionNumber': 20,
'productNo': 1,
},
successCallback: (res) {
setState(() {
_result = res.toString();
});
},
errorCallback: (code, msg) {
setState(() {
_result = msg!;
});
},
);
},
child: const Text('dio请求')),
],
);
}
}
import 'package:dio/dio.dart';
import 'package:flutter_clx_base/api/base_entity.dart';
import 'package:flutter_clx_base/utils/log_utils.dart';
export 'package:dio/dio.dart';
abstract class BaseDio {
String getbaseUrl();
// 设置请求头拦截器
Interceptor getHeadersInterceptor();
Map<String, dynamic>? setHeaders() => _setHeaders();
void onNetSuccess(Response response, NetSuccessCallback successCallback,
NetErrorCallback? errorCallback) =>
_onNetSuccess(response, successCallback, errorCallback);
final dio = Dio(
BaseOptions(
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 10),
contentType: Headers.jsonContentType,
// Transform the response data to a String encoded with UTF8.
// The default value is [ResponseType.JSON].
),
);
//构造方法
BaseDio() {
configDio();
}
//配置dio实例
void configDio() {
dio.options.baseUrl = getbaseUrl();
dio.options.headers = setHeaders();
dio.interceptors.add(getHeadersInterceptor());
dio.interceptors.add(LogInterceptor(responseBody: true));
}
//设置请求头
Map<String, dynamic>? _setHeaders() {
return {
'Content-Type': 'application/json;charset=UTF-8',
};
}
// 构建网络请求
void request({
required String requestUrl,
required Method method,
Options? options,
Map<String, dynamic>? queryParameters,
Map<String, dynamic>? data,
required NetSuccessCallback successCallback,
NetErrorCallback? errorCallback,
}) async {
try {
final Response response = await dio.request(
requestUrl,
queryParameters: queryParameters,
data: data,
options: _checkOptions(method.value, options),
);
onNetSuccess(response, successCallback, errorCallback);
} on DioError catch (e) {
if (e.response != null) {
logger.e(
"请求错误:${e.response!.statusCode} ${e.response!.requestOptions.path}");
} else {
// Something happened in setting up or sending the request that triggered an Error
logger.e("请求错误:${e.message}");
}
errorCallback?.call(500, "服务器请求错误");
}
}
// 处理网络请求成功逻辑
void _onNetSuccess(Response response, NetSuccessCallback successCallback,
NetErrorCallback? errorCallback) {
BaseEntity baseEntity = BaseEntity.fromJson(response.data);
if (baseEntity.code == 100 || baseEntity.code == "100") {
logger.e("登录过期:${baseEntity.message}");
return;
}
if (baseEntity.code == 0) {
successCallback.call(baseEntity.data);
} else {
logger.e("请求错误:${baseEntity.code} ${baseEntity.message}");
errorCallback?.call(baseEntity.code, baseEntity.message);
}
}
}
Options _checkOptions(String method, Options? options) {
options ??= Options();
options.method = method;
return options;
}
typedef NetSuccessCallback = Function(dynamic data);
typedef NetErrorCallback = Function(dynamic code, String? msg);
enum Method {
get,
post,
put,
patch,
delete,
}
extension MethodExtension on Method {
String get value => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'][index];
}
class BaseEntity {
BaseEntity(this.code, this.message, this.data, {this.total = 0,this.amount = 0.0,this.pageNum = 0});
BaseEntity.fromJson(Map<String, dynamic> json) {
code = json['code'];
message = json['msg'] as String;
data = json['data'];
total = json['total'];
amount = json['amount'];
pageNum = json['pageNum'];
}
dynamic code;
late String message;
dynamic data;
dynamic total;
dynamic amount;
dynamic pageNum;
}
import 'package:flutter_clx_base/api/header_interceptor.dart';
import 'base_dio.dart';
export 'base_dio.dart';
class DioUtils extends BaseDio {
static final DioUtils _singleton = DioUtils._internal();
static DioUtils get instance => _singleton;
DioUtils._internal();
@override
String getbaseUrl() {
return "https://api.clxkj.cn:8088";
}
@override
Interceptor getHeadersInterceptor() {
return HeaderInterceptor();
}
}
import 'package:dio/dio.dart';
class HeaderInterceptor extends InterceptorsWrapper {
@override
onRequest(RequestOptions options, handler) async {
options.headers["osType"] = "APP";
return super.onRequest(options, handler);
}
}
...@@ -11,7 +11,7 @@ dependencies: ...@@ -11,7 +11,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
# dio https://pub.dev/packages/dio # dio https://pub.dev/packages/dio
dio: ^4.0.6 dio: ^5.1.1
# 时间选择器 https://pub.dev/packages/flutter_cupertino_datetime_picker # 时间选择器 https://pub.dev/packages/flutter_cupertino_datetime_picker
flutter_cupertino_datetime_picker: ^3.0.0 flutter_cupertino_datetime_picker: ^3.0.0
# 键盘工具类 https://pub.dev/packages/keyboard_actions # 键盘工具类 https://pub.dev/packages/keyboard_actions
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论