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_ybqx03_junlian/components/commonFun.dart'; import 'package:hyzp_ybqx03_junlian/components/customDialogF.dart'; import 'package:hyzp_ybqx03_junlian/services/EventBus.dart'; import 'package:hyzp_ybqx03_junlian/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 { 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 _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 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: [ 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: [ 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: [ _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: [ 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: [ 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, ), ); } }