Commit 6d4505c5bf3110e572bc68cbdefa56aee05df137

Authored by gaiyaguang
2 parents a22d7081 c4d78e0b

2020-09-07

... ... @@ -43,8 +43,8 @@ android {
applicationId "com.naji.one_key"
minSdkVersion 21
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
versionCode 7
versionName "1.0.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
... ...
... ... @@ -6,6 +6,10 @@
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<application
android:name="io.flutter.app.FlutterApplication"
android:label="一键订"
... ... @@ -40,5 +44,6 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
... ...
include ':app'
... ...
... ... @@ -6,6 +6,10 @@ PODS:
- Reachability
- connectivity_macos (0.0.1):
- Flutter
- contacts_service (0.2.2):
- Flutter
- device_info (0.0.1):
- Flutter
- Flutter (1.0.0)
- flutter_statusbarcolor (0.0.1):
- Flutter
... ... @@ -47,12 +51,20 @@ PODS:
- Flutter
- url_launcher_web (0.0.1):
- Flutter
<<<<<<< HEAD
- WechatOpenSDK (1.8.6.2)
=======
- webview_flutter (0.0.1):
- Flutter
- WechatOpenSDK (1.8.7.1)
>>>>>>> dev
DEPENDENCIES:
- audioplayers (from `.symlinks/plugins/audioplayers/ios`)
- connectivity (from `.symlinks/plugins/connectivity/ios`)
- connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`)
- contacts_service (from `.symlinks/plugins/contacts_service/ios`)
- device_info (from `.symlinks/plugins/device_info/ios`)
- Flutter (from `Flutter`)
- flutter_statusbarcolor (from `.symlinks/plugins/flutter_statusbarcolor/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
... ... @@ -69,6 +81,7 @@ DEPENDENCIES:
- url_launcher (from `.symlinks/plugins/url_launcher/ios`)
- url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`)
- url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`)
- webview_flutter (from `.symlinks/plugins/webview_flutter/ios`)
SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
... ... @@ -85,6 +98,10 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/connectivity/ios"
connectivity_macos:
:path: ".symlinks/plugins/connectivity_macos/ios"
contacts_service:
:path: ".symlinks/plugins/contacts_service/ios"
device_info:
:path: ".symlinks/plugins/device_info/ios"
Flutter:
:path: Flutter
flutter_statusbarcolor:
... ... @@ -117,11 +134,15 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/url_launcher_macos/ios"
url_launcher_web:
:path: ".symlinks/plugins/url_launcher_web/ios"
webview_flutter:
:path: ".symlinks/plugins/webview_flutter/ios"
SPEC CHECKSUMS:
audioplayers: 84f968cea3f2deab00ec4f8ff53358b3c0b3992c
connectivity: 6e94255659cc86dcbef1d452ad3e0491bb1b3e75
connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191
contacts_service: 849e1f84281804c8bfbec1b4c3eedcb23c5d3eca
device_info: d7d233b645a32c40dfdc212de5cf646ca482f175
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
flutter_statusbarcolor: 8afb1071ed8c58be929f1e32b36c629771fd2259
fluttertoast: b644586ef3b16f67fae9a1f8754cef6b2d6b634b
... ... @@ -142,7 +163,12 @@ SPEC CHECKSUMS:
url_launcher: a1c0cc845906122c4784c542523d8cacbded5626
url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313
url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c
<<<<<<< HEAD
WechatOpenSDK: 8b3ba4239193d1112205c139c94e21934e8f369a
=======
webview_flutter: d2b4d6c66968ad042ad94cbb791f5b72b4678a96
WechatOpenSDK: 6a4d1436c15b3b5fe2a0bd383f3046010186da44
>>>>>>> dev
PODFILE CHECKSUM: a5c9f5cbedb217afa5108d75ed888500ab689803
... ...
... ... @@ -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 = 8;
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.8;
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 = 8;
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.8;
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 = 8;
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.8;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "一键订";
PROVISIONING_PROFILE_SPECIFIER = "OneKey Distribution Profile";
... ...
... ... @@ -2,8 +2,6 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key></key>
<string></string>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
... ... @@ -84,5 +82,7 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>io.flutter.embedded_views_preview</key>
<true/>
</dict>
</plist>
... ...
... ... @@ -74,7 +74,7 @@ class MyAppState extends State<MyApp>{
appId: "wx85aa3cdd0f791e65",
doOnAndroid: true,
doOnIOS: true,
universalLink: "https://xt04.colorcun.com/link/");
universalLink: "https://xt04.colorcun.com/link/OneKey/");
var result = await isWeChatInstalled;
LogUtil.v("is installed $result");
}
... ...
... ... @@ -2,13 +2,14 @@
* 更新版本
*/
class Version{
String version;//更新版本号
String name;//更新版本号
String version;//构建版本号
String file_url;//安装包下载地址
String content;//更新内容
Version();
factory Version.fromJson(Map<String,dynamic> json)=>Version()..version=json["version"]..file_url=json["file_url"]..content=json["content"];
factory Version.fromJson(Map<String,dynamic> json)=>Version()..name=json["name"]..version=json["version"]..file_url=json["file_url"]..content=json["content"];
Map<String,dynamic> toJson()=><String,dynamic>{"version":version,"file_url":file_url,"content":content};
Map<String,dynamic> toJson()=><String,dynamic>{name:"name","version":version,"file_url":file_url,"content":content};
}
\ No newline at end of file
... ...
... ... @@ -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,6 @@ 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";
static const String upload_contact="?service=App.Seller.SaveCallRecord";//上传通讯录
}
\ No newline at end of file
... ...
... ... @@ -10,6 +10,7 @@ import 'package:one_key/models/message.dart';
import 'package:one_key/pages/message/message_page.dart';
import 'package:one_key/pages/my/my_page.dart';
import 'package:one_key/pages/notebook/notebook_page.dart';
import 'package:one_key/provider/contact_model.dart';
import 'package:one_key/provider/message_dialog_model.dart';
import 'package:one_key/provider/message_model.dart';
import 'package:one_key/provider/my_model.dart';
... ... @@ -78,7 +79,8 @@ class HomePageState extends State<HomePage>{
// initXinge();
WidgetsBinding.instance.addPostFrameCallback((_){
if(widget.initialIndex==0)return;
getUntreatedMessage();
ContactModel.getInstance().uploadLocalContact(context);
// 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],isTreated: true,);
},childCount: model.treatedMsgs.length),
)
],onRefresh: () async {
getTreatedMessage();
},);
}
},
);
}
... ...
... ... @@ -75,7 +75,7 @@ class MyPageState extends State<MyPage>{
},),
MyDivider(double.infinity,ScreenUtil().setHeight(1),color: MyColours.color_f3f3f3,),
MyItem(title:"帮助与反馈",content:"",callback: (){
Utils.goHelp();
Utils.goHelp(context);
},),
MyDivider(double.infinity,ScreenUtil().setHeight(1),color: MyColours.color_f3f3f3),
GestureDetector(
... ...
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();
},
);
}
},
);
},
))
))
],
),
);
... ...
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:one_key/widgets/app_bar.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebViewPage extends StatefulWidget {
@override
_WebViewPageState createState() => _WebViewPageState();
}
class _WebViewPageState extends State<WebViewPage> {
final Completer<WebViewController> _controller =
Completer<WebViewController>();
@override
Widget build(BuildContext context) {
return Scaffold(
// We're using a Builder here so we have a context that is below the Scaffold
// to allow calling Scaffold.of(context) so we can show a snackbar.
appBar: AppBar(
title: const Text('一键订'),
// This drop down menu demonstrates that Flutter widgets can be shown over the web view.
),
body: Builder(builder: (BuildContext context) {
return WebView(
initialUrl: "https://support.qq.com/product/152856",
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller.complete(webViewController);
},
// TODO(iskakaushik): Remove this when collection literals makes it to stable.
// ignore: prefer_collection_literals
javascriptChannels: <JavascriptChannel>[
_toasterJavascriptChannel(context),
].toSet(),
navigationDelegate: (NavigationRequest request) {
if (request.url.startsWith('https://www.youtube.com/')) {
print('blocking navigation to $request}');
return NavigationDecision.prevent;
}
print('allowing navigation to $request');
return NavigationDecision.navigate;
},
onPageStarted: (String url) {
print('Page started loading: $url');
},
onPageFinished: (String url) {
print('Page finished loading: $url');
},
gestureNavigationEnabled: true,
);
}),
);
}
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
}
}
\ No newline at end of file
... ...
import 'dart:convert';
import 'dart:io';
import 'package:contacts_service/contacts_service.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:one_key/constant/constant.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/utils/log_util.dart';
import 'package:one_key/utils/misc.dart';
/**
* 上传联系人
*/
class ContactModel{
ContactModel._();
static ContactModel _instance;
static ContactModel getInstance(){
if(_instance==null){
_instance=ContactModel._();
}
return _instance;
}
uploadLocalContact(BuildContext context) async {
bool authority=await requestContactPermission();
if(authority){
Iterable<Contact> contacts=await ContactsService.getContacts(withThumbnails: false);
List<Map<String,String>> callLogs=[];
LogUtil.v("length:${contacts.length}");
contacts.forEach((contact){
String phoneNum="";
if(contact.phones.isNotEmpty){
phoneNum=contact.phones.first.value.trim();
}
Map<String,String> callLog={
"phoneNum":"$phoneNum",
"sid":"154",
"deviceId":"dhgajkhdgahghsdghdkgahd",
"phoneDate":"${DateTime.now().millisecondsSinceEpoch}",
"callType":"2",
"callUser":"${contact.displayName}"
};
callLogs.add(callLog);
});
Map<String,String> params={
"data":jsonEncode(callLogs)
};
BaseResp<String> baseResp = await DioUtil()
.request<String>(context, Method.get, HttpUrl.upload_contact,
data: params,options: Options(method: Method.post,contentType: ContentType.parse("application/x-www-form-urlencoded")))
.catchError((error) {
print(error.toString());
});
if(baseResp!=null&&baseResp.code == Constant.status_success){
LogUtil.v("联系人上传成功:${contacts.length}条");
}
}
}
}
\ No newline at end of file
... ...
... ... @@ -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();
String make="3";
if(Platform.isIOS)make="4";
Map<String, String> params = {
"deviceId": deviceId,
"sid": userModel.user.sellerid,
"versionCode": versionCode.toString(),
"flag":"4",
"make":make,//3 android 4 ios
};
BaseResp<List> baseResp = await DioUtil()
.request<List>(context, Method.get, HttpUrl.check_update, data: params)
.catchError((error) {
print(error.toString());
Utils.showToast("当前已是最新版本");
});
if (baseResp.code == Constant.status_success) {
LogUtil.v(baseResp.data);
Map<String, dynamic> dataMap = baseResp.data[0];
if (int.parse(dataMap["version"].toString()) > versionCode) {
Version version = Version.fromJson({
"version": "v1.0.3",
"file_url":
"http://xt03.colorcun.com/uploads/20191105/67e38355c41528b24a97e9ac71a221ea.apk",
"content": "1.bug修复;\n2.功能更新;"
"name":dataMap["name"].toString(),
"version": dataMap["version"].toString(),
"file_url":dataMap["file_url"].toString(),
"content": dataMap["content"].toString()
});
showUpdateDialog(context, version);
}else{
Utils.showToast(baseResp.msg??"当前已是最新版本");
}
});
}else{
Utils.showToast(baseResp.msg??"当前已是最新版本");
}
// 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);
//// }
// }
}
//版本更新弹框
... ... @@ -54,7 +103,7 @@ class UpdateModel {
children: <Widget>[
Center(
child: Text(
"${version.version}版本更新啦",
"${version.name}版本更新啦",
style: TextStyle(
fontSize: ScreenUtil().setSp(36),
color: MyColours.color_353535),
... ... @@ -90,7 +139,8 @@ class UpdateModel {
),
),
),
MyDivider(ScreenUtil().setWidth(1),ScreenUtil().setWidth(94)),
MyDivider(
ScreenUtil().setWidth(1), ScreenUtil().setWidth(94)),
Expanded(
child: GestureDetector(
onTap: () {
... ... @@ -117,16 +167,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 +193,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 +224,7 @@ class UpdateModel {
builder: (ct) {
return AlertDialog(
content: StatefulBuilder(builder: (context, setState) {
if (_progress==100) {
if (_progress == 100) {
Navigator.of(ct).pop();
}
_setState = setState;
... ...
... ... @@ -9,7 +9,6 @@ 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/res/colors.dart';
import 'package:one_key/utils/log_util.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
... ... @@ -118,7 +117,7 @@ class UserModel with ChangeNotifier {
.catchError((error) {
print(error.toString());
});
if (baseResp.code == Constant.status_success) {
if (baseResp!=null&&baseResp.code == Constant.status_success) {
}
}
... ...
... ... @@ -8,6 +8,7 @@ import 'package:one_key/pages/detail/handle_online_page.dart';
import 'package:one_key/pages/detail/notebook_detail_page.dart';
import 'package:one_key/pages/sms/sms_page.dart';
import 'package:one_key/pages/table/select_table_page.dart';
import 'package:one_key/pages/webview/webview_page.dart';
import 'package:one_key/utils/fluro_convert_utils.dart';
import 'package:one_key/utils/log_util.dart';
... ... @@ -66,3 +67,9 @@ var handleSmsHandler = new Handler(
return SmsPage(rid);
});
// 浏览网页
var handleWebviewHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
return WebViewPage();
});
... ...
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:one_key/pages/login/login_page.dart';
import 'package:one_key/utils/log_util.dart';
import 'route_handles.dart';
... ... @@ -12,6 +13,7 @@ class Routes {
static String select_table="/select_table";//选择桌位
static String invication="/invication";//邀请函
static String sms="/sms";//发短信
static String webview="/webview";//网页
static void configureRoutes(Router router) {
... ... @@ -27,5 +29,6 @@ class Routes {
router.define(select_table, handler: handleSelectTableHandler);
router.define(invication, handler: handleInvicationHandler);
router.define(sms, handler: handleSmsHandler);
router.define(webview, handler: handleWebviewHandler);
}
}
... ...
... ... @@ -174,7 +174,7 @@ class DialogUtil {
color: MyColours.color_2bb5b7),
headerPadding: EdgeInsets.zero,
formatButtonVisible: false,
centerHeaderTitle: true,
centerHeaderTitle: false,
titleTextBuilder: (dateTime, _) {
return dateTime.year.toString() +
"年-" +
... ... @@ -183,7 +183,7 @@ class DialogUtil {
},
titleTextStyle: TextStyle(
color: MyColours.color_ffffff,
fontSize: ScreenUtil().setSp(32)),
fontSize: ScreenUtil().setSp(30)),
leftChevronIcon:
const Icon(Icons.chevron_left, color: Colors.white),
rightChevronIcon:
... ...
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';
Future<bool> checkContactPermission() async {
PermissionStatus permissionStatus =
await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
if (permissionStatus == PermissionStatus.granted) {
return true;
} else {
return false;
}
}
Future<bool> requestContactPermission() async {
final permissions =
await PermissionHandler().requestPermissions([PermissionGroup.contacts]);
if (permissions[PermissionGroup.contacts] == PermissionStatus.granted) {
return true;
} else {
return false;
}
}
Future<bool> openSetting() {
return PermissionHandler().openAppSettings();
}
... ...
... ... @@ -58,4 +58,9 @@ class NavigatorUtil {
static void goSmsPage(BuildContext context,String rid) {
_navigateTo(context,"${Routes.sms}?rid=$rid");
}
/// 浏览器
static void goWebviewPage(BuildContext context) {
_navigateTo(context,"${Routes.webview}");
}
}
... ...
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';
... ... @@ -7,8 +10,10 @@ import 'package:fluttertoast/fluttertoast.dart';
import 'package:flutter/services.dart';
import 'package:fluwx/fluwx.dart';
import 'package:one_key/utils/log_util.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:package_info/package_info.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:webview_flutter/webview_flutter.dart';
class Utils {
static void showToast(String msg) {
... ... @@ -78,13 +83,8 @@ class Utils {
}
//跳转拨打电话页面
static goHelp() async {
String url="https://support.qq.com/product/152856";
if(await canLaunch(url)){
await launch(url);
}else{
LogUtil.e("Could not launch $url");
}
static goHelp(BuildContext context) async {
NavigatorUtil.goWebviewPage(context);
}
//获取应用版本昊
... ... @@ -94,6 +94,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),
... ...
... ... @@ -63,7 +63,7 @@ packages:
name: build_daemon
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.3"
version: "2.1.4"
build_resolvers:
dependency: transitive
description:
... ... @@ -98,14 +98,14 @@ packages:
name: built_value
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.9"
version: "7.1.0"
cached_network_image:
dependency: "direct main"
description:
name: cached_network_image
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.0"
version: "2.2.0+1"
charcode:
dependency: transitive
description:
... ... @@ -120,13 +120,20 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.2"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
code_builder:
dependency: transitive
description:
name: code_builder
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.2.1"
version: "3.4.1"
collection:
dependency: transitive
description:
... ... @@ -140,21 +147,35 @@ packages:
name: connectivity
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.8+2"
version: "0.4.9+2"
connectivity_for_web:
dependency: transitive
description:
name: connectivity_for_web
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.1+2"
connectivity_macos:
dependency: transitive
description:
name: connectivity_macos
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.0+2"
version: "0.1.0+4"
connectivity_platform_interface:
dependency: transitive
description:
name: connectivity_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
version: "1.0.6"
contacts_service:
dependency: "direct main"
description:
name: contacts_service
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.6"
convert:
dependency: transitive
description:
... ... @@ -182,7 +203,7 @@ packages:
name: csslib
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.16.1"
version: "0.16.2"
cupertino_icons:
dependency: "direct main"
description:
... ... @@ -197,6 +218,20 @@ 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+7"
device_info_platform_interface:
dependency: transitive
description:
name: device_info_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
dio:
dependency: "direct main"
description:
... ... @@ -210,14 +245,21 @@ packages:
name: extended_image
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.1"
version: "0.7.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.2.0"
version: "0.2.3"
file:
dependency: transitive
description:
name: file
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.2.1"
fixnum:
dependency: transitive
description:
... ... @@ -231,7 +273,7 @@ packages:
name: fluro
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.6.1"
version: "1.6.3"
flutter:
dependency: "direct main"
description: flutter
... ... @@ -250,28 +292,28 @@ packages:
name: flutter_cache_manager
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.3"
version: "1.4.1"
flutter_easyrefresh:
dependency: "direct main"
description:
name: flutter_easyrefresh
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
version: "2.1.5"
flutter_picker:
dependency: "direct main"
description:
name: flutter_picker
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.3"
version: "1.1.5"
flutter_screenutil:
dependency: "direct main"
description:
name: flutter_screenutil
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.2"
version: "1.1.0"
flutter_statusbarcolor:
dependency: "direct main"
description:
... ... @@ -302,7 +344,7 @@ packages:
name: fluwx
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.9"
version: "2.3.0"
front_end:
dependency: transitive
description:
... ... @@ -344,7 +386,7 @@ packages:
name: http
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.12.0+4"
version: "0.12.2"
http_client_helper:
dependency: transitive
description:
... ... @@ -365,7 +407,7 @@ packages:
name: http_parser
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.1.3"
version: "3.1.4"
image:
dependency: transitive
description:
... ... @@ -393,7 +435,7 @@ packages:
name: io
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.3"
version: "0.3.4"
jpush_flutter:
dependency: "direct main"
description:
... ... @@ -407,7 +449,7 @@ packages:
name: js
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.6.1+1"
version: "0.6.2"
json_annotation:
dependency: "direct main"
description:
... ... @@ -463,7 +505,7 @@ packages:
name: mime
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.6+3"
version: "0.9.7"
nested:
dependency: transitive
description:
... ... @@ -477,28 +519,28 @@ packages:
name: node_interop
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
version: "1.1.1"
node_io:
dependency: transitive
description:
name: node_io
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1+2"
version: "1.1.1"
package_config:
dependency: transitive
description:
name: package_config
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.9.2"
version: "1.9.3"
package_info:
dependency: "direct main"
description:
name: package_info
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.0+18"
version: "0.4.3"
package_resolver:
dependency: transitive
description:
... ... @@ -519,21 +561,28 @@ packages:
name: path_provider
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.6.5"
version: "1.6.14"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.1+2"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.4"
version: "0.0.4+3"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
version: "1.0.3"
pedantic:
dependency: transitive
description:
... ... @@ -547,7 +596,7 @@ packages:
name: permission_handler
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.4.0"
version: "4.4.0+hotfix.4"
permission_handler_platform_interface:
dependency: transitive
description:
... ... @@ -569,6 +618,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
platform_detect:
dependency: transitive
description:
name: platform_detect
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.0"
plugin_platform_interface:
dependency: transitive
description:
... ... @@ -583,13 +639,20 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.4.0"
process:
dependency: transitive
description:
name: process
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.13"
provider:
dependency: "direct main"
description:
name: provider
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.0.4"
version: "4.0.5+1"
pub_semver:
dependency: transitive
description:
... ... @@ -611,41 +674,55 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.5"
rxdart:
dependency: transitive
description:
name: rxdart
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.24.1"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.5.6+3"
version: "0.5.10"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.2+2"
shared_preferences_macos:
dependency: transitive
description:
name: shared_preferences_macos
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.1+6"
version: "0.0.1+10"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.3"
version: "1.0.4"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.2+4"
version: "0.1.2+7"
shelf:
dependency: transitive
description:
name: shelf
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.7.5"
version: "0.7.9"
shelf_web_socket:
dependency: transitive
description:
... ... @@ -685,7 +762,14 @@ packages:
name: sqflite
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.2.2+1"
version: "1.3.1+1"
sqflite_common:
dependency: transitive
description:
name: sqflite_common
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.2+1"
stack_trace:
dependency: transitive
description:
... ... @@ -762,35 +846,42 @@ packages:
name: url_launcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.4.2"
version: "5.5.2"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.1+1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.0.1+4"
version: "0.0.1+7"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.6"
version: "1.0.8"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.1+1"
version: "0.1.3+1"
uuid:
dependency: transitive
description:
name: uuid
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.4"
version: "2.2.2"
vector_math:
dependency: transitive
description:
... ... @@ -804,7 +895,7 @@ packages:
name: watcher
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.9.7+14"
version: "0.9.7+15"
web_socket_channel:
dependency: "direct main"
description:
... ... @@ -812,6 +903,20 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
webview_flutter:
dependency: "direct main"
description:
name: webview_flutter
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.22+1"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.0"
xml:
dependency: transitive
description:
... ... @@ -825,7 +930,7 @@ packages:
name: yaml
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
version: "2.2.1"
sdks:
dart: ">=2.7.0 <3.0.0"
flutter: ">=1.12.13+hotfix.5 <1.16.0"
flutter: ">=1.12.13+hotfix.5 <2.0.0"
... ...
... ... @@ -64,7 +64,7 @@ dependencies:
# 日历
table_calendar: ^2.2.1
# 微信SDK
fluwx: ^2.0.9
fluwx: ^2.1.0
#网页,短信,电话
url_launcher: ^5.4.2
# 滚轮选择器
... ... @@ -77,12 +77,20 @@ dependencies:
install_plugin: ^2.0.1
# 获取应用版本信息
package_info: ^0.4.0+18
# 获取设备信息
device_info: ^0.4.2+4
# webview
webview_flutter: ^0.3.22+1
# 获取通讯录
contacts_service: ^0.4.6
dev_dependencies:
flutter_test:
sdk: flutter
json_model: ^0.0.2
build_runner: ^1.0.0
json_serializable: ^2.0.0
... ...