Commit ce2c5f25a6f99bf325e6e67eea1c441d42e68e21

Authored by gaiyaguang
1 parent 3c42db19

网络异常处理

... ... @@ -7,6 +7,8 @@ PODS:
- Reachability
- connectivity_macos (0.0.1):
- Flutter
- device_info (0.0.1):
- Flutter
- Flutter (1.0.0)
- flutter_bugly (0.0.1):
- Bugly
... ... @@ -59,6 +61,7 @@ DEPENDENCIES:
- audioplayers (from `.symlinks/plugins/audioplayers/ios`)
- connectivity (from `.symlinks/plugins/connectivity/ios`)
- connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`)
- device_info (from `.symlinks/plugins/device_info/ios`)
- Flutter (from `Flutter`)
- flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
- flutter_statusbarcolor (from `.symlinks/plugins/flutter_statusbarcolor/ios`)
... ... @@ -94,6 +97,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/connectivity/ios"
connectivity_macos:
:path: ".symlinks/plugins/connectivity_macos/ios"
device_info:
:path: ".symlinks/plugins/device_info/ios"
Flutter:
:path: Flutter
flutter_bugly:
... ... @@ -136,6 +141,7 @@ SPEC CHECKSUMS:
Bugly: 4edda9bb0e3017fd453612189069757195fa23ca
connectivity: 6e94255659cc86dcbef1d452ad3e0491bb1b3e75
connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191
device_info: d7d233b645a32c40dfdc212de5cf646ca482f175
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
flutter_bugly: c9800f4d5bc5bdc27ffdde3417a26ba44266e0c3
flutter_statusbarcolor: 8afb1071ed8c58be929f1e32b36c629771fd2259
... ...
... ... @@ -383,7 +383,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/RunnerProfile.entitlements;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
... ... @@ -396,7 +396,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 1.0.3;
MARKETING_VERSION = 1.0.4;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "一键订";
PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile";
... ... @@ -526,7 +526,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
... ... @@ -539,7 +539,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 1.0.3;
MARKETING_VERSION = 1.0.4;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "一键订";
PROVISIONING_PROFILE_SPECIFIER = "Push Development Profile";
... ... @@ -558,7 +558,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3;
CURRENT_PROJECT_VERSION = 4;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
... ... @@ -571,7 +571,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 1.0.3;
MARKETING_VERSION = 1.0.4;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "一键订";
PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile";
... ...
... ... @@ -170,60 +170,70 @@ class DioUtil {
Future<BaseResp<T>> request<T>(BuildContext context,String method, String path,
{data, Options options, CancelToken cancelToken,bool showLoading=true}) async {
bool connectivity=await Utils.checkConnectiviy();
if(!connectivity){
Utils.showToast("网络错误,请稍后重试");
return new Future.error("网络错误,请稍后重试");
}
// if(!connectivity){
// Utils.showToast("网络错误,请稍后重试");
// return new Future.error("网络错误,请稍后重试");
// }
if(showLoading)Loading.showLoading(context);
Response response = await _dio.request(path,
data: data,
options: _checkOptions(method, options),
cancelToken: cancelToken);
_printHttpLog(response);
String _status;
int _code;
String _msg;
T _data;
if (response.statusCode == HttpStatus.ok ||
response.statusCode == HttpStatus.created) {
try {
if (response.data is Map) {
_status = (response.data[_statusKey] is int)
? response.data[_statusKey].toString()
: response.data[_statusKey];
_code = (response.data[_codeKey] is String)
? int.tryParse(response.data[_codeKey])
: response.data[_codeKey];
_msg = response.data[_msgKey];
_data = response.data[_dataKey];
} else {
Map<String, dynamic> _dataMap = _decodeData(response);
_status = (_dataMap[_statusKey] is int)
? _dataMap[_statusKey].toString()
: _dataMap[_statusKey];
_code = (_dataMap[_codeKey] is String)
? int.tryParse(_dataMap[_codeKey])
: _dataMap[_codeKey];
_msg = _dataMap[_msgKey];
_data = _dataMap[_dataKey];
try{
Response response = await _dio.request(path,
data: data,
options: _checkOptions(method, options),
cancelToken: cancelToken);
_printHttpLog(response);
String _status;
int _code;
String _msg;
T _data;
if (response.statusCode == HttpStatus.ok ||
response.statusCode == HttpStatus.created) {
try {
if (response.data is Map) {
_status = (response.data[_statusKey] is int)
? response.data[_statusKey].toString()
: response.data[_statusKey];
_code = (response.data[_codeKey] is String)
? int.tryParse(response.data[_codeKey])
: response.data[_codeKey];
_msg = response.data[_msgKey];
_data = response.data[_dataKey];
} else {
Map<String, dynamic> _dataMap = _decodeData(response);
_status = (_dataMap[_statusKey] is int)
? _dataMap[_statusKey].toString()
: _dataMap[_statusKey];
_code = (_dataMap[_codeKey] is String)
? int.tryParse(_dataMap[_codeKey])
: _dataMap[_codeKey];
_msg = _dataMap[_msgKey];
_data = _dataMap[_dataKey];
}
Loading.hideLoading(context);
return new BaseResp(_status, _code, _msg, _data);
} catch (e) {
Loading.hideLoading(context);
return new Future.error(new DioError(
response: response,
message: "data parsing exception...",
type: DioErrorType.RESPONSE,
));
}
}
Loading.hideLoading(context);
return new Future.error(new DioError(
response: response,
message: "statusCode: $response.statusCode, service error",
type: DioErrorType.RESPONSE,
));
}on DioError catch(error){
if(showLoading){
Loading.hideLoading(context);
return new BaseResp(_status, _code, _msg, _data);
} catch (e) {
Loading.hideLoading(context);
return new Future.error(new DioError(
response: response,
message: "data parsing exception...",
type: DioErrorType.RESPONSE,
));
}
if(error is DioError &&error.type==DioErrorType.CONNECT_TIMEOUT){
Utils.showToast("网络链接超时,请稍后重试");
}
throw error;
}
Loading.hideLoading(context);
return new Future.error(new DioError(
response: response,
message: "statusCode: $response.statusCode, service error",
type: DioErrorType.RESPONSE,
));
}
/// Make http request with options.
... ...
... ... @@ -14,4 +14,5 @@ class HttpUrl{
static const String set_message_status="?service=Android.Advance.SetMessageStatus";//设置消息状态
static const String get_sms_content="?service=App.SendSMS.GetSmsContent";//获取短信内容
static const String send_sms="?service=App.SendSMS.NewMessage";//发送短信
static const String check_update="http://xt03.colorcun.com/admin/api/compareversion?flat=3";
}
\ No newline at end of file
... ...
... ... @@ -78,7 +78,7 @@ class HomePageState extends State<HomePage>{
// initXinge();
WidgetsBinding.instance.addPostFrameCallback((_){
if(widget.initialIndex==0)return;
getUntreatedMessage();
// getUntreatedMessage();
// UpdateModel updateModel=new UpdateModel();
// updateModel.checkUpdate(context);
});
... ...
... ... @@ -4,6 +4,7 @@ import 'package:one_key/pages/message/messsage_item.dart';
import 'package:one_key/provider/message_dialog_model.dart';
import 'package:one_key/provider/message_model.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/widgets/page_error.dart';
import 'package:provider/provider.dart';
import 'package:one_key/utils/event_bus.dart';
... ... @@ -52,21 +53,28 @@ class MessageLeftPageState extends State<MessageLeftPage> {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Selector<MessageModel,List>(
selector: (context,model)=>model.untreatedMsgs,
builder: (context,messages,child){
return EasyRefresh.custom(
controller: _controller,
slivers: [
SliverList(
delegate:
SliverChildBuilderDelegate((BuildContext context, int index) {
return MessageItem(messages[index]);
},childCount: messages.length),
)
],onRefresh: () async {
getUntreatedMessage();
},);
return Consumer<MessageModel>(
builder: (context,model,_){
if(!model.connect_timeout){
return Center(
child: ErrorPage(callback: (){
getUntreatedMessage();
},),
);
}else{
return EasyRefresh.custom(
controller: _controller,
slivers: [
SliverList(
delegate:
SliverChildBuilderDelegate((BuildContext context, int index) {
return MessageItem(model.untreatedMsgs[index]);
},childCount: model.untreatedMsgs.length),
)
],onRefresh: () async {
getUntreatedMessage();
},);
}
},
);
}
... ...
... ... @@ -3,6 +3,7 @@ import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:one_key/pages/message/messsage_item.dart';
import 'package:one_key/provider/message_model.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/widgets/page_error.dart';
import 'package:provider/provider.dart';
class MessageRightPage extends StatefulWidget{
... ... @@ -47,26 +48,28 @@ class MessageRightPageState extends State<MessageRightPage>{
@override
Widget build(BuildContext context) {
// TODO: implement build
return Selector<MessageModel,List>(
selector: (context,model)=>model.treatedMsgs,
shouldRebuild: (pre,next)=>true,
builder: (context,messages,child){
return EasyRefresh.custom(
controller: _controller,
slivers: [
SliverList(
delegate:
SliverChildBuilderDelegate((BuildContext context, int index) {
return MessageItem(messages[index],isTreated: true,);
},childCount: messages.length),
)
],onRefresh: () async {
offset=1;
getTreatedMessage();
},onLoad: () async {
offset++;
getTreatedMessage();
},);
return Consumer<MessageModel>(
builder: (context,model,_){
if(!model.connect_timeout){
return Center(
child: ErrorPage(callback: (){
getTreatedMessage();
},),
);
}else{
return EasyRefresh.custom(
controller: _controller,
slivers: [
SliverList(
delegate:
SliverChildBuilderDelegate((BuildContext context, int index) {
return MessageItem(model.treatedMsgs[index]);
},childCount: model.treatedMsgs.length),
)
],onRefresh: () async {
getTreatedMessage();
},);
}
},
);
}
... ...
... ... @@ -37,8 +37,8 @@ class MyPageState extends State<MyPage>{
//检查版本更新
checkUpdate(){
UpdateModel updateModel=new UpdateModel();
updateModel.checkUpdate(context);
// UpdateModel updateModel=new UpdateModel();
// updateModel.checkUpdate(context);
}
@override
... ...
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
... ... @@ -11,6 +12,7 @@ import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/app_bar.dart';
import 'package:one_key/widgets/common_button.dart';
import 'package:one_key/widgets/page_error.dart';
import 'package:provider/provider.dart';
class NoteBookPage extends StatefulWidget {
... ... @@ -391,26 +393,33 @@ class NoteBookPageState extends State<NoteBookPage> {
),
_buildListTitle(),
Expanded(
child: Selector<NoteBookModel, List>(
selector: (context, model) => model.notebooks,
builder: (context, notebooks, child) {
return EasyRefresh.custom(
controller: _controller,
slivers: [
SliverFixedExtentList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return NoteBookItem(notebooks[index], index);
}, childCount: notebooks.length),
itemExtent: ScreenUtil().setHeight(112),
)
],
onRefresh: () async {
_getReserveList();
child: Consumer<NoteBookModel>(
builder: (context,model,_){
if(model.connect_timeout){
return Center(
child: ErrorPage(callback: (){
_getReserveList();
},),
);
}else{
return EasyRefresh.custom(
controller: _controller,
slivers: [
SliverFixedExtentList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return NoteBookItem(model.notebooks[index], index);
}, childCount: model.notebooks.length),
itemExtent: ScreenUtil().setHeight(112),
)
],
onRefresh: () async {
_getReserveList();
},
);
}
},
);
},
))
))
],
),
);
... ...
... ... @@ -52,7 +52,7 @@ class MessageDialogModel extends ChangeNotifier{
.catchError((error) {
print(error.toString());
});
if (baseResp.code == Constant.status_success) {
if (baseResp!=null&&baseResp.code == Constant.status_success) {
messages=baseResp.data.map<Message>((value){
return Message.fromJson(value);
}).toList();
... ...
... ... @@ -12,15 +12,21 @@ class MessageModel extends ChangeNotifier{
List<Message> untreatedMsgs=[];//未处理在线预订消息
List<Message> treatedMsgs=[];//已处理在线预订消息
bool connect_timeout=true;
//获取未处理在线预订消息
getUntreatedMsg(BuildContext context,Map<String,String> params) async {
connect_timeout=true;
notifyListeners();
BaseResp<List> baseResp = await DioUtil()
.request<List>(context, Method.get, HttpUrl.get_message_list,
data: params)
.catchError((error) {
print(error.toString());
connect_timeout=false;
notifyListeners();
});
if (baseResp.code == Constant.status_success) {
if (baseResp!=null&&baseResp.code == Constant.status_success) {
untreatedMsgs=baseResp.data.map<Message>((value){
return Message.fromJson(value);
}).toList();
... ... @@ -31,13 +37,17 @@ class MessageModel extends ChangeNotifier{
//获取未处理在线预订消息
getTreatedMsg(BuildContext context,Map<String,String> params) async {
connect_timeout=true;
notifyListeners();
BaseResp<List> baseResp = await DioUtil()
.request<List>(context, Method.get, HttpUrl.get_message_list,
data: params)
.catchError((error) {
print(error.toString());
connect_timeout=false;
notifyListeners();
});
if (baseResp.code == Constant.status_success) {
if (baseResp!=null&&baseResp.code == Constant.status_success) {
if(params["offset"]=="0"){//第一页
treatedMsgs=baseResp.data.map<Message>((value){
return Message.fromJson(value);
... ...
... ... @@ -14,14 +14,21 @@ class NoteBookModel extends ChangeNotifier{
String total="";//一天统计
bool connect_timeout=false;
//获取已预订订单
Future<List<Notebook>> getReserveList(BuildContext context,Map<String,String> params) async {
connect_timeout=false;
notifyListeners();
BaseResp<List> baseResp = await DioUtil()
.request<List>(context, Method.get, HttpUrl.get_reserve_list,
data: params,showLoading: true)
.catchError((error) {
print(error.toString());
connect_timeout=true;
notifyListeners();
});
if(baseResp==null)return null;
notebooks=[];
if (baseResp.code == Constant.status_success) {
notebooks=baseResp.data.map<Notebook>((value){
... ... @@ -42,7 +49,7 @@ class NoteBookModel extends ChangeNotifier{
.catchError((error) {
print(error.toString());
});
if (baseResp.code == Constant.status_success) {
if (baseResp!=null&&baseResp.code == Constant.status_success) {
int morning=int.parse(baseResp.data["morning"].toString());
int noon=int.parse(baseResp.data["noon"].toString());
int night=int.parse(baseResp.data["night"].toString());
... ...
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:install_plugin/install_plugin.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/models/version.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/log_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
class UpdateModel {
int _progress; //下载进度
Function _setState;
//检查更新
checkUpdate(BuildContext context) {
Future.delayed(new Duration(milliseconds: 1000), () {
if (Random().nextInt(10) > 0) {
checkUpdate(BuildContext context) async {
String deviceId = await Utils.getUUID();
UserModel userModel = Provider.of<UserModel>(context, listen: false);
int versionCode = await Utils.getCurrBuildNum();
Map<String, String> params = {
"deviceId": deviceId,
"sid": userModel.user.sellerid,
"versionCode": versionCode.toString()
};
BaseResp<List> baseResp = await DioUtil()
.request<List>(context, Method.get, HttpUrl.check_update, data: params)
.catchError((error) {
print(error.toString());
});
if (baseResp.code == Constant.status_success) {
LogUtil.v(baseResp.data);
Map<String, String> dataMap = baseResp.data[0];
if (int.parse(dataMap["version"]) > versionCode) {
Version version = Version.fromJson({
"version": "v1.0.3",
"file_url":
"http://xt03.colorcun.com/uploads/20191105/67e38355c41528b24a97e9ac71a221ea.apk",
"content": "1.bug修复;\n2.功能更新;"
"version": dataMap["versionName"],
"file_url":dataMap["file_url"],
"content": dataMap["content"]
});
showUpdateDialog(context, version);
}
});
}
// if(Platform.isAndroid){
//
// }else{
//// Response response=await DioUtil().getDio().get("http://itunes.apple.com/lookup?id=1510697490");
//// Map<String,dynamic> dataMap=jsonDecode(response.data);
//// String version=((dataMap["results"] as List)[0] as Map)["version"] as String;
//// String currVersion=await Utils.getCurrVersion();
//// if(version.compareTo(currVersion)>0){
//// Version version = Version.fromJson({
//// "version": "version",
//// "file_url":dataMap["file_url"],
//// "content": dataMap["content"]
//// });
//// showUpdateDialog(context, version);
//// }
// }
}
//版本更新弹框
... ... @@ -90,7 +129,8 @@ class UpdateModel {
),
),
),
MyDivider(ScreenUtil().setWidth(1),ScreenUtil().setWidth(94)),
MyDivider(
ScreenUtil().setWidth(1), ScreenUtil().setWidth(94)),
Expanded(
child: GestureDetector(
onTap: () {
... ... @@ -117,16 +157,18 @@ class UpdateModel {
],
),
);
return Center(child: UnconstrainedBox(
constrainedAxis: Axis.vertical,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: ScreenUtil().setWidth(560)),
child: DefaultTextStyle(
style: TextStyle(decoration: TextDecoration.none),
child: widget,
)
return Center(
child: UnconstrainedBox(
constrainedAxis: Axis.vertical,
child: ConstrainedBox(
constraints:
BoxConstraints(maxWidth: ScreenUtil().setWidth(560)),
child: DefaultTextStyle(
style: TextStyle(decoration: TextDecoration.none),
child: widget,
)),
),
),);
);
return AlertDialog(
content: widget,
contentPadding: EdgeInsets.zero,
... ... @@ -141,16 +183,17 @@ class UpdateModel {
if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
final dir = await getExternalStorageDirectory();
String savePath = dir.path + "/one_key";
Directory directory=new Directory(savePath);
if(directory.existsSync()){//删除历史apk
final List<FileSystemEntity> files=directory.listSync();
for(FileSystemEntity file in files){
Directory directory = new Directory(savePath);
if (directory.existsSync()) {
//删除历史apk
final List<FileSystemEntity> files = directory.listSync();
for (FileSystemEntity file in files) {
file.deleteSync();
}
}
showDownloadProgress(context);
DioUtil().download(file_url, savePath, onProgress: (received, total) {
if(_progress!=100){
if (_progress != 100) {
int progress = ((received / total) * 100).round();
_progress = progress;
_setState(() {});
... ... @@ -171,7 +214,7 @@ class UpdateModel {
builder: (ct) {
return AlertDialog(
content: StatefulBuilder(builder: (context, setState) {
if (_progress==100) {
if (_progress == 100) {
Navigator.of(ct).pop();
}
_setState = setState;
... ...
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:jpush_flutter/jpush_flutter.dart';
... ... @@ -118,7 +119,7 @@ class UserModel with ChangeNotifier {
.catchError((error) {
print(error.toString());
});
if (baseResp.code == Constant.status_success) {
if (baseResp!=null&&baseResp.code == Constant.status_success) {
}
}
... ...
import 'dart:io';
import 'package:connectivity/connectivity.dart';
import 'package:device_info/device_info.dart';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
... ... @@ -94,6 +97,24 @@ class Utils {
return version;
}
//获取当前构建版本号
static Future<int> getCurrBuildNum() async {
PackageInfo packageInfo=await PackageInfo.fromPlatform();
return int.parse(packageInfo.buildNumber);
}
//获取唯一标识
static Future<String> getUUID() async {
DeviceInfoPlugin deviceInfoPlugin=DeviceInfoPlugin();
if(Platform.isAndroid){
AndroidDeviceInfo androidDeviceInfo=await deviceInfoPlugin.androidInfo;
return androidDeviceInfo.androidId;
}else{
IosDeviceInfo iosDeviceInfo=await deviceInfoPlugin.iosInfo;
return iosDeviceInfo.identifierForVendor;
}
}
//比较两个日期是否同一天
static isOneDay(DateTime one,DateTime two){
if(one.year==two.year&&one.month==two.month&&one.day==two.day)return true;
... ...
... ... @@ -26,8 +26,9 @@ class ErrorPageState extends State<ErrorPage>{
height: double.infinity,
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Image.asset("assets/bg_error",width: ScreenUtil().setWidth(311),height: ScreenUtil().setWidth(215),),
Image.asset("assets/bg_error.png",width: ScreenUtil().setWidth(311),height: ScreenUtil().setWidth(215),),
VEmptyView(40),
Text("哎呀~网络好像走失了呢",style: TextStyle(fontSize: ScreenUtil().setSp(32),color: MyColours.color_353535),),
VEmptyView(20),
... ...
... ... @@ -197,6 +197,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.9"
device_info:
dependency: "direct main"
description:
name: device_info
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.2+4"
dio:
dependency: "direct main"
description:
... ...
... ... @@ -77,6 +77,8 @@ dependencies:
install_plugin: ^2.0.1
# 获取应用版本信息
package_info: ^0.4.0+18
# 获取设备信息
device_info: ^0.4.2+4
dev_dependencies:
flutter_test:
... ...