You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

598 lines
21 KiB
Dart

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/screen_util.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hyzp_ybqx01_cuiping/components/commonFun.dart';
import 'package:hyzp_ybqx01_cuiping/components/customDialogF.dart';
import 'package:hyzp_ybqx01_cuiping/services/EventBus.dart';
import 'package:hyzp_ybqx01_cuiping/widget/customRadioWidget.dart';
import '../../../components/customDialogH.dart';
import '../../../components/customDialogJ.dart';
import '../../../components/dioFun.dart';
import '../../../components/doJSON.dart';
import '../../../components/hyxx_data_handle.dart';
class SbbjContent extends StatefulWidget {
//SbbjContent({Key key, this.title, this.mapData}) : super(key: key);
SbbjContent({
@required this.title,
@required this.index,
@required this.hyshlx,
Key key,
}) : super(key: key);
String title;
int index = -1;
String hyshlx;
_SbbjPageState createState() => _SbbjPageState();
}
class _SbbjPageState extends State<SbbjContent> {
Map _mapGetSbbjGetDataText = {
"id": "主键ID",
"bjlx": "设备类型",
"content": "报警内容",
"dwip": "点位IP",
"sbip": "设备IP",
"addtime": "添加时间",
"workflow": "处理状态"
};
Map _mapGetSbbjGetData = {
"id": 1177,
"bjlx": "风扇",
"content": "串口COM1获取风扇异常数据",
"dwip": "172.16.3.1",
"sbip": "192.168.1.10",
"addtime": "2021-02-07 23:56:45",
"workflow": 999
};
List<TextEditingController> _listController = [];
int listLen = 0;
String nums = '';
int _selectedRadio = 0;
void initState() {
// TODO: implement initState
super.initState();
listLen = listSbbjGetList2.length;
getListFlields();
}
//监听登录页面销毁的事件
dispose() {
_controller.dispose();
super.dispose();
}
getListFlields() async {
//获取指定id的sbbj记录数据返回 _mapGetSbbjGetData。由于 sbbj 信息需要进行查核处理,所以要重新读取最新的记录数据
_mapGetSbbjGetData =
await getLedXsxxGetData(id: listSbbjGetList2[widget.index]['id'], theSbgllx: widget.hyshlx);
print('_mapGetSbbjGetData = ${_mapGetSbbjGetData}');
//_mapGetSbbjGetData = listSbbjGetList2[widget.index];
_listController = List.generate(_mapGetSbbjGetData.length, (index) {
String key = _mapGetSbbjGetData.keys.elementAt(index);
String strContent = _mapGetSbbjGetData[key].toString();
//时间戳转换
if (strContent.isNotEmpty && 'addtime' == key) {
strContent = getDate(strContent);
}
//workflow转换
if (strContent.isNotEmpty && 'workflow' == key) {
strContent = strContent == '999' ? '已处理' : '待处理';
}
var controller = TextEditingController(text: strContent);
controller.selection = TextSelection.fromPosition(
TextPosition(affinity: TextAffinity.downstream, offset: '${controller.text}'.length),
);
return controller;
});
getPreBtn_NextBtn();
nums = '${(widget.index + 1).toString()} / $listLen';
setState(() {});
}
Widget getTrail(String key, int index, double widthTrail) {
if (0 == _listController.length) {
return Container(width: widthTrail);
}
//print('key = $key');
if ('avatar' == key) {
imagePath = _listController[index].text;
return getAvatar(width: widthTrail);
} else {
return Container(
alignment: Alignment(-1, 0),
//widthTrail = 400报错360刚能显示300换行260
width: widthTrail,
//解决信息显示不全问题
child: Text(_listController[index].text,
style: TextStyle(fontSize: 16), textAlign: TextAlign.left),
);
}
}
Widget getTrail0(String key, int index, double widthTrail) {
if (0 == _listController.length) {
return Container(width: widthTrail);
}
//print('key = $key');
if ('avatar' == key) {
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: 'content' == key ? true : false,
//解决报警信息显示不全问题,但软键盘会弹出,很难控制键盘弹出问题
//利用控制器初始化文本
onChanged: null,
),
);
}
}
Future<String> doContacts() async {
bFlash = false;
return showDialog(
context: context,
builder: (BuildContext context) {
return customDialogH(
title: "请选择头像修改操作",
content: "头像修改",
index: 0,
);
},
).then((value) {
imagePath = value;
print('Page2_Contacts bFlash = $bFlash');
if (imagePath.isNotEmpty) {
_image = Image.file(File(imagePath), fit: BoxFit.cover);
setState(() {});
}
});
}
//Image.file(this._image);
String imagePath = '';
Image _image;
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);
}
}
return Container(
alignment: Alignment(-1, 0),
width: width,
child: InkWell(
onTap: () async {
doContacts();
},
child: Container(
width: 40,
child: _image,
),
),
);
}
//添加、修改、删除联系人对话框
doContacts2(String key, int index) async {
showDialog(
context: context,
builder: (BuildContext context) {
return CustomDialogJ(
theKey: key,
index: index,
);
},
);
}
static onNullFun() {}
Widget _getListTile(String key, int index, double widthTrail,
{onTapFun = onNullFun, onLongPressFun = onNullFun, size = 16.0}) {
//print('key = $key, index = $index');
return ListTile(
//leading: new Icon(Icons.phone),
title: Text((index + 1).toString() + ". " + '${_mapGetSbbjGetDataText[key]} ',
style: TextStyle(fontSize: 16)),
trailing: getTrail(key, index, widthTrail),
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
enabled: true,
onTap: () async {
// print('第 $index 项被点击了');
// await doContacts2(key, index);
// if ('avatar' == key) {
// print('选择图片或拍照');
// await doContacts();
// }
},
onLongPress: () {},
);
}
TextEditingController _controller = TextEditingController.fromValue(TextEditingValue(
text: '已做简单处理。低级故障,不影响系统运行',
// 保持光标在最后
selection: TextSelection.fromPosition(
TextPosition(affinity: TextAffinity.downstream, offset: '已处理'.length))));
//7、得到核查处理意见组件
Widget getClyj(int index, bool _bCheck) {
if (_bCheck) {
_controller.text = '';
} else {
_controller.text = (0 == _selectedRadio ? '已做简单处理。低级故障,不影响系统运行' : '已核查,属于误报');
}
return ConstrainedBox(
constraints: BoxConstraints(
minWidth: double.infinity, //宽度尽可能大
//minHeight: _listTileHeight, //最小高度
maxHeight: _heigth, //最大高度
),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.baseline,
children: <Widget>[
SizedBox(width: _marginLeft),
Text('处理意见:',
style: TextStyle(
fontSize: _fontSize,
color: _bCheck
? Colors.grey
: 0 == _selectedRadio
? Colors.red
: Colors.green)),
Container(
alignment: Alignment(-1, 0),
height: _heigth,
//widthTrail = 400报错360刚能显示300换行260
width: 240,
child: TextField(
//textAlign: TextAlign.right,
//style: TextStyle(fontSize: _fontSize, color: cpysList[getIndexOfCpysList(colorText: topTabs_map['cpysText_List'][i])].cpysFont),
//style: TextStyle(fontSize: _fontSize, color: cpysList[getIndexOfCpysList(colorText: myCpys)].cpysFont),
style: TextStyle(fontSize: _fontSize),
textAlign: TextAlign.left,
decoration: InputDecoration(
hintText: _bCheck ? '' : '請輸入审核意见',
//border: InputBorder.none, //TextField去掉下划线
//contentPadding: EdgeInsets.only(right: 0),
//contentPadding: EdgeInsets.symmetric(vertical: _textFieldHeight),
contentPadding: EdgeInsets.only(left: 4, right: 4), //这行代码是关键,设置这个之后,居中
//contentPadding: EdgeInsets.zero, //这行代码是关键,设置这个之后,居中
border: OutlineInputBorder(
borderSide: BorderSide(color: Colors.grey[600]),
//borderSide: BorderSide.none,
borderRadius: BorderRadius.circular(3),
),
),
controller: _controller,
maxLines: 1,
minLines: 1,
//maxLengthEnforced: false,
//maxLength: 10,
enabled: !_bCheck,
//利用控制器初始化文本
onChanged: (value) {
_controller.text = value;
},
),
),
],
),
);
}
double _heigth = 30;
double _fontSize = 16;
double _marginLeft = 15;
@override
Widget build(BuildContext context) {
bool bCheck = _mapGetSbbjGetData['workflow'] == 999; //已处理
return Scaffold(
// appBar: AppBar(
// title: Text("设备报警信息详情($nums"),
// centerTitle: true,
// ),
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.center,
children: [
getIconAndTextButton(
iconColor: Colors.white,
iconData: Icons.chevron_left_outlined,
onPress: () {
Navigator.pop(context);
},
),
Expanded(
child: Text("设备报警信息详情($nums",
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)
//使用ListView.separated设置分割线ListView.separated(
//child: ListView.separated( //这种方式不能设置每项高度每页只能有7项
child: ListView.builder(
//这种方式可以通过itemExtent设置每项高度每页可以有9项
//separatorBuilder: (BuildContext context, int index) => index %2 ==0? Divider(color: Colors.green) : Divider(color: Colors.red),//index为偶数创建绿色分割线index为奇数则创建红色分割线
//separatorBuilder: (BuildContext context, int index) => Divider(),
//itemExtent: 57.0, //列表项高度。56越界、57刚好。还是自动计算最好
itemCount: _mapGetSbbjGetData.length,
itemBuilder: (BuildContext context, index) {
String key = _mapGetSbbjGetData.keys.elementAt(index);
return Column(
children: <Widget>[
_getListTile(key, index, 200.0),
Divider(
height: 1.0,
),
],
);
},
),
),
//7、得到核查处理意见组件
Divider(height: 1.0, color: Colors.blue),
SizedBox(height: 15),
getClyj(widget.index, bCheck),
SizedBox(height: 10),
//8、处理结果
Container(
height: _heigth,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
SizedBox(width: _marginLeft),
Text('处理结果:',
style: TextStyle(
fontSize: _fontSize,
color: bCheck
? Colors.grey
: 0 == _selectedRadio
? Colors.red
: Colors.green)),
CustomRadioWidget(
value: 0,
title: "已处理",
fontSize: _fontSize,
width: 120,
groupValue: _selectedRadio,
onChanged: bCheck
? null
: (int value) {
_selectedRadio = value;
//黑烟初审数据审核Radio选项改变广播
//eventBus.fire(HycsDataAuditRadioEvent('黑烟初审数据审核Radio选项已改变', _selectedRadio));
_controller.text = '已做简单处理。低级故障,不影响系统运行';
setState(() {});
print('selectedRadio = ${_selectedRadio.toString()}');
},
),
SizedBox(width: 20),
CustomRadioWidget(
value: 1,
title: "误报",
fontSize: _fontSize,
width: 100,
groupValue: _selectedRadio,
onChanged: bCheck
? null
: (int value) {
_selectedRadio = value;
//黑烟初审数据审核Radio选项改变广播
//eventBus.fire(HycsDataAuditRadioEvent('黑烟初审数据审核Radio选项已改变', _selectedRadio));
_controller.text = '已核查,属于误报';
setState(() {});
print('selectedRadio = ${_selectedRadio.toString()}');
},
),
],
),
),
SizedBox(height: 10),
Divider(height: 1.0, color: Colors.blue),
SizedBox(height: 15),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getBtnSizeX(
text: "处理",
onPressedFun: bCheck
? null
: () async {
int ret = -1;
print('等待处理确认');
await Navigator.of(context)
.push(
PageRouteBuilder(
opaque: false,
pageBuilder: (context, animation, secondaryAnimation) =>
CustomDialogF(title: '处理确认', content: '是否进行设备报警信息核查处理?'),
),
)
.then((value) async {
print('value = $value');
if (value) {
print('用户已确认,开始处理报警信息核查处理!');
// sbglContentFirstAudit 整型返回值更新的结果1表示成功0表示无更新false表示失败
ret = await sbglContentAudit(
sbgllx: widget.hyshlx,
sbglID: _mapGetSbbjGetData['id'],
shuoming: _controller.text,
title: 0 == _selectedRadio ? '已处理' : '误报',
);
if (1 == ret) {
eventBus.fire(SbglDataUpdateEvent(
'${mapHyshlx[widget.hyshlx]['text']}数据已更新'));
print('${mapHyshlx[widget.hyshlx]['text']}结果已成功上传服务器。');
}
} else {
print('用户取消了报警信息核查处理');
}
});
Navigator.pop(context, ret);
}),
//getBtnSizeX(text: "删除", onPressedFun: () async {}),
preBtn,
nextBtn,
],
),
SizedBox(height: 20),
],
),
),
);
}
//解决第一次进入报错问题。因为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,
),
);
getPreBtn_NextBtn() {
preBtn = getBtnSizeX(
text: "上一条",
onPressedFun: null,
);
nextBtn = getBtnSizeX(
text: "下一条",
onPressedFun: null,
);
if (widget.index > 0 && listLen > 0) {
preBtn = getBtnSizeX(
text: "上一条",
onPressedFun: () async {
if (widget.index > 0) {
widget.index--;
getListFlields();
}
},
);
}
if (widget.index < (listLen - 1) && listLen > 0) {
nextBtn = getBtnSizeX(
text: "下一条",
onPressedFun: () async {
if (widget.index < listLen - 1) {
widget.index++;
getListFlields();
}
},
);
}
}
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,
),
);
}
}