mirror of
https://github.com/asjqkkkk/flutter-todos.git
synced 2025-08-26 14:06:29 +08:00
更新功能完成啦!
This commit is contained in:
@ -1,5 +1,4 @@
|
|||||||
import 'package:todo_list/json/all_beans.dart';
|
import 'package:todo_list/json/all_beans.dart';
|
||||||
import 'package:todo_list/json/weather_bean.dart';
|
|
||||||
|
|
||||||
import 'api_strategy.dart';
|
import 'api_strategy.dart';
|
||||||
export 'package:dio/dio.dart';
|
export 'package:dio/dio.dart';
|
||||||
@ -88,7 +87,8 @@ class ApiService {
|
|||||||
"https://free-api.heweather.com/s6/weather/now",
|
"https://free-api.heweather.com/s6/weather/now",
|
||||||
(data) {
|
(data) {
|
||||||
WeatherBean weatherBean = WeatherBean.fromMap(data);
|
WeatherBean weatherBean = WeatherBean.fromMap(data);
|
||||||
if (weatherBean.HeWeather6[weatherBean.HeWeather6.length - 1].status == "ok") {
|
if (weatherBean.HeWeather6[weatherBean.HeWeather6.length - 1].status ==
|
||||||
|
"ok") {
|
||||||
success(weatherBean);
|
success(weatherBean);
|
||||||
} else {
|
} else {
|
||||||
failed(weatherBean);
|
failed(weatherBean);
|
||||||
@ -101,4 +101,25 @@ class ApiService {
|
|||||||
token: token,
|
token: token,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//检查更新
|
||||||
|
void checkUpdate(
|
||||||
|
Function success,
|
||||||
|
Function error,
|
||||||
|
Map<String, String> params,
|
||||||
|
CancelToken token,
|
||||||
|
) {
|
||||||
|
ApiStrategy.getInstance().post(
|
||||||
|
"app/checkUpdate",
|
||||||
|
(data) {
|
||||||
|
UpdateInfoBean updateInfoBean = UpdateInfoBean.fromMap(data);
|
||||||
|
success(updateInfoBean);
|
||||||
|
},
|
||||||
|
params: params,
|
||||||
|
errorCallBack: (errorMessage) {
|
||||||
|
error(errorMessage);
|
||||||
|
},
|
||||||
|
token: token,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,6 +173,7 @@ class DemoLocalizations {
|
|||||||
}
|
}
|
||||||
String get update => Intl.message('update', name: 'update', desc: '升级',);
|
String get update => Intl.message('update', name: 'update', desc: '升级',);
|
||||||
String get newVersionIsComing => Intl.message('New version is comming!', name: 'newVersionIsComing', desc: '新版本来啦!',);
|
String get newVersionIsComing => Intl.message('New version is comming!', name: 'newVersionIsComing', desc: '新版本来啦!',);
|
||||||
|
String get noUpdate => Intl.message('It is the latest version', name: 'noUpdate', desc: '已是最新版本',);
|
||||||
|
|
||||||
|
|
||||||
String get welcomeWord{
|
String get welcomeWord{
|
||||||
|
@ -93,6 +93,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"navigatorSetting" : MessageLookupByLibrary.simpleMessage("Navigator Setting"),
|
"navigatorSetting" : MessageLookupByLibrary.simpleMessage("Navigator Setting"),
|
||||||
"netPicture" : MessageLookupByLibrary.simpleMessage("Network Picture"),
|
"netPicture" : MessageLookupByLibrary.simpleMessage("Network Picture"),
|
||||||
"newVersionIsComing" : MessageLookupByLibrary.simpleMessage("New version is comming!"),
|
"newVersionIsComing" : MessageLookupByLibrary.simpleMessage("New version is comming!"),
|
||||||
|
"noUpdate" : MessageLookupByLibrary.simpleMessage("It is the latest version"),
|
||||||
"ok" : MessageLookupByLibrary.simpleMessage("ok"),
|
"ok" : MessageLookupByLibrary.simpleMessage("ok"),
|
||||||
"openSystemSetting" : MessageLookupByLibrary.simpleMessage("Open System Setting"),
|
"openSystemSetting" : MessageLookupByLibrary.simpleMessage("Open System Setting"),
|
||||||
"pickAColor" : MessageLookupByLibrary.simpleMessage("Pick a color!"),
|
"pickAColor" : MessageLookupByLibrary.simpleMessage("Pick a color!"),
|
||||||
|
@ -93,6 +93,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"navigatorSetting" : MessageLookupByLibrary.simpleMessage("导航栏设置"),
|
"navigatorSetting" : MessageLookupByLibrary.simpleMessage("导航栏设置"),
|
||||||
"netPicture" : MessageLookupByLibrary.simpleMessage("网络图片"),
|
"netPicture" : MessageLookupByLibrary.simpleMessage("网络图片"),
|
||||||
"newVersionIsComing" : MessageLookupByLibrary.simpleMessage("新版本来啦!"),
|
"newVersionIsComing" : MessageLookupByLibrary.simpleMessage("新版本来啦!"),
|
||||||
|
"noUpdate" : MessageLookupByLibrary.simpleMessage("已是最新版本"),
|
||||||
"ok" : MessageLookupByLibrary.simpleMessage("确定"),
|
"ok" : MessageLookupByLibrary.simpleMessage("确定"),
|
||||||
"openSystemSetting" : MessageLookupByLibrary.simpleMessage("打开系统设置"),
|
"openSystemSetting" : MessageLookupByLibrary.simpleMessage("打开系统设置"),
|
||||||
"pickAColor" : MessageLookupByLibrary.simpleMessage("选择一个颜色吧!"),
|
"pickAColor" : MessageLookupByLibrary.simpleMessage("选择一个颜色吧!"),
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
export 'common_bean.dart';
|
export 'common_bean.dart';
|
||||||
export 'photo_bean.dart';
|
export 'photo_bean.dart';
|
||||||
|
export 'update_info_bean.dart';
|
||||||
|
export 'weather_bean.dart';
|
55
lib/json/update_info_bean.dart
Normal file
55
lib/json/update_info_bean.dart
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
class UpdateInfoBean {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* appVersion : "1.0.0"
|
||||||
|
* appName : "无"
|
||||||
|
* updateInfo : "无"
|
||||||
|
* downloadUrl : "无"
|
||||||
|
* appId : "001"
|
||||||
|
*/
|
||||||
|
|
||||||
|
String appVersion;
|
||||||
|
String appName;
|
||||||
|
String updateInfo;
|
||||||
|
String downloadUrl;
|
||||||
|
String appId;
|
||||||
|
|
||||||
|
static UpdateInfoBean fromMap(Map<String, dynamic> map) {
|
||||||
|
UpdateInfoBean update_info_bean = new UpdateInfoBean();
|
||||||
|
update_info_bean.appVersion = map['appVersion'];
|
||||||
|
update_info_bean.appName = map['appName'];
|
||||||
|
update_info_bean.updateInfo = map['updateInfo'];
|
||||||
|
update_info_bean.downloadUrl = map['downloadUrl'];
|
||||||
|
update_info_bean.appId = map['appId'];
|
||||||
|
return update_info_bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<UpdateInfoBean> fromMapList(dynamic mapList) {
|
||||||
|
List<UpdateInfoBean> list = new List(mapList.length);
|
||||||
|
for (int i = 0; i < mapList.length; i++) {
|
||||||
|
list[i] = fromMap(mapList[i]);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool needUpdate(String oldVersion, String newVersion){
|
||||||
|
final oldList = oldVersion.split(".");
|
||||||
|
final newList = newVersion.split(".");
|
||||||
|
|
||||||
|
bool needUpdate = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < oldList.length; i++) {
|
||||||
|
String oldNumString = oldList[i];
|
||||||
|
String newNumString = newList[i];
|
||||||
|
int oldNum = int.parse(oldNumString);
|
||||||
|
int newNum = int.parse(newNumString);
|
||||||
|
if(newNum > oldNum){
|
||||||
|
needUpdate = true;
|
||||||
|
return needUpdate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return needUpdate;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,13 +1,18 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:dio/dio.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:todo_list/config/api_service.dart';
|
||||||
import 'package:todo_list/i10n/localization_intl.dart';
|
import 'package:todo_list/i10n/localization_intl.dart';
|
||||||
import 'package:package_info/package_info.dart';
|
import 'package:package_info/package_info.dart';
|
||||||
|
import 'package:todo_list/json/update_info_bean.dart';
|
||||||
import 'package:todo_list/model/global_model.dart';
|
import 'package:todo_list/model/global_model.dart';
|
||||||
import 'package:todo_list/pages/webview_page.dart';
|
import 'package:todo_list/pages/webview_page.dart';
|
||||||
|
import 'package:todo_list/widgets/loading_widget.dart';
|
||||||
|
import 'package:todo_list/widgets/net_loading_widget.dart';
|
||||||
import 'package:todo_list/widgets/update_dialog.dart';
|
import 'package:todo_list/widgets/update_dialog.dart';
|
||||||
|
|
||||||
class AboutPage extends StatefulWidget {
|
class AboutPage extends StatefulWidget {
|
||||||
@ -65,7 +70,10 @@ class _AboutPageState extends State<AboutPage> {
|
|||||||
width: 70,
|
width: 70,
|
||||||
height: 70,
|
height: 70,
|
||||||
margin: EdgeInsets.all(10),
|
margin: EdgeInsets.all(10),
|
||||||
child: Image.asset("images/icon_1.png",fit: BoxFit.contain,))),
|
child: Image.asset(
|
||||||
|
"images/icon_1.png",
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
))),
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
margin: EdgeInsets.only(left: 50, top: 2),
|
margin: EdgeInsets.only(left: 50, top: 2),
|
||||||
@ -112,15 +120,16 @@ class _AboutPageState extends State<AboutPage> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Platform.isAndroid ? Container(
|
Platform.isAndroid
|
||||||
child: IconButton(icon: Icon(Icons.cloud_upload,), onPressed: (){
|
? Container(
|
||||||
showDialog(context: context, builder: (ctx){
|
child: IconButton(
|
||||||
return UpdateDialog(
|
icon: Icon(
|
||||||
|
Icons.cloud_upload,
|
||||||
);
|
),
|
||||||
});
|
onPressed: () => checkUpdate(globalModel),
|
||||||
}),
|
),
|
||||||
) : SizedBox(),
|
)
|
||||||
|
: SizedBox(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
@ -210,4 +219,51 @@ class _AboutPageState extends State<AboutPage> {
|
|||||||
}
|
}
|
||||||
return Text(data);
|
return Text(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void checkUpdate(GlobalModel globalModel) {
|
||||||
|
final loadingController = globalModel.loadingController;
|
||||||
|
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (ctx) {
|
||||||
|
CancelToken cancelToken = CancelToken();
|
||||||
|
return NetLoadingWidget(
|
||||||
|
loadingController: loadingController,
|
||||||
|
successText: DemoLocalizations.of(context).noUpdate,
|
||||||
|
onSuccess: (){
|
||||||
|
Navigator.pop(context);
|
||||||
|
},
|
||||||
|
onRequest: () {
|
||||||
|
ApiService.instance.checkUpdate(
|
||||||
|
(UpdateInfoBean updateInfo) async{
|
||||||
|
final packageInfo = await PackageInfo.fromPlatform();
|
||||||
|
bool needUpdate = UpdateInfoBean.needUpdate(packageInfo.version, updateInfo.appVersion);
|
||||||
|
if(!needUpdate){
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
showDialog(context: context, builder: (ctx2){
|
||||||
|
return UpdateDialog(
|
||||||
|
version: updateInfo.appVersion,
|
||||||
|
updateUrl: updateInfo.downloadUrl,
|
||||||
|
updateInfo: updateInfo.updateInfo,
|
||||||
|
updateInfoColor: globalModel.logic.getWhiteInDark(),
|
||||||
|
backgroundColor: globalModel.logic.getPrimaryGreyInDark(context),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
loadingController.setFlag(LoadingFlag.success);
|
||||||
|
},
|
||||||
|
(msg) {
|
||||||
|
loadingController.setFlag(LoadingFlag.error);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"language": globalModel.currentLocale.languageCode,
|
||||||
|
"appId": "001"
|
||||||
|
},
|
||||||
|
cancelToken,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
cancelToken: cancelToken,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ class _NetLoadingWidgetState extends State<NetLoadingWidget> {
|
|||||||
Column(
|
Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(
|
Text(
|
||||||
widget.successText,
|
widget.successText ?? "",
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: TextStyle(fontSize: 30),
|
style: TextStyle(fontSize: 30),
|
||||||
),
|
),
|
||||||
|
@ -15,12 +15,13 @@ class UpdateDialog extends StatefulWidget {
|
|||||||
final String updateUrl;
|
final String updateUrl;
|
||||||
final bool isForce;
|
final bool isForce;
|
||||||
final Color backgroundColor;
|
final Color backgroundColor;
|
||||||
|
final Color updateInfoColor;
|
||||||
|
|
||||||
UpdateDialog({
|
UpdateDialog({
|
||||||
this.version = "1.0.0",
|
this.version = "1.0.0",
|
||||||
this.updateInfo = "",
|
this.updateInfo = "",
|
||||||
this.updateUrl = "",
|
this.updateUrl = "",
|
||||||
this.isForce = false, this.backgroundColor,
|
this.isForce = false, this.backgroundColor, this.updateInfoColor,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -33,7 +34,7 @@ class UpdateDialogState extends State<UpdateDialog> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final bgColor = Theme
|
final bgColor = widget.backgroundColor ?? Theme
|
||||||
.of(context)
|
.of(context)
|
||||||
.primaryColor;
|
.primaryColor;
|
||||||
final size = MediaQuery
|
final size = MediaQuery
|
||||||
@ -65,7 +66,7 @@ class UpdateDialogState extends State<UpdateDialog> {
|
|||||||
DemoLocalizations
|
DemoLocalizations
|
||||||
.of(context)
|
.of(context)
|
||||||
.newVersionIsComing,
|
.newVersionIsComing,
|
||||||
style: TextStyle(color: Colors.white, fontSize: 20),
|
style: TextStyle(color:widget.updateInfoColor ?? Colors.white, fontSize: 20),
|
||||||
),
|
),
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
)),
|
)),
|
||||||
@ -81,7 +82,7 @@ class UpdateDialogState extends State<UpdateDialog> {
|
|||||||
scrollDirection: Axis.vertical,
|
scrollDirection: Axis.vertical,
|
||||||
child: Text(
|
child: Text(
|
||||||
widget.updateInfo ?? "",
|
widget.updateInfo ?? "",
|
||||||
style: TextStyle(color: Colors.white),
|
style: TextStyle(color: widget.updateInfoColor ?? Colors.white),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
))),
|
))),
|
||||||
|
@ -440,6 +440,12 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
|
"noUpdate": "It is the latest version",
|
||||||
|
"@noUpdate": {
|
||||||
|
"description": "已是最新版本",
|
||||||
|
"type": "text",
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
"writeAtLeastOneTaskItem": "Please write at least one task.",
|
"writeAtLeastOneTaskItem": "Please write at least one task.",
|
||||||
"@writeAtLeastOneTaskItem": {
|
"@writeAtLeastOneTaskItem": {
|
||||||
"description": "请至少写下一项任务哦",
|
"description": "请至少写下一项任务哦",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2019-07-26T18:12:05.019730",
|
"@@last_modified": "2019-07-27T09:39:19.620685",
|
||||||
"appName": "One Day List",
|
"appName": "One Day List",
|
||||||
"@appName": {
|
"@appName": {
|
||||||
"description": "app的名字",
|
"description": "app的名字",
|
||||||
@ -446,6 +446,12 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
|
"noUpdate": "It is the latest version",
|
||||||
|
"@noUpdate": {
|
||||||
|
"description": "已是最新版本",
|
||||||
|
"type": "text",
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
"welcomeWord": "Hello! ",
|
"welcomeWord": "Hello! ",
|
||||||
"@welcomeWord": {
|
"@welcomeWord": {
|
||||||
"description": "主页的欢迎词",
|
"description": "主页的欢迎词",
|
||||||
|
@ -422,6 +422,12 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
|
"noUpdate": "已是最新版本",
|
||||||
|
"@noUpdate": {
|
||||||
|
"description": "已是最新版本",
|
||||||
|
"type": "text",
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
"bgChangeWithCard": "背景跟随任务图标颜色",
|
"bgChangeWithCard": "背景跟随任务图标颜色",
|
||||||
"@bgChangeWithCard": {
|
"@bgChangeWithCard": {
|
||||||
"description": "背景跟随任务图标颜色",
|
"description": "背景跟随任务图标颜色",
|
||||||
|
50
test/check_update_test.dart
Normal file
50
test/check_update_test.dart
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
|
||||||
|
void main(){
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool needUpdate(String oldVersion, String newVersion){
|
||||||
|
final oldList = oldVersion.split(".");
|
||||||
|
final newList = newVersion.split(".");
|
||||||
|
|
||||||
|
bool needUpdate = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < oldList.length; i++) {
|
||||||
|
String oldNumString = oldList[i];
|
||||||
|
String newNumString = newList[i];
|
||||||
|
int oldNum = int.parse(oldNumString);
|
||||||
|
int newNum = int.parse(newNumString);
|
||||||
|
if(newNum > oldNum){
|
||||||
|
needUpdate = true;
|
||||||
|
return needUpdate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return needUpdate;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
test("测试版本号对比", (){
|
||||||
|
|
||||||
|
bool update1 = needUpdate("1.0.0", "1.0.0");
|
||||||
|
bool update2 = needUpdate("1.0.0", "1.0.1");
|
||||||
|
bool update3 = needUpdate("1.0.2", "1.0.1");
|
||||||
|
bool update4 = needUpdate("1.0.0", "1.1.0");
|
||||||
|
bool update5 = needUpdate("1.0.0", "2.0.0");
|
||||||
|
bool update6 = needUpdate("1.0.0", "1.0.11");
|
||||||
|
bool update7 = needUpdate("1.0.0", "1.11.0");
|
||||||
|
|
||||||
|
|
||||||
|
expect(update1, false);
|
||||||
|
expect(update2, true);
|
||||||
|
expect(update3, false);
|
||||||
|
expect(update4, true);
|
||||||
|
expect(update5, true);
|
||||||
|
expect(update6, true);
|
||||||
|
expect(update7, true);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
Reference in New Issue
Block a user