Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
N
netrain_flutter_app
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
邹志胜
netrain_flutter_app
Commits
6f0c4e5a
Commit
6f0c4e5a
authored
Jul 07, 2021
by
“Icebear”
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加网络库Network、待优化
parent
2d266fe7
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
459 additions
and
9 deletions
+459
-9
contents.xcworkspacedata
...er.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+1
-1
dwMain.dart
netrain_flutter_app/lib/douwen/dwMain.dart
+1
-1
secondpage.dart
netrain_flutter_app/lib/douwen/secondpage.dart
+3
-3
HttpUtil.dart
netrain_flutter_app/lib/laishanqi/netrain/Http/HttpUtil.dart
+2
-2
main.dart
netrain_flutter_app/lib/main.dart
+3
-0
LoginPage.dart
netrain_flutter_app/lib/zhangfeng/LoginPage.dart
+45
-0
Api.dart
netrain_flutter_app/lib/zhangfeng/Network/Api.dart
+11
-0
Code.dart
netrain_flutter_app/lib/zhangfeng/Network/Code.dart
+20
-0
DataHelper.dart
netrain_flutter_app/lib/zhangfeng/Network/DataHelper.dart
+26
-0
DioLogInterceptor.dart
..._flutter_app/lib/zhangfeng/Network/DioLogInterceptor.dart
+140
-0
HttpManager.dart
netrain_flutter_app/lib/zhangfeng/Network/HttpManager.dart
+136
-0
Loading.dart
netrain_flutter_app/lib/zhangfeng/Network/Loading.dart
+11
-0
ResponseInterceptor.dart
...lutter_app/lib/zhangfeng/Network/ResponseInterceptor.dart
+42
-0
ResultData.dart
netrain_flutter_app/lib/zhangfeng/Network/ResultData.dart
+8
-0
UrlPath.dart
netrain_flutter_app/lib/zhangfeng/Network/UrlPath.dart
+3
-0
pubspec.yaml
netrain_flutter_app/pubspec.yaml
+7
-2
No files found.
netrain_flutter_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
View file @
6f0c4e5a
...
@@ -2,6 +2,6 @@
...
@@ -2,6 +2,6 @@
<Workspace
<Workspace
version =
"1.0"
>
version =
"1.0"
>
<FileRef
<FileRef
location =
"
group:Runner.xcodeproj
"
>
location =
"
self:
"
>
</FileRef>
</FileRef>
</Workspace>
</Workspace>
netrain_flutter_app/lib/douwen/dwMain.dart
View file @
6f0c4e5a
import
'package:flutter/material.dart'
;
import
'package:flutter/material.dart'
;
import
'package:fluttertoast/fluttertoast.dart'
;
import
'package:fluttertoast/fluttertoast.dart'
;
import
'second
1
.dart'
;
import
'second
page
.dart'
;
void
main
(
)
{
void
main
(
)
{
runApp
(
MyApp
());
runApp
(
MyApp
());
...
...
netrain_flutter_app/lib/douwen/second
1
.dart
→
netrain_flutter_app/lib/douwen/second
page
.dart
View file @
6f0c4e5a
...
@@ -14,13 +14,13 @@ class Second extends StatelessWidget{
...
@@ -14,13 +14,13 @@ class Second extends StatelessWidget{
),
),
home:
Scaffold
(
home:
Scaffold
(
appBar:
AppBar
(
appBar:
AppBar
(
title:
Text
(
"
·2
"
),
title:
Text
(
"
second
"
),
),
),
body:
RouterNavigator
(
title:
'Flutter Demo Home Page'
),
body:
RouterNavigator
(
title:
'Flutter Demo Home Page'
),
),
),
),
),
onWillPop:
()
async
{
onWillPop:
()
async
{
Fluttertoast
.
showToast
(
msg:
"
˳
"
);
Fluttertoast
.
showToast
(
msg:
"
123
"
);
return
true
;
return
true
;
});
});
}
}
...
@@ -44,7 +44,7 @@ class _RouterNavigatorState extends State<RouterNavigator> {
...
@@ -44,7 +44,7 @@ class _RouterNavigatorState extends State<RouterNavigator> {
return
Container
(
return
Container
(
child:
Column
(
child:
Column
(
children:
[
children:
[
_item
(
"
ת
"
,
()
{
_item
(
"
123123
"
,
()
{
Navigator
.
push
(
Navigator
.
push
(
context
,
MaterialPageRoute
(
builder:
(
context
)
=>
Second
()));
context
,
MaterialPageRoute
(
builder:
(
context
)
=>
Second
()));
})
})
...
...
netrain_flutter_app/lib/laishanqi/netrain/Http/HttpUtil.dart
View file @
6f0c4e5a
...
@@ -8,12 +8,12 @@ class HttpUtil {
...
@@ -8,12 +8,12 @@ class HttpUtil {
static
HashMap
<
String
,
String
>
headers
;
static
HashMap
<
String
,
String
>
headers
;
static
String
scheme
=
"http"
;
static
String
scheme
=
"http"
;
static
String
host
=
"api-docker.naiterui.com"
;
static
String
host
=
"api-docker.naiterui.com
/
"
;
static
String
global_config
=
"ad/doctorInfo/globalConfig"
;
static
String
global_config
=
"ad/doctorInfo/globalConfig"
;
static
Future
<
http
.
Response
>
get
(
String
path
,{
Map
<
String
,
dynamic
>
queryParameters
})
async
{
static
Future
<
http
.
Response
>
get
(
String
path
,{
Map
<
String
,
dynamic
>
queryParameters
})
async
{
var
response
=
await
http
.
get
(
"http://
$host
/
$path
"
);
var
response
=
await
http
.
get
(
Uri
(
host:
"http://
$host
/
$path
"
)
);
// _get(path, host: HttpUtil.host, queryParameters: queryParameters);
// _get(path, host: HttpUtil.host, queryParameters: queryParameters);
return
response
;
return
response
;
}
}
...
...
netrain_flutter_app/lib/main.dart
View file @
6f0c4e5a
...
@@ -8,6 +8,8 @@ import 'laishanqi/netrain/user/loginPage.dart';
...
@@ -8,6 +8,8 @@ import 'laishanqi/netrain/user/loginPage.dart';
import
'laishanqi/netrain/user/RegisterPage.dart'
;
import
'laishanqi/netrain/user/RegisterPage.dart'
;
import
'laishanqi/photo.dart'
;
import
'laishanqi/photo.dart'
;
import
'zhangfeng/LoginPage.dart'
;
void
main
(
)
{
void
main
(
)
{
runApp
(
MyApp
());
runApp
(
MyApp
());
// runApp(Login());
// runApp(Login());
...
@@ -77,6 +79,7 @@ class _RouterNavigatorState extends State<RouterNavigator> {
...
@@ -77,6 +79,7 @@ class _RouterNavigatorState extends State<RouterNavigator> {
_item
(
"layout页面"
,
LayoutPage
(),
'layout'
),
_item
(
"layout页面"
,
LayoutPage
(),
'layout'
),
_item
(
"拍照页面"
,
PhotoApp
(),
'photo'
),
_item
(
"拍照页面"
,
PhotoApp
(),
'photo'
),
_item
(
"登陆"
,
LoginPage
(),
'login'
),
_item
(
"登陆"
,
LoginPage
(),
'login'
),
_item
(
"登录网络请求"
,
LoginRequestPage
(),
'loginRequest'
),
],
],
),
),
);
);
...
...
netrain_flutter_app/lib/zhangfeng/LoginPage.dart
0 → 100644
View file @
6f0c4e5a
import
'package:flutter/material.dart'
;
import
'package:fluttertoast/fluttertoast.dart'
;
import
'Network/Api.dart'
;
class
LoginRequestPage
extends
StatefulWidget
{
final
String
title
=
"登录页"
;
@override
_LoginState
createState
()
=>
_LoginState
();
}
class
_LoginState
extends
State
<
LoginRequestPage
>
{
// This widget is the root of your application.
void
_loginAction
()
{
Map
<
String
,
String
>
map
=
new
Map
<
String
,
String
>();
map
[
'workNumber'
]
=
'NTR000007'
;
map
[
'password'
]
=
'123456'
;
map
[
'model'
]
=
'iPhone 12'
;
map
[
'grant_type'
]
=
'worknumber_password'
;
map
[
'client_id'
]
=
'app'
;
map
[
'client_secret'
]
=
'123456'
;
map
[
'platform'
]
=
'0'
;
Api
.
request
(
map
);
}
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
Text
(
widget
.
title
),
),
body:
Center
(
child:
Column
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
<
Widget
>[
FloatingActionButton
(
onPressed:
_loginAction
,
child:
Icon
(
Icons
.
add
),
),
],
),
),
// This trailing comma makes auto-formatting nicer for build methods.
);
}
}
\ No newline at end of file
netrain_flutter_app/lib/zhangfeng/Network/Api.dart
0 → 100644
View file @
6f0c4e5a
import
'HttpManager.dart'
;
import
'UrlPath.dart'
;
/// 所有接口类
class
Api
{
///示例请求
static
request
(
Map
<
String
,
dynamic
>
param
)
{
return
HttpManager
.
getInstance
().
get
(
UrlPath
.
baseUrl
+
'auth/oauth/token'
,
params:
param
);
}
}
netrain_flutter_app/lib/zhangfeng/Network/Code.dart
0 → 100644
View file @
6f0c4e5a
///错误编码
class
Code
{
///网络错误
static
const
NETWORK_ERROR
=
-
1
;
///网络超时
static
const
NETWORK_TIMEOUT
=
-
2
;
///网络返回数据格式化一次
static
const
NETWORK_JSON_EXCEPTION
=
-
3
;
static
const
SUCCESS
=
200
;
static
errorHandleFunction
(
code
,
message
,
noTip
)
{
if
(
noTip
)
{
return
message
;
}
return
message
;
}
}
netrain_flutter_app/lib/zhangfeng/Network/DataHelper.dart
0 → 100644
View file @
6f0c4e5a
import
'dart:collection'
;
import
'dart:convert'
;
import
'package:crypto/crypto.dart'
;
import
'package:convert/convert.dart'
;
///参数加密工具
class
DataHelper
{
static
encryptParams
(
Map
<
String
,
dynamic
>
map
)
{
var
buffer
=
StringBuffer
();
map
.
forEach
((
key
,
value
)
{
buffer
.
write
(
key
);
buffer
.
write
(
value
);
});
buffer
.
write
(
"SERECT"
);
var
sign
=
string2MD5
(
buffer
.
toString
());
print
(
"sign--->"
+
sign
);
return
sign
;
}
static
string2MD5
(
String
data
)
{
var
content
=
new
Utf8Encoder
().
convert
(
data
);
var
digest
=
md5
.
convert
(
content
);
return
hex
.
encode
(
digest
.
bytes
);
}
}
netrain_flutter_app/lib/zhangfeng/Network/DioLogInterceptor.dart
0 → 100644
View file @
6f0c4e5a
import
'package:dio/dio.dart'
;
///日志拦截器
class
DioLogInterceptor
extends
Interceptor
{
///请求前
@override
void
onRequest
(
RequestOptions
options
,
RequestInterceptorHandler
handler
)
{
String
requestStr
=
"
\n
==================== REQUEST ====================
\n
"
"- URL:
\n
${options.baseUrl + options.path}
\n
"
"- METHOD:
${options.method}
\n
"
;
requestStr
+=
"- HEADER:
\n
${options.headers.mapToStructureString()}
\n
"
;
final
data
=
options
.
data
;
if
(
data
!=
null
)
{
if
(
data
is
Map
)
requestStr
+=
"- BODY:
\n
${data.mapToStructureString()}
\n
"
;
else
if
(
data
is
FormData
)
{
final
formDataMap
=
Map
()
..
addEntries
(
data
.
fields
)
..
addEntries
(
data
.
files
);
requestStr
+=
"- BODY:
\n
${formDataMap.mapToStructureString()}
\n
"
;
}
else
requestStr
+=
"- BODY:
\n
${data.toString()}
\n
"
;
}
print
(
requestStr
);
handler
.
next
(
options
);
}
///出错前
@override
void
onError
(
DioError
err
,
ErrorInterceptorHandler
handler
)
{
String
errorStr
=
"
\n
==================== RESPONSE ====================
\n
"
"- URL:
\n
${err.requestOptions.baseUrl + err.requestOptions.path}
\n
"
"- METHOD:
${err.requestOptions.method}
\n
"
;
errorStr
+=
"- HEADER:
\n
${err.response.headers.map.mapToStructureString()}
\n
"
;
if
(
err
.
response
!=
null
&&
err
.
response
.
data
!=
null
)
{
print
(
'╔
${err.type.toString()}
'
);
errorStr
+=
"- ERROR:
\n
${_parseResponse(err.response)}
\n
"
;
}
else
{
errorStr
+=
"- ERRORTYPE:
${err.type}
\n
"
;
errorStr
+=
"- MSG:
${err.message}
\n
"
;
}
print
(
errorStr
);
handler
.
next
(
err
);
}
///响应前
@override
void
onResponse
(
Response
response
,
ResponseInterceptorHandler
handler
)
{
String
responseStr
=
"
\n
==================== RESPONSE ====================
\n
"
"- URL:
\n
${response.requestOptions.uri}
\n
"
;
responseStr
+=
"- HEADER:
\n
{"
;
response
.
headers
.
forEach
(
(
key
,
list
)
=>
responseStr
+=
"
\n
"
+
"
\"
$key
\"
:
\"
$list
\"
,"
);
responseStr
+=
"
\n
}
\n
"
;
responseStr
+=
"- STATUS:
${response.statusCode}
\n
"
;
if
(
response
.
data
!=
null
)
{
responseStr
+=
"- BODY:
\n
${_parseResponse(response)}
"
;
}
printWrapped
(
responseStr
);
handler
.
next
(
response
);
}
void
printWrapped
(
String
text
)
{
final
pattern
=
new
RegExp
(
'.{1,800}'
);
// 800 is the size of each chunk
pattern
.
allMatches
(
text
).
forEach
((
match
)
=>
print
(
match
.
group
(
0
)));
}
String
_parseResponse
(
Response
response
)
{
String
responseStr
=
""
;
var
data
=
response
.
data
;
if
(
data
is
Map
)
responseStr
+=
data
.
mapToStructureString
();
else
if
(
data
is
List
)
responseStr
+=
data
.
listToStructureString
();
else
responseStr
+=
response
.
data
.
toString
();
return
responseStr
;
}
}
///Map拓展,MAp转字符串输出
extension
Map2StringEx
on
Map
{
String
mapToStructureString
({
int
indentation
=
2
})
{
String
result
=
""
;
String
indentationStr
=
" "
*
indentation
;
if
(
true
)
{
result
+=
"{"
;
this
.
forEach
((
key
,
value
)
{
if
(
value
is
Map
)
{
var
temp
=
value
.
mapToStructureString
(
indentation:
indentation
+
2
);
result
+=
"
\n
$indentationStr
"
+
"
\"
$key
\"
:
$temp
,"
;
}
else
if
(
value
is
List
)
{
result
+=
"
\n
$indentationStr
"
+
"
\"
$key
\"
:
${value.listToStructureString(indentation: indentation + 2)}
,"
;
}
else
{
result
+=
"
\n
$indentationStr
"
+
"
\"
$key
\"
:
\"
$value
\"
,"
;
}
});
result
=
result
.
substring
(
0
,
result
.
length
-
1
);
result
+=
indentation
==
2
?
"
\n
}"
:
"
\n
${" " * (indentation - 1)}
}"
;
}
return
result
;
}
}
///List拓展,List转字符串输出
extension
List2StringEx
on
List
{
String
listToStructureString
({
int
indentation
=
2
})
{
String
result
=
""
;
String
indentationStr
=
" "
*
indentation
;
if
(
true
)
{
result
+=
"
$indentationStr
["
;
this
.
forEach
((
value
)
{
if
(
value
is
Map
)
{
var
temp
=
value
.
mapToStructureString
(
indentation:
indentation
+
2
);
result
+=
"
\n
$indentationStr
"
+
"
\"
$temp
\"
,"
;
}
else
if
(
value
is
List
)
{
result
+=
value
.
listToStructureString
(
indentation:
indentation
+
2
);
}
else
{
result
+=
"
\n
$indentationStr
"
+
"
\"
$value
\"
,"
;
}
});
result
=
result
.
substring
(
0
,
result
.
length
-
1
);
result
+=
"
\n
$indentationStr
]"
;
}
return
result
;
}
}
netrain_flutter_app/lib/zhangfeng/Network/HttpManager.dart
0 → 100644
View file @
6f0c4e5a
import
'package:dio/dio.dart'
;
import
'Code.dart'
;
import
'DioLogInterceptor.dart'
;
import
'Loading.dart'
;
import
'ResponseInterceptor.dart'
;
import
'ResultData.dart'
;
import
'UrlPath.dart'
;
import
'DataHelper.dart'
;
class
HttpManager
{
static
HttpManager
_instance
=
HttpManager
.
_internal
();
Dio
_dio
;
static
const
CODE_SUCCESS
=
200
;
static
const
CODE_TIME_OUT
=
-
1
;
static
const
CONNECT_TIMEOUT
=
15000
;
factory
HttpManager
()
=>
_instance
;
///通用全局单例,第一次使用时初始化
HttpManager
.
_internal
({
String
baseUrl
})
{
if
(
null
==
_dio
)
{
_dio
=
new
Dio
(
new
BaseOptions
(
baseUrl:
UrlPath
.
baseUrl
,
connectTimeout:
CONNECT_TIMEOUT
));
_dio
.
interceptors
.
add
(
new
DioLogInterceptor
());
_dio
.
interceptors
.
add
(
new
ResponseInterceptors
());
}
}
static
HttpManager
getInstance
({
String
baseUrl
})
{
if
(
baseUrl
==
null
)
{
return
_instance
.
_normal
();
}
else
{
return
_instance
.
_baseUrl
(
baseUrl
);
}
}
//用于指定特定域名
HttpManager
_baseUrl
(
String
baseUrl
)
{
if
(
_dio
!=
null
)
{
_dio
.
options
.
baseUrl
=
baseUrl
;
}
return
this
;
}
//一般请求,默认域名
HttpManager
_normal
()
{
if
(
_dio
!=
null
)
{
if
(
_dio
.
options
.
baseUrl
!=
UrlPath
.
baseUrl
)
{
_dio
.
options
.
baseUrl
=
UrlPath
.
baseUrl
;
}
}
return
this
;
}
///通用的GET请求
get
(
api
,
{
params
,
withLoading
=
true
})
async
{
if
(
withLoading
)
{
Loading
.
show
();
}
Response
response
;
// params["platform"] = "android";
// params["system"] = "1.0.0";
// params["channel"] = "App";
// params["time"] = new DateTime.now().millisecondsSinceEpoch.toString();
// params["sign"] = DataHelper.encryptParams(params);
try
{
response
=
await
_dio
.
get
(
api
,
queryParameters:
params
);
if
(
withLoading
)
{
Loading
.
dismiss
();
}
}
on
DioError
catch
(
e
)
{
if
(
withLoading
)
{
Loading
.
dismiss
();
}
return
resultError
(
e
);
}
if
(
response
.
data
is
DioError
)
{
return
resultError
(
response
.
data
[
'code'
]);
}
return
response
.
data
;
}
///通用的POST请求
post
(
api
,
{
params
,
withLoading
=
true
})
async
{
if
(
withLoading
)
{
Loading
.
show
();
}
Response
response
;
// params["platform"] = "android";
// params["system"] = "1.0.0";
// params["channel"] = "App";
// params["time"] = new DateTime.now().millisecondsSinceEpoch.toString();
// params["sign"] = DataHelper.encryptParams(params);
try
{
response
=
await
_dio
.
post
(
api
,
data:
params
);
if
(
withLoading
)
{
Loading
.
dismiss
();
}
}
on
DioError
catch
(
e
)
{
if
(
withLoading
)
{
Loading
.
dismiss
();
}
return
resultError
(
e
);
}
if
(
response
.
data
is
DioError
)
{
return
resultError
(
response
.
data
[
'code'
]);
}
return
response
.
data
;
}
}
ResultData
resultError
(
DioError
e
)
{
Response
errorResponse
;
if
(
e
.
response
!=
null
)
{
errorResponse
=
e
.
response
;
}
else
{
errorResponse
=
new
Response
(
statusCode:
666
);
}
if
(
e
.
type
==
DioErrorType
.
connectTimeout
||
e
.
type
==
DioErrorType
.
receiveTimeout
)
{
errorResponse
.
statusCode
=
Code
.
NETWORK_TIMEOUT
;
}
return
new
ResultData
(
errorResponse
.
statusMessage
,
false
,
errorResponse
.
statusCode
);
}
netrain_flutter_app/lib/zhangfeng/Network/Loading.dart
0 → 100644
View file @
6f0c4e5a
import
'package:flutter_easyloading/flutter_easyloading.dart'
;
class
Loading
{
static
show
()
{
EasyLoading
.
show
();
}
static
dismiss
()
{
EasyLoading
.
dismiss
();
}
}
netrain_flutter_app/lib/zhangfeng/Network/ResponseInterceptor.dart
0 → 100644
View file @
6f0c4e5a
import
'package:dio/dio.dart'
;
import
'ResultData.dart'
;
/// 数据初步处理
class
ResponseInterceptors
extends
InterceptorsWrapper
{
@override
void
onResponse
(
Response
response
,
ResponseInterceptorHandler
handler
)
{
RequestOptions
option
=
response
.
requestOptions
;
try
{
if
(
option
.
contentType
!=
null
&&
option
.
contentType
.
contains
(
"text"
))
{
response
.
data
=
ResultData
(
response
.
data
,
true
,
200
);
handler
.
next
(
response
);
}
///一般只需要处理200的情况,300、400、500保留错误信息,外层为http协议定义的响应码
if
(
response
.
statusCode
==
200
||
response
.
statusCode
==
201
)
{
///内层需要根据公司实际返回结构解析,一般会有code,data,msg字段
int
code
=
response
.
data
[
"code"
];
if
(
code
==
0
)
{
response
.
data
=
ResultData
(
response
.
data
,
true
,
200
,
headers:
response
.
headers
);
handler
.
next
(
response
);
}
else
{
response
.
data
=
ResultData
(
response
.
data
,
false
,
200
,
headers:
response
.
headers
);
handler
.
next
(
response
);
}
}
}
catch
(
e
)
{
print
(
"ResponseError===="
+
e
.
toString
()
+
"****"
+
option
.
path
);
response
.
data
=
ResultData
(
response
.
data
,
false
,
response
.
statusCode
,
headers:
response
.
headers
);
handler
.
next
(
response
);
}
response
.
data
=
ResultData
(
response
.
data
,
false
,
response
.
statusCode
,
headers:
response
.
headers
);
handler
.
next
(
response
);
}
}
netrain_flutter_app/lib/zhangfeng/Network/ResultData.dart
0 → 100644
View file @
6f0c4e5a
class
ResultData
{
var
data
;
bool
isSuccess
;
int
code
;
var
headers
;
ResultData
(
this
.
data
,
this
.
isSuccess
,
this
.
code
,
{
this
.
headers
});
}
netrain_flutter_app/lib/zhangfeng/Network/UrlPath.dart
0 → 100644
View file @
6f0c4e5a
class
UrlPath
{
static
String
baseUrl
=
"https://api.health100.naiterui.com/"
;
}
netrain_flutter_app/pubspec.yaml
View file @
6f0c4e5a
...
@@ -29,10 +29,15 @@ dependencies:
...
@@ -29,10 +29,15 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons
:
^0.1.3
cupertino_icons
:
^0.1.3
image_picker
:
^0.
6.7+11
image_picker
:
^0.
8.1+3
fluttertoast
:
^3.1.3
fluttertoast
:
^3.1.3
http
:
0.1
2.2
http
:
0.1
3.3
mqtt_client
:
^9.3.2
mqtt_client
:
^9.3.2
flutter_easyrefresh
:
^2.2.1
#下拉刷新
json_annotation
:
^4.0.1
#json解析
flutter_easyloading
:
^3.0.0
#简单的加载loading
dio
:
^4.0.0
#网络库
convert
:
^3.0.1
#转码器
dev_dependencies
:
dev_dependencies
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment