hyzp_ybqx-Commit001:代码刚转换好,编译通过
This commit is contained in:
@@ -0,0 +1,368 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
//import 'messages_data.dart';
|
||||
import '../../../components/doJSON.dart';
|
||||
import '../../../components/hyxx_data_handle.dart';
|
||||
|
||||
class listMessagesData {
|
||||
List listMessages = [];
|
||||
int listIndex = 0;
|
||||
}
|
||||
|
||||
class MessagesView extends StatefulWidget {
|
||||
//MessagesView({Key key, this.title, this.mapData}) : super(key: key);
|
||||
MessagesView({
|
||||
@required this.title,
|
||||
this.listIndex,
|
||||
Key key,
|
||||
}) : super(key: key);
|
||||
String title;
|
||||
int listIndex = 0;
|
||||
List listMessages;
|
||||
Map<String, listMessagesData> mapListMessagesData;
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<MessagesView> {
|
||||
@override
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
setInit();
|
||||
}
|
||||
|
||||
String strContent = '';
|
||||
|
||||
setInit() async {
|
||||
widget.mapListMessagesData = Map();
|
||||
widget.mapListMessagesData['收到的消息'] = listMessagesData();
|
||||
widget.mapListMessagesData['发送的消息'] = listMessagesData();
|
||||
|
||||
widget.mapListMessagesData['收到的消息'].listMessages = listMessagesInbox2;
|
||||
widget.mapListMessagesData['发送的消息'].listMessages = listMessagesOutbox2;
|
||||
selectValue = widget.title;
|
||||
switch (selectValue) {
|
||||
case '收到的消息':
|
||||
//第一次调用时widget.listIndex是由外面传入的,不能覆盖widget.listIndex,
|
||||
// 所以单独抽离出一个不会覆盖widget.listIndex的函数
|
||||
onRadioBtnInboxSet();
|
||||
break;
|
||||
case '发送的消息':
|
||||
onRadioBtnOutboxSet();
|
||||
break;
|
||||
}
|
||||
widget.listMessages = widget.mapListMessagesData[selectValue].listMessages;
|
||||
getContent();
|
||||
}
|
||||
|
||||
getPreBtn_NextBtn() {
|
||||
preBtn = getBtnSizeX(
|
||||
text: "上一条",
|
||||
onPressedFun: null,
|
||||
);
|
||||
nextBtn = getBtnSizeX(
|
||||
text: "下一条",
|
||||
onPressedFun: null,
|
||||
);
|
||||
|
||||
if (widget.listIndex > 0 && widget.listMessages.length > 0) {
|
||||
preBtn = getBtnSizeX(
|
||||
text: "上一条",
|
||||
onPressedFun: () async {
|
||||
if (widget.listIndex > 0) {
|
||||
widget.listIndex--;
|
||||
getContent();
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
if (widget.listIndex < (widget.listMessages.length - 1) && widget.listMessages.length > 0) {
|
||||
nextBtn = getBtnSizeX(
|
||||
text: "下一条",
|
||||
onPressedFun: () async {
|
||||
if (widget.listIndex < widget.listMessages.length - 1) {
|
||||
widget.listIndex++;
|
||||
getContent();
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
getContent() async {
|
||||
if (widget.listMessages.isEmpty) {
|
||||
strContent = '';
|
||||
widget.mapListMessagesData[selectValue].listIndex = widget.listIndex = 0;
|
||||
} else {
|
||||
widget.mapListMessagesData[selectValue].listIndex = widget.listIndex;
|
||||
strContent = "第 ${widget.listIndex + 1} 条(共 ${widget.listMessages.length} 条)" +
|
||||
"\n" +
|
||||
"时间:" +
|
||||
widget.listMessages[widget.listIndex]['date'] +
|
||||
", " +
|
||||
widget.listMessages[widget.listIndex]['time'] +
|
||||
"\n\n" +
|
||||
"内容:" +
|
||||
widget.listMessages[widget.listIndex]['content'];
|
||||
}
|
||||
getPreBtn_NextBtn();
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
var selectValue;
|
||||
|
||||
//解决第一次进入报错问题。因为getPreBtn_NextBtn()还未执行,preBtn和nextBtn为空
|
||||
Widget preBtn = Container(
|
||||
color: Colors.white12, //onPressedFun为null时无效
|
||||
width: 70.0,
|
||||
height: 35.0,
|
||||
child: RaisedButton(
|
||||
padding: EdgeInsets.all(0),
|
||||
textColor: Colors.black,
|
||||
child: Text('上一条'),
|
||||
onPressed: null,
|
||||
),
|
||||
);
|
||||
|
||||
Widget nextBtn = Container(
|
||||
color: Colors.white12, //onPressedFun为null时无效
|
||||
width: 70.0,
|
||||
height: 35.0,
|
||||
child: RaisedButton(
|
||||
padding: EdgeInsets.all(0),
|
||||
textColor: Colors.black,
|
||||
child: Text('下一条'),
|
||||
onPressed: null,
|
||||
),
|
||||
);
|
||||
|
||||
Widget getBtnSizeColor(
|
||||
{@required title,
|
||||
width = 70.0,
|
||||
height = 35.0,
|
||||
//colorBK = Colors.white12,
|
||||
txtColor = Colors.black,
|
||||
fontSize = 16.0,
|
||||
bottomBorder = false,
|
||||
onPressedFun}) {
|
||||
return Container(
|
||||
//Failed assertion: line 285 pos 15: 'color == null || decoration == null':
|
||||
// Cannot provide both a color and a decoration
|
||||
//color: colorBK, //onPressedFun为null时无效
|
||||
width: width,
|
||||
height: height,
|
||||
decoration: BoxDecoration(
|
||||
border: bottomBorder ? Border(bottom: BorderSide(width: 1, color: Colors.blue)) : null,
|
||||
),
|
||||
child: FlatButton(
|
||||
padding: EdgeInsets.all(0),
|
||||
textColor: txtColor,
|
||||
child: Text(title, style: TextStyle(fontSize: fontSize)),
|
||||
onPressed: onPressedFun,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget radioBtnInbox;
|
||||
Widget radioBtnOutbox;
|
||||
|
||||
//第一次调用时widget.listIndex是由外面传入的,不能覆盖widget.listIndex,
|
||||
// 所以单独抽离出一个不会覆盖widget.listIndex的函数
|
||||
onRadioBtnInboxSet() {
|
||||
radioBtnInbox = getBtnSizeColor(
|
||||
title: '收到的消息',
|
||||
width: 100.0,
|
||||
onPressedFun: onRadioBtnInbox,
|
||||
//colorBK: Colors.white,
|
||||
txtColor: Colors.blue,
|
||||
bottomBorder: true);
|
||||
radioBtnOutbox = getBtnSizeColor(
|
||||
title: '发送的消息', width: 100.0, onPressedFun: onRadioBtnOutbox, txtColor: Colors.black38);
|
||||
}
|
||||
|
||||
onRadioBtnInbox() {
|
||||
setState(() {
|
||||
selectValue = '收到的消息';
|
||||
onRadioBtnInboxSet();
|
||||
widget.listMessages = widget.mapListMessagesData[selectValue].listMessages;
|
||||
widget.listIndex = widget.mapListMessagesData[selectValue].listIndex;
|
||||
getContent();
|
||||
});
|
||||
}
|
||||
|
||||
onRadioBtnOutboxSet() {
|
||||
radioBtnInbox = getBtnSizeColor(
|
||||
title: '收到的消息', width: 100.0, onPressedFun: onRadioBtnInbox, txtColor: Colors.black38);
|
||||
radioBtnOutbox = getBtnSizeColor(
|
||||
title: '发送的消息',
|
||||
width: 100.0,
|
||||
onPressedFun: onRadioBtnOutbox,
|
||||
//colorBK: Colors.white,
|
||||
txtColor: Colors.blue,
|
||||
bottomBorder: true);
|
||||
}
|
||||
|
||||
onRadioBtnOutbox() {
|
||||
setState(() {
|
||||
selectValue = '发送的消息';
|
||||
onRadioBtnOutboxSet();
|
||||
widget.listMessages = widget.mapListMessagesData[selectValue].listMessages;
|
||||
widget.listIndex = widget.mapListMessagesData[selectValue].listIndex;
|
||||
getContent();
|
||||
});
|
||||
}
|
||||
|
||||
Future<bool> alertDialog(String title, String content, var onPresse) async {
|
||||
return await showDialog(
|
||||
barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return AlertDialog(
|
||||
title: Text(title),
|
||||
content: Text(content),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
child: Text("确定"),
|
||||
onPressed: onPresse,
|
||||
),
|
||||
FlatButton(
|
||||
child: Text("取消"),
|
||||
onPressed: () {
|
||||
Navigator.pop(context, false);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Size mediaSize = MediaQuery.of(context).size;
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
onPressed: () {
|
||||
//SystemNavigator.pop(); //退出App
|
||||
Navigator.pop(context); //返回
|
||||
},
|
||||
),
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
title: Center(
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly, // 主轴元素的排序方式(水平布局中,X轴是主轴)
|
||||
crossAxisAlignment: CrossAxisAlignment.end, // 次轴元素的排序方式
|
||||
children: <Widget>[
|
||||
radioBtnInbox,
|
||||
radioBtnOutbox,
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: Icon(Icons.close),
|
||||
onPressed: () async {
|
||||
Navigator.pop(context); //关闭弹框,播放输入视频地址
|
||||
},
|
||||
),
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
],
|
||||
),
|
||||
body: Container(
|
||||
alignment: Alignment(0, 0),
|
||||
child: Container(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
|
||||
width: double.infinity,
|
||||
height: mediaSize.height * 0.75,
|
||||
child: SingleChildScrollView(
|
||||
child: Container(
|
||||
child: Text(strContent),
|
||||
),
|
||||
),
|
||||
),
|
||||
Divider(
|
||||
color: Colors.blue,
|
||||
),
|
||||
SizedBox(
|
||||
height: 6,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: <Widget>[
|
||||
getBtnSizeX(
|
||||
text: "复制",
|
||||
onPressedFun: () {
|
||||
// Flutter 复制文本到剪贴板
|
||||
Clipboard.setData(ClipboardData(
|
||||
text: ' ' +
|
||||
selectValue +
|
||||
'\n\n' +
|
||||
widget.listMessages[widget.listIndex]['content']));
|
||||
//showToast('帮助信息已复制到剪贴板', textAlign: TextAlign.left);
|
||||
Fluttertoast.showToast(msg: '帮助信息已复制到剪贴板', gravity: ToastGravity.CENTER);
|
||||
//Navigator.pop(context, ret);
|
||||
}),
|
||||
getBtnSizeX(
|
||||
text: "删除",
|
||||
onPressedFun: () async {
|
||||
//Navigator.pop(context); //关闭弹框,播放输入视频地址
|
||||
bool ret = await alertDialog('删除确认', '是否确定要删除当前项目?', () {
|
||||
if (0 == selectValue.compareTo('收到的消息')) {
|
||||
listMessagesInbox2.removeAt(widget.listIndex);
|
||||
widget.mapListMessagesData['收到的消息'].listMessages = listMessagesInbox2;
|
||||
writeJSON(json.encode(listMessagesInbox2), 'listMessagesInbox02.json');
|
||||
} else if (0 == selectValue.compareTo('发送的消息')) {
|
||||
listMessagesOutbox2.removeAt(widget.listIndex);
|
||||
widget.mapListMessagesData['发送的消息'].listMessages = listMessagesOutbox2;
|
||||
writeJSON(
|
||||
json.encode(listMessagesOutbox2), 'listMessagesOutbox02.json');
|
||||
}
|
||||
if (widget.listIndex > 0) {
|
||||
widget.listIndex--;
|
||||
}
|
||||
widget.listMessages =
|
||||
widget.mapListMessagesData[selectValue].listMessages;
|
||||
getContent();
|
||||
Navigator.pop(context);
|
||||
});
|
||||
}),
|
||||
preBtn,
|
||||
nextBtn,
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget getBtnSizeX({@required text, width = 70.0, height = 35.0, onPressedFun}) {
|
||||
return Container(
|
||||
color: Colors.white12, //onPressedFun为null时无效
|
||||
width: width,
|
||||
height: height,
|
||||
child: RaisedButton(
|
||||
padding: EdgeInsets.all(0),
|
||||
textColor: Colors.black,
|
||||
child: Text(text),
|
||||
onPressed: onPressedFun,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,229 @@
|
||||
List listMessagesOutbox = [
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
{
|
||||
"title": '工作汇报',
|
||||
"date": '20200325',
|
||||
"time": '09:19',
|
||||
"content": "已经处理了7个黑烟事件的初审和推送工作"
|
||||
},
|
||||
{
|
||||
"title": "数据统计",
|
||||
"date": '20200608',
|
||||
"time": '13:55',
|
||||
"content": "已经完成2020年4月份的黑烟事件数据统计工作",
|
||||
},
|
||||
];
|
||||
|
||||
List listMessagesInbox = [
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
{
|
||||
"title": '三千多人预约办事每天只放47个号 这县被国办通报!',
|
||||
"date": '20200311',
|
||||
"time": '10:23',
|
||||
"content": "2020年10月,按照国务院第七次大督查的统一部署,14个国务院督查组分赴14个省(区、市)"
|
||||
"和新疆生产建设兵团开展实地督查。督查发现,部分地方和部门仍存在违规设置行政审批环节,"
|
||||
"擅自构筑市场准入壁垒等问题,推进“一网通办”、“只进一扇门”、“最多跑一次”还有堵点障碍。",
|
||||
},
|
||||
{
|
||||
"title": "阿根廷举行马拉多纳遗体告别仪式:棺椁覆盖10号球衣",
|
||||
"date": '20200317',
|
||||
"time": '16:02',
|
||||
"content": "【马拉多纳遗体告别仪式:棺椁覆盖10号球衣】阿根廷传奇球星马拉多纳的告别仪式正在举行中,"
|
||||
"阿根廷TN电视台直播的画面显示,马拉多纳的棺材上覆盖着阿根廷国旗和10号球衣,"
|
||||
"球迷排队进入总统府玫瑰宫向这位传奇球星告别。(中国日报网)",
|
||||
},
|
||||
];
|
||||
@@ -0,0 +1,113 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'message_content.dart';
|
||||
//import 'messages_data.dart';
|
||||
import '../../../components/doJSON.dart';
|
||||
import '../../../components/hyxx_data_handle.dart';
|
||||
import '../../../components/customDialogG.dart';
|
||||
|
||||
class MessagesInbox extends StatefulWidget {
|
||||
MessagesInbox({Key key}) : super(key: key);
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<MessagesInbox> {
|
||||
Widget _getListTile(BuildContext context, index) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
ListTile(
|
||||
//leading: new Icon(Icons.phone),
|
||||
title: new Text(listMessagesInbox2[index]['date'], style: TextStyle(fontSize: 10)),
|
||||
subtitle: Text(listMessagesInbox2[index]['time'], style: TextStyle(fontSize: 10)),
|
||||
trailing: Container(
|
||||
width: 260,
|
||||
child: Text(
|
||||
listMessagesInbox2[index]['title'],
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
//textAlign: TextAlign.right,
|
||||
style: TextStyle(fontSize: 16),
|
||||
),
|
||||
),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
|
||||
enabled: true,
|
||||
onTap: () {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) => MessagesView(
|
||||
// title: '收到的消息', mapData: listMessagesInbox2[index])));
|
||||
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => MessagesView(title: '收到的消息', listIndex: index),
|
||||
),
|
||||
);
|
||||
|
||||
// Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// return MessagesOutbox(
|
||||
// title: "PeakPlayer帮助信息", mapData: listMessagesInbox2[index]);
|
||||
// }));
|
||||
},
|
||||
onLongPress: () async {
|
||||
bFlash = false;
|
||||
// Navigator.of(context).push(
|
||||
// MaterialPageRoute(
|
||||
// builder: (context) => customDialogG(
|
||||
// title: '收到的消息',
|
||||
// index: index),
|
||||
// ),
|
||||
// );
|
||||
Navigator.of(context).push(
|
||||
PageRouteBuilder(
|
||||
opaque: false,
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
customDialogG(title: '收到的消息', index: index),
|
||||
),
|
||||
// pageBuilder: (context, animation, secondaryAnimation) {
|
||||
// return Scaffold(
|
||||
// backgroundColor: Colors.transparent,
|
||||
// body: SafeArea(
|
||||
// child: Stack(
|
||||
// children: <Widget>[
|
||||
// Text('text'),
|
||||
// //...
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
).then((value) {
|
||||
print('Page2_Contacts bFlash = $bFlash');
|
||||
if (bFlash) {
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
},
|
||||
),
|
||||
Divider(
|
||||
height: 1.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
//Flutter Column套ListView不显示,可将ListView用Expanded包裹起来。
|
||||
child: ListView.builder(
|
||||
itemCount: listMessagesInbox2.length,
|
||||
itemBuilder: _getListTile,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'messages_inbox.dart';
|
||||
import 'messages_outbox.dart';
|
||||
|
||||
class MessagesManagePage extends StatefulWidget {
|
||||
MessagesManagePage({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_MessagesManagePageState createState() => _MessagesManagePageState();
|
||||
}
|
||||
|
||||
class _MessagesManagePageState extends State<MessagesManagePage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultTabController(
|
||||
length: 2,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('消息管理'),
|
||||
centerTitle: true,
|
||||
bottom: TabBar(
|
||||
labelColor: Colors.blueAccent,
|
||||
unselectedLabelColor: Colors.black26,
|
||||
tabs: <Widget>[Tab(text: "收件箱"), Tab(text: "已发送")],
|
||||
),
|
||||
),
|
||||
body: TabBarView(
|
||||
//flutter tabbar禁止手势滑动-OK
|
||||
physics: new NeverScrollableScrollPhysics(),
|
||||
children: <Widget>[
|
||||
MessagesInbox(),
|
||||
MessagesOutbox(),
|
||||
],
|
||||
),
|
||||
),
|
||||
// theme: ThemeData(
|
||||
// primarySwatch: Colors.yellow
|
||||
// ),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'message_content.dart';
|
||||
import '../../../components/hyxx_data_handle.dart';
|
||||
import '../../../components/customDialogG.dart';
|
||||
|
||||
class MessagesOutbox extends StatefulWidget {
|
||||
MessagesOutbox({Key key}) : super(key: key);
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<MessagesOutbox> {
|
||||
Widget _getListTile(BuildContext context, index) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
ListTile(
|
||||
//leading: new Icon(Icons.phone),
|
||||
title: new Text(listMessagesOutbox2[index]['date'],
|
||||
style: TextStyle(fontSize: 10)),
|
||||
subtitle: Text(listMessagesOutbox2[index]['time'],
|
||||
style: TextStyle(fontSize: 10)),
|
||||
trailing: Container(
|
||||
width: 260,
|
||||
child: Text(
|
||||
listMessagesOutbox2[index]['title'],
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
//textAlign: TextAlign.right,
|
||||
style: TextStyle(fontSize: 16),
|
||||
),
|
||||
),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
|
||||
enabled: true,
|
||||
onTap: () {
|
||||
// Navigator.of(context).push(MaterialPageRoute(
|
||||
// builder: (context) => MessagesView(
|
||||
// title: '发送的消息', mapData: listMessagesOutbox2[index])));
|
||||
|
||||
Navigator.of(context).push(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => MessagesView(
|
||||
title: '发送的消息',
|
||||
listIndex: index),
|
||||
),
|
||||
);
|
||||
|
||||
// Navigator.push(context, MaterialPageRoute(builder: (context) {
|
||||
// return MessagesOutbox(
|
||||
// title: "PeakPlayer帮助信息", mapData: listMessagesOutbox2[index]);
|
||||
// }));
|
||||
},
|
||||
onLongPress: () {
|
||||
bFlash = false;
|
||||
Navigator.of(context).push(
|
||||
PageRouteBuilder(
|
||||
opaque: false,
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
customDialogG(title: '发送的消息', index: index),
|
||||
),
|
||||
).then((value) {
|
||||
print('Page2_Contacts bFlash = $bFlash');
|
||||
if (bFlash) {
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
},
|
||||
),
|
||||
Divider(
|
||||
height: 1.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
//Flutter Column套ListView不显示,可将ListView用Expanded包裹起来。
|
||||
child: ListView.builder(
|
||||
itemCount: listMessagesOutbox2.length,
|
||||
itemBuilder: _getListTile,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,198 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../widget/JdButton.dart';
|
||||
import '../../../services/EventBus.dart';
|
||||
import '../01_messages/messages_manage.dart';
|
||||
import '../../../components/doJSON.dart';
|
||||
import '../../../components/hyxx_data_handle.dart';
|
||||
import 'dart:convert';
|
||||
import '../../../res/listContacts.dart';
|
||||
|
||||
class ContactAdd extends StatefulWidget {
|
||||
ContactAdd({@required this.contactIndex, Key key}) : super(key: key);
|
||||
int contactIndex;
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<ContactAdd> {
|
||||
//List<TextEditingController> listController;
|
||||
bool changed = false;
|
||||
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
getListFlields();
|
||||
}
|
||||
|
||||
getListFlields() {
|
||||
//在listContacts2末尾添加一条记录,这种方式会导致添加后,同时修改被拷贝的记录
|
||||
// listContacts2.add(listContacts2[widget.contactIndex]);
|
||||
// widget.contactIndex = listContacts2.length - 1;
|
||||
//
|
||||
// listController = List.generate(listContacts2[widget.contactIndex].length, (index) {
|
||||
// String key = listContacts2[widget.contactIndex].keys.elementAt(index);
|
||||
// listContacts2[widget.contactIndex][key] = ''; //清空内容
|
||||
// return TextEditingController();
|
||||
// });
|
||||
|
||||
//在listContacts2末尾添加一条记录
|
||||
//添加硬数据方式不好,若listContacts2的字段修改后,便可能导致问题
|
||||
// var item = {
|
||||
// "姓名": '张三',
|
||||
// "登录名称": 'ZhangSan',
|
||||
// "登录密码": '**********',
|
||||
// "部门": '办公室',
|
||||
// "职务": '主任',
|
||||
// "手机": '133xxxxxxxx',
|
||||
// "办公电话": '0831xxxxxxx',
|
||||
// "邮箱": '1234@qq.com',
|
||||
// "权限": '管理员',
|
||||
// "备注": '示例用户',
|
||||
// };
|
||||
// //map遍历
|
||||
// //usrMap.forEach((k,v) => print('${k}: ${v}'));
|
||||
// item.forEach((key, value) {
|
||||
// item[key] = ''; //清空内容
|
||||
// });
|
||||
|
||||
//在listContacts2末尾添加一条记录,动态生成item中的元素
|
||||
Map item = {};
|
||||
listContacts2[widget.contactIndex].forEach((key, value) {
|
||||
item[key] = ''; //为item添加元素
|
||||
});
|
||||
|
||||
listContacts2.add(item);
|
||||
widget.contactIndex = listContacts2.length - 1;
|
||||
|
||||
//setState(() {});
|
||||
}
|
||||
|
||||
//监听登录页面销毁的事件
|
||||
dispose() {
|
||||
super.dispose();
|
||||
if (changed) {
|
||||
print("writeJSON()");
|
||||
writeJSON(json.encode(listContacts2), 'listContacts02.json');
|
||||
} else {
|
||||
print("removeLast()");
|
||||
listContacts2.removeLast(); //删除添加的末尾元素
|
||||
}
|
||||
eventBus.fire(new UserEvent('登录成功...'));
|
||||
}
|
||||
|
||||
doLogin() async {
|
||||
Navigator.pop(context); //返回
|
||||
return;
|
||||
}
|
||||
|
||||
OnTap_messages_manage() {
|
||||
Navigator.of(context).push(MaterialPageRoute(builder: (context) => MessagesManagePage()));
|
||||
}
|
||||
|
||||
//自定义方法
|
||||
static onNullFun() {}
|
||||
|
||||
Widget getTrail(String key, int index, double widthTrail) {
|
||||
return Container(
|
||||
alignment: Alignment(1, 0),
|
||||
//widthTrail = 400报错,360刚能显示,300换行,260
|
||||
width: widthTrail,
|
||||
child: TextField(
|
||||
//textAlign: TextAlign.right,
|
||||
style: TextStyle(fontSize: 16),
|
||||
decoration: InputDecoration(
|
||||
hintText: '請輸入字段信息',
|
||||
//border: InputBorder.none, //TextField去掉下划线
|
||||
contentPadding: EdgeInsets.only(right: 0),
|
||||
),
|
||||
//controller: listController[index],
|
||||
//利用控制器初始化文本
|
||||
onChanged: (value) {
|
||||
listContacts2[widget.contactIndex][key] = value;
|
||||
bFlash = changed = true;
|
||||
print("ContactAdd bFlash = $bFlash");
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getListTile(String key, int index, double widthTrail,
|
||||
{onTapFun = onNullFun, onLongPressFun = onNullFun, size = 16.0}) {
|
||||
return ListTile(
|
||||
//leading: new Icon(Icons.phone),
|
||||
title: Text('${mapUserInfoText[key]} :', style: TextStyle(fontSize: 16)),
|
||||
trailing: getTrail(key, index, widthTrail),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
|
||||
enabled: true,
|
||||
onTap: () {},
|
||||
onLongPress: () {},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("修改联系人"),
|
||||
centerTitle: true,
|
||||
),
|
||||
body: Container(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
//Flutter Column套ListView不显示,可将ListView用Expanded包裹起来。
|
||||
// child: ListView.builder(
|
||||
// itemCount: listFlields.length,
|
||||
// itemBuilder: _getListTileFields,
|
||||
// ),
|
||||
|
||||
//https://www.it1352.com/2028416.html
|
||||
//用Map而不是List的Flutter ListView(Flutter listview with Map instead of List)
|
||||
//listContacts2[widget.contactIndex]
|
||||
child: ListView.builder(
|
||||
itemCount: listContacts2[widget.contactIndex].length,
|
||||
itemBuilder: (BuildContext context, index) {
|
||||
String key = listContacts2[widget.contactIndex].keys.elementAt(index);
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
_getListTile(key, index, 220.0),
|
||||
Divider(
|
||||
height: 1.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//https://www.it1352.com/2028416.html
|
||||
//用Map而不是List的ListView.builder
|
||||
//Its a little late but You could also try this. Map values = snapshot.data;
|
||||
getMap() {
|
||||
Map values = listContacts2[widget.contactIndex];
|
||||
return new ListView.builder(
|
||||
itemCount: values.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
String key = values.keys.elementAt(index);
|
||||
return new Column(
|
||||
children: <Widget>[
|
||||
new ListTile(
|
||||
title: new Text("$key"),
|
||||
subtitle: new Text("${values[key]}"),
|
||||
),
|
||||
new Divider(
|
||||
height: 2.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../services/EventBus.dart';
|
||||
import '../01_messages/messages_manage.dart';
|
||||
import '../../../components/doJSON.dart';
|
||||
import '../../../components/hyxx_data_handle.dart';
|
||||
import 'dart:convert';
|
||||
import '../../../res/listContacts.dart';
|
||||
|
||||
class ContactModify extends StatefulWidget {
|
||||
ContactModify({@required this.contactIndex, Key key}) : super(key: key);
|
||||
int contactIndex;
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<ContactModify> {
|
||||
List<TextEditingController> listController;
|
||||
bool changed = false;
|
||||
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
getListFlields();
|
||||
}
|
||||
|
||||
String getUserText3(int index, String key) {
|
||||
String str = (listContacts2[index][key] is String) ? listContacts2[index][key] : '';
|
||||
return str;
|
||||
}
|
||||
|
||||
getListFlields() {
|
||||
listController = List.generate(listContacts2[widget.contactIndex].length, (index) {
|
||||
String key = listContacts2[widget.contactIndex].keys.elementAt(index);
|
||||
//return TextEditingController(text: listContacts2[widget.contactIndex][key]);
|
||||
return TextEditingController(text: getUserText3(widget.contactIndex, key));
|
||||
});
|
||||
}
|
||||
|
||||
//监听登录页面销毁的事件
|
||||
dispose() {
|
||||
super.dispose();
|
||||
if (changed) {
|
||||
writeJSON(json.encode(listContacts2), 'listContacts02.json');
|
||||
}
|
||||
eventBus.fire(new UserEvent('登录成功...'));
|
||||
}
|
||||
|
||||
doLogin() async {
|
||||
Navigator.pop(context); //返回
|
||||
return;
|
||||
}
|
||||
|
||||
OnTap_messages_manage() {
|
||||
Navigator.of(context).push(MaterialPageRoute(builder: (context) => MessagesManagePage()));
|
||||
}
|
||||
|
||||
//自定义方法
|
||||
static onNullFun() {}
|
||||
|
||||
Widget getTrail(String key, int index, double widthTrail) {
|
||||
return Container(
|
||||
alignment: Alignment(1, 0),
|
||||
//widthTrail = 400报错,360刚能显示,300换行,260
|
||||
width: widthTrail,
|
||||
child: TextField(
|
||||
//textAlign: TextAlign.right,
|
||||
style: TextStyle(fontSize: 16),
|
||||
decoration: InputDecoration(
|
||||
hintText: '請輸入字段信息',
|
||||
//border: InputBorder.none, //TextField去掉下划线
|
||||
contentPadding: EdgeInsets.only(right: 0),
|
||||
),
|
||||
controller: listController[index],
|
||||
enabled: mapUserInfoModifyable[key],
|
||||
//利用控制器初始化文本
|
||||
onChanged: (value) {
|
||||
listContacts2[widget.contactIndex][key] = value;
|
||||
bFlash = changed = true;
|
||||
print("ContactAdd bFlash = $bFlash");
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _getListTile(String key, int index, double widthTrail,
|
||||
{onTapFun = onNullFun, onLongPressFun = onNullFun, size = 16.0}) {
|
||||
return ListTile(
|
||||
//leading: new Icon(Icons.phone),
|
||||
title: Text('${mapUserInfoText[key]} :', style: TextStyle(fontSize: 16)),
|
||||
trailing: getTrail(key, index, widthTrail),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
|
||||
enabled: true,
|
||||
onTap: () {},
|
||||
onLongPress: () {},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("修改联系人"),
|
||||
centerTitle: true,
|
||||
),
|
||||
body: Container(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
//Flutter Column套ListView不显示,可将ListView用Expanded包裹起来。
|
||||
// child: ListView.builder(
|
||||
// itemCount: listFlields.length,
|
||||
// itemBuilder: _getListTileFields,
|
||||
// ),
|
||||
|
||||
//listContacts2[widget.contactIndex]
|
||||
child: ListView.builder(
|
||||
itemCount: listContacts2[widget.contactIndex].length,
|
||||
itemBuilder: (BuildContext context, index) {
|
||||
String key = listContacts2[widget.contactIndex].keys.elementAt(index);
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
_getListTile(key, index, 220.0),
|
||||
Divider(
|
||||
height: 1.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
//https://www.it1352.com/2028416.html
|
||||
//用Map而不是List的ListView.builder
|
||||
//Its a little late but You could also try this. Map values = snapshot.data;
|
||||
getMap() {
|
||||
Map values = listContacts2[widget.contactIndex];
|
||||
return new ListView.builder(
|
||||
itemCount: values.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
String key = values.keys.elementAt(index);
|
||||
return new Column(
|
||||
children: <Widget>[
|
||||
new ListTile(
|
||||
title: new Text("$key"),
|
||||
subtitle: new Text("${values[key]}"),
|
||||
),
|
||||
new Divider(
|
||||
height: 2.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,274 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:hyzp_ybqx/components/commonFun.dart';
|
||||
import 'package:hyzp_ybqx/components/dioFun.dart';
|
||||
|
||||
import '../../../components/customDialogH.dart';
|
||||
import '../../../components/hyxx_data_handle.dart';
|
||||
import '../../../res/listContacts.dart';
|
||||
import '../../../services/EventBus.dart';
|
||||
import '../../../services/Storage.dart';
|
||||
import '../../../widget/JdButton.dart';
|
||||
|
||||
class PersonalData extends StatefulWidget {
|
||||
PersonalData({Key key}) : super(key: key);
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<PersonalData> {
|
||||
List<TextEditingController> listController = [];
|
||||
String imagePath = '';
|
||||
Image _image;
|
||||
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
getListFlields();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
//监听登录页面销毁的事件
|
||||
dispose() {
|
||||
super.dispose();
|
||||
eventBus.fire(new UserEvent('登录成功...'));
|
||||
}
|
||||
|
||||
getListFlields() async {
|
||||
Storage.getString('userAvatarPath').then((value) {
|
||||
if (null != value) {
|
||||
imagePath = value;
|
||||
}
|
||||
});
|
||||
print('imagePath = $imagePath');
|
||||
|
||||
//mapUserInfo = mapUserInfoRet['data']['profile'];
|
||||
await getMyUserinfo();
|
||||
// print('mapUserInfoRet = $mapUserInfoRet');
|
||||
// print('mapUserInfo = $mapUserInfo');
|
||||
|
||||
listController = List.generate(mapUserInfo.length, (index) {
|
||||
String key = mapUserInfo.keys.elementAt(index);
|
||||
if ("reg_time" == key) {
|
||||
var strtime = DateTime.fromMillisecondsSinceEpoch(mapUserInfo[key]); //将拿到的时间戳转化为日期
|
||||
print('时间戳:${mapUserInfo[key]}');
|
||||
print('转换为日期时间:${strtime.toLocal().toString()}');
|
||||
// I/flutter (25364): 时间戳:1606653977
|
||||
// I/flutter (25364): 转换为日期时间:1970-01-19 14:17:33.977
|
||||
return TextEditingController(text: strtime.toLocal().toString());
|
||||
} else {
|
||||
var controller = TextEditingController(text: mapUserInfo[key].toString());
|
||||
controller.selection = TextSelection.fromPosition(
|
||||
TextPosition(affinity: TextAffinity.downstream, offset: '${controller.text}'.length),
|
||||
);
|
||||
return controller;
|
||||
}
|
||||
});
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
Widget getTrail(String key, int index, double widthTrail) {
|
||||
if (0 == listController.length) {
|
||||
return Container();
|
||||
}
|
||||
|
||||
//print('key = $key');
|
||||
if ('avatar' == key) {
|
||||
if (imagePath.isEmpty) {
|
||||
imagePath = listController[index].text;
|
||||
}
|
||||
return getAvatar(width: widthTrail);
|
||||
} else {
|
||||
return Container(
|
||||
alignment: Alignment(1, 0),
|
||||
//widthTrail = 400报错,360刚能显示,300换行,260
|
||||
width: widthTrail,
|
||||
child: TextField(
|
||||
//textAlign: TextAlign.right,
|
||||
style: TextStyle(fontSize: 16),
|
||||
decoration: InputDecoration(
|
||||
//hintText: '請輸入字段信息',
|
||||
border: InputBorder.none, //TextField去掉下划线
|
||||
contentPadding: EdgeInsets.only(right: 0),
|
||||
),
|
||||
controller: listController[index],
|
||||
enabled: mapUserInfoModifyable[key],
|
||||
//利用控制器初始化文本
|
||||
onChanged: (value) {
|
||||
mapUserInfo[key] = value;
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> doContacts() async {
|
||||
bFlash = false;
|
||||
return showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return customDialogH(
|
||||
title: "请选择头像修改操作",
|
||||
content: "头像修改",
|
||||
index: 0,
|
||||
);
|
||||
},
|
||||
).then((value) {
|
||||
if (null == value) {
|
||||
return;
|
||||
}
|
||||
imagePath = value;
|
||||
print('Page2_Contacts bFlash = $bFlash');
|
||||
if (imagePath?.isNotEmpty) {
|
||||
Storage.setString('userAvatarPath', imagePath);
|
||||
_image = Image.file(File(imagePath), fit: BoxFit.cover);
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Widget getAvatar({double width = 260.0}) {
|
||||
if (imagePath.isEmpty) {
|
||||
_image = Image.asset('assets/images/user.png', fit: BoxFit.cover);
|
||||
} else {
|
||||
String head = imagePath.substring(0, 4).trim().toLowerCase();
|
||||
if ('http' == head) {
|
||||
_image = Image.network(imagePath, fit: BoxFit.cover);
|
||||
} else {
|
||||
_image = Image.file(File(imagePath), fit: BoxFit.cover);
|
||||
}
|
||||
}
|
||||
return Container(
|
||||
alignment: Alignment(-1, 0),
|
||||
width: width,
|
||||
child: InkWell(
|
||||
onTap: () async {
|
||||
//doContacts();
|
||||
},
|
||||
child: Container(
|
||||
width: 40,
|
||||
child: _image,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
static onNullFun() {}
|
||||
|
||||
Widget _getListTile(String key, int index, double widthTrail,
|
||||
{onTapFun = onNullFun, onLongPressFun = onNullFun, size = 16.0}) {
|
||||
return ListTile(
|
||||
//leading: new Icon(Icons.phone),
|
||||
title: Text(mapUserInfoText.containsKey(key) ? '${mapUserInfoText[key]} :' : '$key :',
|
||||
style: TextStyle(fontSize: 16)),
|
||||
trailing: getTrail(key, index, widthTrail),
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
|
||||
enabled: true,
|
||||
onTap: () async {
|
||||
// if ('avatar' == key) {
|
||||
// print('选择图片或拍照');
|
||||
// await doContacts();
|
||||
// }
|
||||
},
|
||||
onLongPress: () {},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度
|
||||
// 设置appBar高度
|
||||
child: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
centerTitle: true,
|
||||
titleSpacing: 0.0,
|
||||
//设置title的左边距
|
||||
flexibleSpace: Container(
|
||||
//SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏
|
||||
// SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏
|
||||
padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度
|
||||
child: Container(
|
||||
//height: ScreenUtil().setHeight(173),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.centerLeft,
|
||||
end: Alignment.centerRight,
|
||||
colors: [
|
||||
Color.fromRGBO(12, 186, 156, 1),
|
||||
Color.fromRGBO(39, 127, 235, 1),
|
||||
],
|
||||
),
|
||||
),
|
||||
// decoration: BoxDecoration(
|
||||
// gradient: LinearGradient(colors: [
|
||||
// Color(0xFF0018EB),
|
||||
// Color(0xFF01C1D9),
|
||||
// ], begin: Alignment.bottomCenter, end: Alignment.topCenter),
|
||||
// ),
|
||||
),
|
||||
),
|
||||
title: Padding(
|
||||
padding: EdgeInsets.only(left: 0, right: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
getIconAndTextButton(
|
||||
iconColor: Colors.white,
|
||||
iconData: Icons.chevron_left_outlined,
|
||||
onPress: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Text("个人资料",
|
||||
style: TextStyle(color: Colors.white, fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
overflow: TextOverflow.ellipsis),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
//https://www.it1352.com/2028416.html
|
||||
//用Map而不是List的Flutter ListView.builder(Flutter listview with Map instead of List)
|
||||
child: ListView.builder(
|
||||
itemCount: mapUserInfo.length,
|
||||
itemBuilder: (BuildContext context, index) {
|
||||
String key = mapUserInfo.keys.elementAt(index);
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
_getListTile(key, index, 220.0),
|
||||
Divider(
|
||||
height: 1.0,
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(height: 40),
|
||||
JdButton(
|
||||
height: 126,
|
||||
width: 899,
|
||||
text: "确认",
|
||||
color: Colors.blueAccent,
|
||||
onTop: () async {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
SizedBox(height: 40),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,221 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:hyzp_ybqx/components/commonFun.dart';
|
||||
|
||||
import '../../../widget/JdButton.dart';
|
||||
|
||||
class MyFeedback extends StatefulWidget {
|
||||
MyFeedback({Key key}) : super(key: key);
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<MyFeedback> {
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
}
|
||||
|
||||
doOK() {
|
||||
Navigator.pop(context); //返回
|
||||
}
|
||||
|
||||
int radioSelect = 0;
|
||||
String opinionText = '';
|
||||
|
||||
//监听登录页面销毁的事件
|
||||
dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Widget getTextField() {
|
||||
return Container(
|
||||
decoration: new BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.all(Radius.circular(4.0)),
|
||||
border: new Border.all(width: 1, color: Colors.blue),
|
||||
),
|
||||
constraints: BoxConstraints(
|
||||
maxHeight: 240.0,
|
||||
maxWidth: MediaQuery.of(context).size.width,
|
||||
minHeight: 240.0,
|
||||
minWidth: MediaQuery.of(context).size.width,
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
SizedBox(width: 10),
|
||||
Expanded(
|
||||
child: TextField(
|
||||
style: TextStyle(fontSize: 16),
|
||||
keyboardType: TextInputType.multiline,
|
||||
maxLines: null,
|
||||
//不限制行数
|
||||
decoration: InputDecoration(
|
||||
hintText: '請輸入反馈问题的详细描述内容',
|
||||
border: InputBorder.none, //TextField去掉下划线
|
||||
//border: OutlineInputBorder(),
|
||||
),
|
||||
onChanged: (val) {
|
||||
opinionText = val;
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(width: 10),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度
|
||||
// 设置appBar高度
|
||||
child: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
centerTitle: true,
|
||||
titleSpacing: 0.0,
|
||||
//设置title的左边距
|
||||
flexibleSpace: Container(
|
||||
//SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏
|
||||
// SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏
|
||||
padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度
|
||||
child: Container(
|
||||
//height: ScreenUtil().setHeight(173),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.centerLeft,
|
||||
end: Alignment.centerRight,
|
||||
colors: [
|
||||
Color.fromRGBO(12, 186, 156, 1),
|
||||
Color.fromRGBO(39, 127, 235, 1),
|
||||
],
|
||||
),
|
||||
),
|
||||
// decoration: BoxDecoration(
|
||||
// gradient: LinearGradient(colors: [
|
||||
// Color(0xFF0018EB),
|
||||
// Color(0xFF01C1D9),
|
||||
// ], begin: Alignment.bottomCenter, end: Alignment.topCenter),
|
||||
// ),
|
||||
),
|
||||
),
|
||||
title: Padding(
|
||||
padding: EdgeInsets.only(left: 0, right: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
getIconAndTextButton(
|
||||
iconColor: Colors.white,
|
||||
iconData: Icons.chevron_left_outlined,
|
||||
onPress: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Text("意见反馈",
|
||||
style: TextStyle(color: Colors.white, fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
overflow: TextOverflow.ellipsis),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
padding: EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20),
|
||||
child: ListView(
|
||||
children: <Widget>[
|
||||
Center(
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(top: 10),
|
||||
height: ScreenUtil().setWidth(160),
|
||||
width: ScreenUtil().setWidth(160),
|
||||
//child: Image.asset('assets/images/user.png', fit: BoxFit.cover),
|
||||
child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
Text('请选择问题类型'),
|
||||
getRadioRow(),
|
||||
Text('请輸入问题描述'),
|
||||
SizedBox(height: 10),
|
||||
getTextField(),
|
||||
SizedBox(height: 40),
|
||||
JdButton(
|
||||
height: 126,
|
||||
text: "确认",
|
||||
color: Colors.blueAccent,
|
||||
onTop: doOK,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget getRadio(int index) {
|
||||
return Container(
|
||||
alignment: Alignment(1, -1),
|
||||
height: 30,
|
||||
width: 30,
|
||||
child: Radio(
|
||||
value: index,
|
||||
onChanged: (v) {
|
||||
setState(() {
|
||||
radioSelect = v;
|
||||
});
|
||||
},
|
||||
groupValue: radioSelect,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget getRadioRow() {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
"投诉",
|
||||
style: TextStyle(
|
||||
color: (0 == radioSelect) ? Colors.blue : null,
|
||||
fontWeight: (0 == radioSelect) ? FontWeight.bold : null,
|
||||
),
|
||||
),
|
||||
getRadio(0),
|
||||
SizedBox(width: 25),
|
||||
Text(
|
||||
"故障",
|
||||
style: TextStyle(
|
||||
color: (1 == radioSelect) ? Colors.blue : null,
|
||||
fontWeight: (1 == radioSelect) ? FontWeight.bold : null,
|
||||
),
|
||||
),
|
||||
getRadio(1),
|
||||
SizedBox(width: 25),
|
||||
Text(
|
||||
"建议",
|
||||
style: TextStyle(
|
||||
color: (2 == radioSelect) ? Colors.blue : null,
|
||||
fontWeight: (2 == radioSelect) ? FontWeight.bold : null,
|
||||
),
|
||||
),
|
||||
getRadio(2),
|
||||
SizedBox(width: 25),
|
||||
Text(
|
||||
"其他",
|
||||
style: TextStyle(
|
||||
color: (3 == radioSelect) ? Colors.blue : null,
|
||||
fontWeight: (3 == radioSelect) ? FontWeight.bold : null,
|
||||
),
|
||||
),
|
||||
getRadio(3),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,389 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
///https://blog.csdn.net/zcylyzhi4/article/details/108002879
|
||||
///1、导入相关包
|
||||
import 'dart:isolate';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_downloader/flutter_downloader.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:hyzp_ybqx/components/dioFun.dart';
|
||||
import 'package:hyzp_ybqx/components/doJSON.dart';
|
||||
import 'package:open_file/open_file.dart';
|
||||
import 'package:package_info/package_info.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:progress_dialog/progress_dialog.dart';
|
||||
|
||||
import '../../../components/commonFun.dart';
|
||||
import '../../../widget/JdButton.dart';
|
||||
|
||||
///版本更新頁面
|
||||
class MyUpdated extends StatefulWidget {
|
||||
MyUpdated({Key key, this.ver, this.date, this.theContext}) : super(key: key);
|
||||
String ver = '1.0.0';
|
||||
String date = '';
|
||||
BuildContext theContext;
|
||||
|
||||
_MyUpdatedState createState() => _MyUpdatedState();
|
||||
}
|
||||
|
||||
class _MyUpdatedState extends State<MyUpdated> {
|
||||
//2、声明变量
|
||||
int _stampAppCompile = -1;
|
||||
String _dateNewver = '';
|
||||
Map _mapVer = {};
|
||||
String serviceVersionCode = '';
|
||||
String appId = '';
|
||||
ProgressDialog pr;
|
||||
String apkName = 'app-release.apk';
|
||||
String appPath = '';
|
||||
ReceivePort _port = ReceivePort();
|
||||
|
||||
void initState() {
|
||||
// 0、初始化FlutterDownLoader。版本更新初始化,放在这里会报错,初始化失败
|
||||
// WidgetsFlutterBinding.ensureInitialized();
|
||||
if (!bFlutterDownloader_initialize) {
|
||||
FlutterDownloader.initialize(debug: true).then((value) {
|
||||
//3、在initState中初始化
|
||||
IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
|
||||
_port.listen(_updateDownLoadInfo);
|
||||
FlutterDownloader.registerCallback(_downLoadCallback);
|
||||
getNewverUrl().then((value) {
|
||||
_mapVer = value;
|
||||
print('_mapVer = ${_mapVer}');
|
||||
});
|
||||
bFlutterDownloader_initialize = true;
|
||||
});
|
||||
} else {
|
||||
//3、在initState中初始化
|
||||
IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
|
||||
_port.listen(_updateDownLoadInfo);
|
||||
FlutterDownloader.registerCallback(_downLoadCallback);
|
||||
getNewverUrl().then((value) {
|
||||
_mapVer = value;
|
||||
print('_mapVer = ${_mapVer}');
|
||||
//I/flutter (12498): _mapVer = {id: 1, ver: 1.0.0, miaos: 版本说明,
|
||||
// downurl: http://www.sctastech.com/download/hyzp_20210425.apk, updatetime: 1620632231}
|
||||
|
||||
print('oldVer = ${widget.ver}');
|
||||
_mapVer['ver'] = '1.3.1';
|
||||
print('newVer = ${_mapVer['ver']}');
|
||||
// I/flutter ( 1872): oldVer = 1.3.0
|
||||
// I/flutter ( 1872): newVer = 1.3.1
|
||||
|
||||
///从字符串时间获取秒时间戳:int getStampFromString(String strTime)
|
||||
// _stampAppCompile = getStampFromString(widget.date.replaceAll('.', '-'));
|
||||
// //timeStamp可以是int类型或String类型的时间戳(秒):String getFtpdir_YYYYMMDD(var timeStamp)
|
||||
// _dateNewver = getFtpdir_YYYYMMDD(_mapVer['updatetime'], sep: '.');
|
||||
// print('_stampAppCompile = $_stampAppCompile');
|
||||
// print('_mapVer[\'updatetime\'] = ${_mapVer['updatetime']}');
|
||||
// print('widget.date = ${widget.date}');
|
||||
// print('_dateNewver = $_dateNewver');
|
||||
// I/flutter (30820): _stampAppCompile = 1620403200
|
||||
// I/flutter (30820): _mapVer['updatetime'] = 1620632231
|
||||
// I/flutter (30820): widget.date = 2021.05.08
|
||||
// I/flutter (30820): _dateNewver = 2021.05.10
|
||||
});
|
||||
}
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
//4、判断,自动更新
|
||||
|
||||
// 版本比较
|
||||
Future verCompare({String newVer, String oldVer}) async {
|
||||
List listNewVer = await tran2int(newVer.split('.'));
|
||||
List listOldVer = await tran2int(oldVer.split('.'));
|
||||
|
||||
int len = listNewVer.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (listNewVer[i] > listOldVer[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Future tran2int(List _list) async {
|
||||
List listRet = [];
|
||||
int len = _list.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
listRet.add(int.parse(_list[i].trim()));
|
||||
}
|
||||
return listRet;
|
||||
}
|
||||
|
||||
@override
|
||||
Future afterFirstLayout(BuildContext context) async {
|
||||
// 如果是android,则执行热更新
|
||||
if (Platform.isAndroid) {
|
||||
verCompare(newVer: _mapVer['ver'], oldVer: widget.ver).then((value) {
|
||||
if (value) {
|
||||
print('value = $value');
|
||||
//_getNewVersionAPP(context);
|
||||
serviceVersionCode = _mapVer['ver'];
|
||||
//appId = res.data['id'];
|
||||
//_checkVersionCode();
|
||||
_showNewVersionAppDialog();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//监听登录页面销毁的事件
|
||||
dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
doLogin() async {
|
||||
//临时跳转
|
||||
//Navigator.pushNamed(context, '/tabs', arguments: g_iIndex);
|
||||
afterFirstLayout(context).then((value) {});
|
||||
//Navigator.pop(context); //返回
|
||||
return;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)),
|
||||
// 设置appBar高度
|
||||
// 设置appBar高度
|
||||
child: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
centerTitle: true,
|
||||
titleSpacing: 0.0,
|
||||
//设置title的左边距
|
||||
flexibleSpace: Container(
|
||||
//SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏
|
||||
// SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏
|
||||
padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight),
|
||||
//留出顶部状态栏高度
|
||||
child: Container(
|
||||
//height: ScreenUtil().setHeight(173),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.centerLeft,
|
||||
end: Alignment.centerRight,
|
||||
colors: [
|
||||
Color.fromRGBO(12, 186, 156, 1),
|
||||
Color.fromRGBO(39, 127, 235, 1),
|
||||
],
|
||||
),
|
||||
),
|
||||
// decoration: BoxDecoration(
|
||||
// gradient: LinearGradient(colors: [
|
||||
// Color(0xFF0018EB),
|
||||
// Color(0xFF01C1D9),
|
||||
// ], begin: Alignment.bottomCenter, end: Alignment.topCenter),
|
||||
// ),
|
||||
),
|
||||
),
|
||||
title: Padding(
|
||||
padding: EdgeInsets.only(left: 0, right: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
getIconAndTextButton(
|
||||
iconColor: Colors.white,
|
||||
iconData: Icons.chevron_left_outlined,
|
||||
onPress: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Text("版本更新",
|
||||
style: TextStyle(color: Colors.white, fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
overflow: TextOverflow.ellipsis),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
padding: EdgeInsets.only(top: 20, bottom: 20, left: 5, right: 5),
|
||||
child: ListView(
|
||||
children: <Widget>[
|
||||
Center(
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(top: 30),
|
||||
height: ScreenUtil().setWidth(160),
|
||||
width: ScreenUtil().setWidth(160),
|
||||
//child: Image.asset('assets/images/user.png', fit: BoxFit.cover),
|
||||
child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight),
|
||||
// child: Image.network(
|
||||
// 'https://www.itying.com/images/flutter/list5.jpg',
|
||||
// fit: BoxFit.cover),
|
||||
),
|
||||
),
|
||||
Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
SizedBox(height: 60),
|
||||
Text('宜宾市黑烟车电子抓拍系统', style: TextStyle(fontSize: 20)),
|
||||
Text('v${widget.ver}(${widget.date})', style: TextStyle(fontSize: 20)),
|
||||
SizedBox(height: 60),
|
||||
Text('© 宜宾市生态环境局 四川省踏石科技 版权所有\n服务热线:187-8467-8300',
|
||||
maxLines: 2, style: TextStyle(fontSize: 16), textAlign: TextAlign.center),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 100),
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20),
|
||||
child: JdButton(
|
||||
height: 126,
|
||||
text: "确认",
|
||||
color: Colors.blueAccent,
|
||||
onTop: doLogin,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
///https://blog.csdn.net/zcylyzhi4/article/details/108002879
|
||||
//5、自动更新代码
|
||||
/// 执行版本更新的网络请求
|
||||
_getNewVersionAPP(context) async {
|
||||
// HttpUtils.send(
|
||||
// context,
|
||||
// 'http://update.rwworks.com:8088/appManager/monitor/app/version/check/flutterTempldate',
|
||||
// ).then((res) {
|
||||
// serviceVersionCode = res.data["versionNo"];
|
||||
// appId = res.data['id'];
|
||||
// _checkVersionCode();
|
||||
// });
|
||||
}
|
||||
|
||||
/// 检查当前版本是否为最新,若不是,则更新
|
||||
void _checkVersionCode() {
|
||||
PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
|
||||
var currentVersionCode = packageInfo.version;
|
||||
if (double.parse(serviceVersionCode.substring(0, 3)) >
|
||||
double.parse(currentVersionCode.substring(0, 3))) {
|
||||
_showNewVersionAppDialog();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// 版本更新提示对话框
|
||||
Future<void> _showNewVersionAppDialog() async {
|
||||
return showDialog<void>(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: new Row(
|
||||
children: <Widget>[
|
||||
new Padding(
|
||||
padding: const EdgeInsets.fromLTRB(30.0, 0.0, 10.0, 0.0),
|
||||
child: new Text("发现新版本"))
|
||||
],
|
||||
),
|
||||
content: new Text(serviceVersionCode),
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('下次再说'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('立即更新'),
|
||||
onPressed: () {
|
||||
_doUpdate(context);
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/// 执行更新操作
|
||||
_doUpdate(BuildContext context) async {
|
||||
Navigator.pop(context);
|
||||
_executeDownload(context);
|
||||
}
|
||||
|
||||
/// 下载最新apk包
|
||||
Future<void> _executeDownload(BuildContext context) async {
|
||||
pr = new ProgressDialog(
|
||||
context,
|
||||
type: ProgressDialogType.Download,
|
||||
isDismissible: true,
|
||||
showLogs: true,
|
||||
);
|
||||
pr.style(message: '准备下载...');
|
||||
if (!pr.isShowing()) {
|
||||
pr.show();
|
||||
}
|
||||
|
||||
final path = await _apkLocalPath;
|
||||
await FlutterDownloader.enqueue(
|
||||
//url: 'http://update.rwworks.com:8088/appManager/monitor/app/appload/' + appId + '',
|
||||
url: _mapVer['downurl'],
|
||||
savedDir: path,
|
||||
fileName: apkName,
|
||||
showNotification: true,
|
||||
openFileFromNotification: true);
|
||||
}
|
||||
|
||||
/// 下载进度回调函数
|
||||
static void _downLoadCallback(String id, DownloadTaskStatus status, int progress) {
|
||||
final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port');
|
||||
send.send([id, status, progress]);
|
||||
}
|
||||
|
||||
/// 更新下载进度框
|
||||
_updateDownLoadInfo(dynamic data) {
|
||||
DownloadTaskStatus status = data[1];
|
||||
int progress = data[2];
|
||||
if (status == DownloadTaskStatus.running) {
|
||||
pr.update(progress: double.parse(progress.toString()), message: "下载中,请稍后…");
|
||||
}
|
||||
if (status == DownloadTaskStatus.failed) {
|
||||
if (pr.isShowing()) {
|
||||
pr.hide();
|
||||
}
|
||||
}
|
||||
|
||||
if (status == DownloadTaskStatus.complete) {
|
||||
if (pr.isShowing()) {
|
||||
pr.hide();
|
||||
}
|
||||
_installApk();
|
||||
}
|
||||
}
|
||||
|
||||
/// 安装apk
|
||||
Future<Null> _installApk() async {
|
||||
await OpenFile.open(appPath + '/' + apkName);
|
||||
}
|
||||
|
||||
/// 获取apk存储位置
|
||||
Future<String> get _apkLocalPath async {
|
||||
final directory = await getExternalStorageDirectory();
|
||||
String path = directory.path + Platform.pathSeparator + 'Download';
|
||||
;
|
||||
final savedDir = Directory(path);
|
||||
bool hasExisted = await savedDir.exists();
|
||||
if (!hasExisted) {
|
||||
await savedDir.create();
|
||||
}
|
||||
this.setState(() {
|
||||
appPath = path;
|
||||
});
|
||||
return path;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,386 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
///https://blog.csdn.net/zcylyzhi4/article/details/108002879
|
||||
///1、导入相关包
|
||||
import 'dart:isolate';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_downloader/flutter_downloader.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:hyzp_ybqx/components/dioFun.dart';
|
||||
import 'package:open_file/open_file.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:progress_dialog/progress_dialog.dart';
|
||||
|
||||
import '../../../components/commonFun.dart';
|
||||
|
||||
///版本更新类
|
||||
class MyUpdatedNew {
|
||||
MyUpdatedNew(
|
||||
{this.ver,
|
||||
this.date,
|
||||
this.theContext,
|
||||
this.bStartUpdated = false,
|
||||
this.bShowNoNewVersion = false}) {
|
||||
initState();
|
||||
}
|
||||
|
||||
String ver = '1.0.0';
|
||||
String date = '';
|
||||
BuildContext theContext;
|
||||
bool bStartUpdated;
|
||||
bool bShowNoNewVersion;
|
||||
|
||||
//2、声明变量
|
||||
int _stampAppCompile = -1;
|
||||
String _dateNewver = '';
|
||||
Map _mapVer = {};
|
||||
String serviceVersionCode = '';
|
||||
String appId = '';
|
||||
ProgressDialog pr;
|
||||
String apkName = '';
|
||||
String appPath = '';
|
||||
ReceivePort _port = ReceivePort();
|
||||
|
||||
void initState() {
|
||||
// 0、初始化FlutterDownLoader。版本更新初始化,放在这里会报错,初始化失败
|
||||
// WidgetsFlutterBinding.ensureInitialized();
|
||||
if (!bFlutterDownloader_initialize) {
|
||||
FlutterDownloader.initialize(debug: true).then((value) {
|
||||
registerCallback(first: true);
|
||||
});
|
||||
} else {
|
||||
registerCallback();
|
||||
}
|
||||
}
|
||||
|
||||
registerCallback({bool first = false}) {
|
||||
//3、在initState中初始化
|
||||
/*
|
||||
D/DownloadWorker( 4745): Update too frequently!!!!, this should be dropped
|
||||
E/flutter ( 4745): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: NoSuchMethodError: The method 'update' was called on null.
|
||||
E/flutter ( 4745): Receiver: null
|
||||
E/flutter ( 4745): Tried calling: update(message: "下载中,请稍后…", progress: 0.0)
|
||||
E/flutter ( 4745): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
|
||||
E/flutter ( 4745): #1 MyUpdatedNew._updateDownLoadInfo (package:hyzp_ybqx/pages/MyMsics/05_updated/MyUpdatedNew.dart:251:10)
|
||||
E/flutter ( 4745): #2 _rootRunUnary (dart:async/zone.dart:1206:13)
|
||||
E/flutter ( 4745): #3 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
|
||||
E/flutter ( 4745): #4 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
|
||||
E/flutter ( 4745): #5 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:357:11)
|
||||
E/flutter ( 4745): #6 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:285:7)
|
||||
E/flutter ( 4745): #7 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:808:19)
|
||||
E/flutter ( 4745): #8 _StreamController._add (dart:async/stream_controller.dart:682:7)
|
||||
E/flutter ( 4745): #9 _StreamController.add (dart:async/stream_controller.dart:624:5)
|
||||
E/flutter ( 4745): #10 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
|
||||
E/flutter ( 4745):
|
||||
*/
|
||||
|
||||
if (!first) {
|
||||
// 解决2次进入报错无法下载的问题-OK
|
||||
// 如果以前注册过必须先移除,否则报错无法下载:DownloadWorker( 4745): Update too frequently!!!!, this should be dropped
|
||||
IsolateNameServer.removePortNameMapping('downloader_send_port');
|
||||
// FlutterDownloader.cancelAll();
|
||||
// FlutterDownloader.remove(taskId: null);
|
||||
}
|
||||
IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port');
|
||||
_port.listen(_updateDownLoadInfo);
|
||||
FlutterDownloader.registerCallback(_downLoadCallback);
|
||||
getNewverUrl().then((value) {
|
||||
_mapVer = value;
|
||||
print('_mapVer = ${_mapVer}');
|
||||
//I/flutter (12498): _mapVer = {id: 1, ver: 1.0.0, miaos: 版本说明,
|
||||
// downurl: http://www.sctastech.com/download/hyzp_20210425.apk, updatetime: 1620632231}
|
||||
|
||||
print('oldVer = ${ver}');
|
||||
//_mapVer['ver'] = '1.3.1';
|
||||
print('newVer = ${_mapVer['ver']}');
|
||||
// I/flutter ( 1872): oldVer = 1.3.0
|
||||
// I/flutter ( 1872): newVer = 1.3.1
|
||||
|
||||
if (first) {
|
||||
bFlutterDownloader_initialize = true;
|
||||
}
|
||||
|
||||
startUpdated();
|
||||
});
|
||||
}
|
||||
|
||||
///开始更新过程
|
||||
Future startUpdated() async {
|
||||
// 如果是android,则执行热更新
|
||||
if (Platform.isAndroid) {
|
||||
verCompare(newVer: _mapVer['ver'], oldVer: ver).then((value) {
|
||||
if (value) {
|
||||
print('value = $value');
|
||||
//_getNewVersionAPP(context);
|
||||
//appId = res.data['id'];
|
||||
//_checkVersionCode();
|
||||
bNewVer = true; //发现新版本
|
||||
if (bStartUpdated) {
|
||||
serviceVersionCode = _mapVer['ver'];
|
||||
_showNewVersionAppDialog();
|
||||
}
|
||||
} else if (bShowNoNewVersion) {
|
||||
// 没有发现新版本
|
||||
_showNoNewVersionAppDialog();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// 没有发现新版本
|
||||
Future<void> _showNoNewVersionAppDialog() async {
|
||||
return showDialog<void>(
|
||||
context: theContext,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[Text("没有发现新版本")],
|
||||
),
|
||||
content: Container(
|
||||
//padding: EdgeInsets.only(bottom: ScreenUtil().setHeight(18)),
|
||||
height: ScreenUtil().setHeight(230),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.blueAccent, width: 1.0),
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: RichText(
|
||||
textAlign: TextAlign.center,
|
||||
text: TextSpan(children: [
|
||||
TextSpan(text: 'NewVer: ', style: TextStyle(fontSize: 17, color: Colors.black)),
|
||||
TextSpan(
|
||||
text: '暂无新版本',
|
||||
style: TextStyle(
|
||||
fontSize: 17, color: Colors.black, fontWeight: FontWeight.bold)),
|
||||
]),
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('确定'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
/// 版本更新提示对话框
|
||||
Future<void> _showNewVersionAppDialog() async {
|
||||
String content1 = "注意:";
|
||||
String content2 = "新版本下载成功后,将弹出“安装未知应用程序”界面,请";
|
||||
String content3 = "授权“允许此来源”";
|
||||
String content4 = ";然后";
|
||||
String content5 = "稍等几秒钟";
|
||||
String content6 = ",再";
|
||||
String content7 = "点击“返回”按钮(一般位于左上角)";
|
||||
String content8 = ",按照提示即可完成升级过程。若";
|
||||
String content9 = "升级过程意外中断";
|
||||
String content10 = ",可重启App再次升级即可。";
|
||||
|
||||
return showDialog<void>(
|
||||
context: theContext,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
insetPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 24.0),
|
||||
buttonPadding: EdgeInsets.only(bottom: 15, right: 20),
|
||||
title: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[Text("发现新版本")],
|
||||
),
|
||||
content: Container(
|
||||
padding: EdgeInsets.only(
|
||||
left: ScreenUtil().setHeight(25), right: ScreenUtil().setHeight(10)),
|
||||
height: ScreenUtil().setHeight(620),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: Colors.blueAccent, width: 1.0),
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: Column(
|
||||
children: [
|
||||
RichText(
|
||||
textAlign: TextAlign.center,
|
||||
text: TextSpan(children: [
|
||||
TextSpan(
|
||||
text: '\nNewVer: ',
|
||||
style: TextStyle(fontSize: 17, color: Colors.redAccent)),
|
||||
TextSpan(
|
||||
text: serviceVersionCode,
|
||||
style: TextStyle(
|
||||
fontSize: 17, color: Colors.redAccent, fontWeight: FontWeight.bold)),
|
||||
]),
|
||||
),
|
||||
RichText(
|
||||
textAlign: TextAlign.justify,
|
||||
text: TextSpan(children: [
|
||||
getTextSpan('\n' + content1, color: Colors.blueAccent),
|
||||
getTextSpan(content2),
|
||||
getTextSpan(content3, color: Colors.redAccent),
|
||||
getTextSpan(content4),
|
||||
getTextSpan(content5, color: Colors.redAccent),
|
||||
getTextSpan(content6),
|
||||
getTextSpan(content7, color: Colors.redAccent),
|
||||
getTextSpan(content8),
|
||||
getTextSpan(content9, color: Colors.blueAccent),
|
||||
getTextSpan(content10),
|
||||
]),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
new FlatButton(
|
||||
child: new Text('立即更新'),
|
||||
onPressed: () {
|
||||
/// 执行更新操作
|
||||
Navigator.pop(context);
|
||||
_executeDownload(context);
|
||||
},
|
||||
),
|
||||
new FlatButton(
|
||||
child: new Text('下次再说'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
TextSpan getTextSpan(String _text, {Color color = Colors.black, double fontSize = 15}) {
|
||||
return TextSpan(text: _text, style: TextStyle(fontSize: fontSize, color: color));
|
||||
}
|
||||
|
||||
/// 下载最新apk包
|
||||
Future<void> _executeDownload(BuildContext context) async {
|
||||
pr = new ProgressDialog(
|
||||
context,
|
||||
type: ProgressDialogType.Download,
|
||||
isDismissible: true,
|
||||
showLogs: true,
|
||||
);
|
||||
pr.style(message: '准备下载...');
|
||||
if (!pr.isShowing()) {
|
||||
pr.show();
|
||||
}
|
||||
|
||||
final path = await _apkLocalPath;
|
||||
apkName = getFileName(_mapVer['downurl']);
|
||||
await FlutterDownloader.enqueue(
|
||||
//url: 'http://update.rwworks.com:8088/appManager/monitor/app/appload/' + appId + '',
|
||||
url: _mapVer['downurl'],
|
||||
savedDir: path,
|
||||
fileName: apkName,
|
||||
showNotification: true,
|
||||
openFileFromNotification: true);
|
||||
}
|
||||
|
||||
/// 下载进度回调函数
|
||||
static void _downLoadCallback(String id, DownloadTaskStatus status, int progress) {
|
||||
final SendPort send = IsolateNameServer.lookupPortByName('downloader_send_port');
|
||||
send.send([id, status, progress]);
|
||||
}
|
||||
|
||||
/// 更新下载进度框
|
||||
_updateDownLoadInfo(dynamic data) {
|
||||
DownloadTaskStatus status = data[1];
|
||||
int progress = data[2];
|
||||
if (status == DownloadTaskStatus.running) {
|
||||
pr.update(progress: double.parse(progress.toString()), message: "下载中,请稍后…");
|
||||
}
|
||||
if (status == DownloadTaskStatus.failed) {
|
||||
if (pr.isShowing()) {
|
||||
pr.hide();
|
||||
}
|
||||
}
|
||||
|
||||
if (status == DownloadTaskStatus.complete) {
|
||||
if (pr.isShowing()) {
|
||||
pr.hide();
|
||||
}
|
||||
_installApk();
|
||||
}
|
||||
}
|
||||
|
||||
/// 安装apk
|
||||
Future<Null> _installApk() async {
|
||||
await OpenFile.open(appPath + '/' + apkName);
|
||||
}
|
||||
|
||||
/// 获取apk存储位置
|
||||
Future<String> get _apkLocalPath async {
|
||||
final directory = await getExternalStorageDirectory();
|
||||
String path = directory.path + Platform.pathSeparator + 'Download';
|
||||
;
|
||||
final savedDir = Directory(path);
|
||||
bool hasExisted = await savedDir.exists();
|
||||
if (!hasExisted) {
|
||||
await savedDir.create();
|
||||
}
|
||||
appPath = path;
|
||||
|
||||
// this.setState(() {
|
||||
// appPath = path;
|
||||
// });
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
//4、判断,自动更新
|
||||
// 版本比较
|
||||
//R:\FlutterProject\FlutterProject33\hyzp_ybqx\lib\pages\MyMsics\05_updated\MyUpdatedNew.dart line 343
|
||||
Future verCompare({String newVer, String oldVer}) async {
|
||||
//解决newVer中不包含字符“+”号报错失败问题
|
||||
if (newVer.indexOf('+') > -1) {
|
||||
//解决App.Car_Ver.Getver接口返回值变化后,1.3.11+20210729字符串转换为数字报错问题
|
||||
print('newVer = $newVer');
|
||||
newVer = newVer.substring(0, newVer.indexOf('+')); // substring是含头不含尾
|
||||
print('newVer2 = $newVer');
|
||||
}
|
||||
|
||||
List listNewVer = await tran2int(newVer.split('.'));
|
||||
List listOldVer = await tran2int(oldVer.split('.'));
|
||||
|
||||
int len = listNewVer.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
if (listNewVer[i] > listOldVer[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Future tran2int(List _list) async {
|
||||
List listRet = [];
|
||||
int len = _list.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
listRet.add(int.parse(_list[i].trim()));
|
||||
}
|
||||
return listRet;
|
||||
}
|
||||
|
||||
///https://blog.csdn.net/zcylyzhi4/article/details/108002879
|
||||
//5、自动更新代码
|
||||
/// 执行版本更新的网络请求
|
||||
|
||||
/// 检查当前版本是否为最新,若不是,则更新
|
||||
// void _checkVersionCode() {
|
||||
// PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
|
||||
// var currentVersionCode = packageInfo.version;
|
||||
// if (double.parse(serviceVersionCode.substring(0, 3)) >
|
||||
// double.parse(currentVersionCode.substring(0, 3))) {
|
||||
// _showNewVersionAppDialog();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../../components/commonFun.dart';
|
||||
|
||||
import '../../../widget/JdButton.dart';
|
||||
import '../../../components/commonFun.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class MyAbout extends StatefulWidget {
|
||||
MyAbout({Key key, this.ver, this.date}) : super(key: key);
|
||||
String ver = '1.0.0';
|
||||
String date = '';
|
||||
|
||||
_LoginPageState createState() => _LoginPageState();
|
||||
}
|
||||
|
||||
class _LoginPageState extends State<MyAbout> {
|
||||
var _username = new TextEditingController();
|
||||
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
}
|
||||
|
||||
//监听登录页面销毁的事件
|
||||
dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
doLogin() async {
|
||||
//临时跳转
|
||||
//Navigator.pushNamed(context, '/tabs', arguments: g_iIndex);
|
||||
Navigator.pop(context); //返回
|
||||
return;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: PreferredSize(
|
||||
preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度
|
||||
// 设置appBar高度
|
||||
child: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
centerTitle: true,
|
||||
titleSpacing: 0.0,
|
||||
//设置title的左边距
|
||||
flexibleSpace: Container(
|
||||
//SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏
|
||||
// SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏
|
||||
padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度
|
||||
child: Container(
|
||||
//height: ScreenUtil().setHeight(173),
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.centerLeft,
|
||||
end: Alignment.centerRight,
|
||||
colors: [
|
||||
Color.fromRGBO(12, 186, 156, 1),
|
||||
Color.fromRGBO(39, 127, 235, 1),
|
||||
],
|
||||
),
|
||||
),
|
||||
// decoration: BoxDecoration(
|
||||
// gradient: LinearGradient(colors: [
|
||||
// Color(0xFF0018EB),
|
||||
// Color(0xFF01C1D9),
|
||||
// ], begin: Alignment.bottomCenter, end: Alignment.topCenter),
|
||||
// ),
|
||||
),
|
||||
),
|
||||
title: Padding(
|
||||
padding: EdgeInsets.only(left: 0, right: 0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
getIconAndTextButton(
|
||||
iconColor: Colors.white,
|
||||
iconData: Icons.chevron_left_outlined,
|
||||
onPress: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Text("关于",
|
||||
style: TextStyle(color: Colors.white, fontSize: 20),
|
||||
textAlign: TextAlign.center,
|
||||
overflow: TextOverflow.ellipsis),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
body: Container(
|
||||
padding: EdgeInsets.only(top: 20, bottom: 20, left: 5, right: 5),
|
||||
child: ListView(
|
||||
children: <Widget>[
|
||||
Center(
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(top: 30),
|
||||
height: ScreenUtil().setWidth(160),
|
||||
width: ScreenUtil().setWidth(160),
|
||||
//child: Image.asset('assets/images/user.png', fit: BoxFit.cover),
|
||||
child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight),
|
||||
// child: Image.network(
|
||||
// 'https://www.itying.com/images/flutter/list5.jpg',
|
||||
// fit: BoxFit.cover),
|
||||
),
|
||||
),
|
||||
Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
SizedBox(height: 60),
|
||||
Text('宜宾市黑烟车电子抓拍系统', style: TextStyle(fontSize: 20)),
|
||||
Text('v${widget.ver}(${widget.date})', style: TextStyle(fontSize: 20)),
|
||||
SizedBox(height: 60),
|
||||
Text('© 宜宾市生态环境局 四川省踏石科技 版权所有\n服务热线:187-8467-8300',
|
||||
maxLines: 2, style: TextStyle(fontSize: 16), textAlign: TextAlign.center),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 100),
|
||||
Container(
|
||||
padding: EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20),
|
||||
child: JdButton(
|
||||
height: 126,
|
||||
text: "确认",
|
||||
color: Colors.blueAccent,
|
||||
onTop: doLogin,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user