Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
F
flutter_clx_base
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
flutter_clx_base
Commits
ac409f02
提交
ac409f02
authored
11月 21, 2023
作者:
张国庆
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改dio的json解析方式
上级
9e8f0aa8
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
56 行增加
和
43 行删除
+56
-43
base_dio.dart
lib/api/base_dio.dart
+53
-33
transformer.dart
lib/api/transformer.dart
+3
-10
没有找到文件。
lib/api/base_dio.dart
浏览文件 @
ac409f02
...
...
@@ -14,12 +14,13 @@ export 'proxy.dart';
abstract
class
BaseDio
{
final
dio
=
Dio
(
BaseOptions
(
connectTimeout:
const
Duration
(
seconds:
10
),
receiveTimeout:
const
Duration
(
seconds:
10
),
contentType:
Headers
.
jsonContentType
,
// Transform the response data to a String encoded with UTF8.
// The default value is [ResponseType.JSON].
),
connectTimeout:
const
Duration
(
seconds:
10
),
receiveTimeout:
const
Duration
(
seconds:
10
),
contentType:
Headers
.
jsonContentType
,
responseType:
ResponseType
.
plain
// Transform the response data to a String encoded with UTF8.
// The default value is [ResponseType.JSON].
),
);
//初始化配置dio实例
...
...
@@ -27,13 +28,14 @@ abstract class BaseDio {
dio
.
options
.
baseUrl
=
setBaseUrl
();
dio
.
options
.
headers
=
setHeaders
();
// 配置JSON转换器
dio
.
transformer
=
MyTransformer
();
dio
.
interceptors
.
add
(
getHeadersInterceptor
());
dio
.
interceptors
.
add
(
getLogInterceptor
());
//配置代理
setProxyUri
(
dio
,
isProdEnv
());
}
final
jsonTransformer
=
MyTransformer
();
String
setBaseUrl
();
// 设置请求头拦截器
...
...
@@ -57,11 +59,9 @@ abstract class BaseDio {
void
onLoginExpire
()
=>
_onLoginExpire
();
Future
<
void
>
onNetSuccess
(
Response
response
,
NetSuccessCallback
successCallback
,
NetErrorCallback
?
errorCallback
)
async
=>
await
_onNetSuccess
(
response
,
successCallback
,
errorCallback
);
void
onNetSuccess
(
Response
response
,
NetSuccessCallback
successCallback
,
NetErrorCallback
?
errorCallback
)
=>
_onNetSuccess
(
response
,
successCallback
,
errorCallback
);
// 登录过期的处理
void
_onLoginExpire
()
{
...
...
@@ -87,7 +87,7 @@ abstract class BaseDio {
}
// 构建网络请求
Future
<
void
>
request
({
void
request
({
required
String
requestUrl
,
required
Method
method
,
Options
?
options
,
...
...
@@ -103,7 +103,7 @@ abstract class BaseDio {
data:
data
,
options:
_checkOptions
(
method
.
value
,
options
),
);
await
onNetSuccess
(
response
,
successCallback
,
errorCallback
);
onNetSuccess
(
response
,
successCallback
,
errorCallback
);
}
on
DioException
catch
(
e
)
{
if
(
e
.
response
!=
null
)
{
logger
.
e
(
...
...
@@ -131,12 +131,23 @@ abstract class BaseDio {
data:
data
,
options:
_checkOptions
(
method
.
value
,
options
),
);
var
responseCode
=
response
.
data
?[
'code'
]?.
toString
();
if
(
responseCode
==
"100"
||
responseCode
==
"-100"
)
{
logger
.
e
(
"登录过期:
${response.data?['msg']}
"
);
onLoginExpire
();
try
{
final
String
data
=
response
.
data
.
toString
();
final
bool
isCompute
=
data
.
length
>
10
*
1024
;
loggerNoStack
.
i
(
'isCompute:
$isCompute
'
);
final
Map
<
String
,
dynamic
>
map
=
isCompute
?
await
jsonTransformer
.
parseJson
(
data
)
:
jsonTransformer
.
parseAndDecode
(
data
);
var
responseCode
=
map
[
'code'
]?.
toString
();
if
(
responseCode
==
"100"
||
responseCode
==
"-100"
)
{
logger
.
e
(
"登录过期:
${map['msg']}
"
);
onLoginExpire
();
}
return
response
.
data
;
}
catch
(
e
)
{
logger
.
e
(
"数据解析错误:
${e.toString()}
"
);
return
{
"code"
:
400
,
"message"
:
"数据解析错误"
};
}
return
response
.
data
;
}
on
DioException
catch
(
e
)
{
if
(
e
.
response
!=
null
)
{
logger
.
e
(
...
...
@@ -150,22 +161,31 @@ abstract class BaseDio {
}
// 处理网络请求成功逻辑
Future
<
void
>
_onNetSuccess
(
Response
response
,
NetSuccessCallback
successCallback
,
void
_onNetSuccess
(
Response
response
,
NetSuccessCallback
successCallback
,
NetErrorCallback
?
errorCallback
)
async
{
var
responseCode
=
response
.
data
?[
'code'
]?.
toString
();
if
(
responseCode
==
"100"
||
responseCode
==
"-100"
)
{
logger
.
e
(
"登录过期:
${response.data?['msg']}
"
);
onLoginExpire
();
return
;
}
try
{
final
String
data
=
response
.
data
.
toString
();
final
bool
isCompute
=
data
.
length
>
10
*
1024
;
loggerNoStack
.
i
(
'isCompute:
$isCompute
'
);
final
Map
<
String
,
dynamic
>
map
=
isCompute
?
await
jsonTransformer
.
parseJson
(
data
)
:
jsonTransformer
.
parseAndDecode
(
data
);
var
responseCode
=
map
[
'code'
]?.
toString
();
if
(
responseCode
==
"100"
||
responseCode
==
"-100"
)
{
logger
.
e
(
"登录过期:
${map['msg']}
"
);
onLoginExpire
();
return
;
}
if
(
response
.
data
?[
'code'
]
==
0
)
{
await
successCallback
.
call
(
response
.
data
?[
'data'
]);
}
else
{
logger
.
e
(
"请求错误:
${response.data?['code']}
${response.data?['msg']}
"
);
await
errorCallback
?.
call
(
response
.
data
?[
'code'
],
response
.
data
?[
'msg'
]);
if
(
map
[
'code'
]
==
0
)
{
await
successCallback
.
call
(
map
[
'data'
]);
}
else
{
logger
.
e
(
"请求错误:
${map['code']}
${map['msg']}
"
);
await
errorCallback
?.
call
(
map
[
'code'
],
map
[
'msg'
]);
}
}
catch
(
e
)
{
logger
.
e
(
"数据解析错误:
${e.toString()}
"
);
await
errorCallback
?.
call
(
400
,
"数据解析错误"
);
}
}
}
...
...
lib/api/transformer.dart
浏览文件 @
ac409f02
import
'dart:convert'
;
import
'package:dio/dio.dart'
;
import
'package:flutter/foundation.dart'
;
/// If the request data is a `List` type, the [BackgroundTransformer] will send data
/// by calling its `toString()` method. However, normally the List object is
/// not expected for request data( mostly need Map ). So we provide a custom
/// [Transformer] that will throw error when request data is a `List` type.
class
MyTransformer
{
class
MyTransformer
extends
BackgroundTransformer
{
@override
JsonDecodeCallback
get
jsonDecodeCallback
=>
parseJson
;
Map
<
String
,
dynamic
>
_
parseAndDecode
(
String
response
)
{
Map
<
String
,
dynamic
>
parseAndDecode
(
String
response
)
{
return
jsonDecode
(
response
)
as
Map
<
String
,
dynamic
>;
}
Future
<
Map
<
String
,
dynamic
>>
parseJson
(
String
text
)
{
return
compute
(
_
parseAndDecode
,
text
);
return
compute
(
parseAndDecode
,
text
);
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论