hyzp_ybqx-Commit001:代码刚转换好,编译通过

This commit is contained in:
WinUser01
2021-12-09 20:24:36 +08:00
commit 8c74b14e5c
800 changed files with 66912 additions and 0 deletions
+476
View File
@@ -0,0 +1,476 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/screen_util.dart';
import 'package:hyzp_ybqx/components/commonFun.dart';
import '../../../components/customDialogH.dart';
import '../../../components/customDialogJ.dart';
import '../../../components/dioFun.dart';
//import 'package:hyzp_ybqx/widget/player_pro.dart';
import '../../../components/doJSON.dart';
import '../../../components/hyxx_data_handle.dart';
class DwxxContent extends StatefulWidget {
//SbglContent({Key key, this.title, this.mapData}) : super(key: key);
DwxxContent({
@required this.title,
@required this.index,
@required this.hyshlx,
Key key,
}) : super(key: key);
String title;
int index = -1;
String hyshlx;
_SbglPageState createState() => _SbglPageState();
}
class _SbglPageState extends State<DwxxContent> {
Map _mapGetSbglGetDataText = {
"id": "主键ID",
"dwip": "点位IP",
"dwmc": '点位名称',
"dwbh": '点位编号',
"dwinfo": '点位信息',
"dwzb": '点位坐标',
"dwms": '点位描述',
"dwzt": '点位状态',
};
//点位信息数据
Map _mapGetSbglGetData = {
"id": 1,
"dwip": "172.16.3.1",
"dwmc": "江北振兴大道",
"dwbh": 1,
"dwinfo": "江北振兴大道入城方向",
"dwzb": "104.607091|28.807061",
"dwms": "江北振兴大道入城方向,识别孜岩、红坝路入城排放黑烟车辆",
"dwzt": "正常"
};
List<TextEditingController> _listController = [];
int listLen = 0;
String nums = '';
int _selectedRadio = 0;
void initState() {
// TODO: implement initState
super.initState();
listLen = listSbglGetList2.length;
getListFlields();
}
//监听登录页面销毁的事件
dispose() {
_controller.dispose();
getingDwVideo = false;
super.dispose();
}
getListFlields() async {
//获取指定id的sbgl记录数据返回 _mapGetSbglGetData。由于 sbgl 信息需要进行查核处理,所以要重新读取最新的记录数据
// _mapGetSbglGetData =
// await getLedXsxxGetData(id: listSbglGetList2[widget.index]['id'], theSbgllx: widget.hyshlx);
_mapGetSbglGetData = listSbglGetList2[widget.index];
print('_mapGetSbglGetData = ${_mapGetSbglGetData}');
//_mapGetSbglGetData = listSbglGetList2[widget.index];
_listController = List.generate(_mapGetSbglGetData.length, (index) {
String key = _mapGetSbglGetData.keys.elementAt(index);
String strContent = _mapGetSbglGetData[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: 'dwms' == key ? 14 : 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: false,
//利用控制器初始化文本
onChanged: (value) {},
),
);
}
}
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() + ". " + '${_mapGetSbglGetDataText[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))));
double _heigth = 30;
double _fontSize = 16;
double _marginLeft = 15;
@override
Widget build(BuildContext context) {
bool bCheck = _mapGetSbglGetData['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: () {
getingDwVideo = false;
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: _mapGetSbglGetData.length,
itemBuilder: (BuildContext context, index) {
String key = _mapGetSbglGetData.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),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
// getBtnSizeX(
// text: "复制",
// onPressedFun: () {
// // Flutter 复制文本到剪贴板
// Clipboard.setData(
// ClipboardData(text: listSbglGetList2[widget.index].toString()));
// Fluttertoast.showToast(msg: '点位信息已复制到剪贴板', gravity: ToastGravity.CENTER);
// }),
//getBtnSizeX(text: "删除", onPressedFun: () async {}),
getBtnSizeX(
text: "视频",
onPressedFun: () {
//getDwspUrl(index: widget.index, context: context);
getDwspUrlNew(indexRecord: widget.index, context: context);
// getDwspUrl(index: widget.index + 1).then((url) {
// print('index = ${(widget.index + 1).toString()}, url = $url');
// urlnew = url;
//
// //获取视频地址失败
// if (!isVideoUrl(urlnew)) {
// return;
// }
//
// var ret = Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => PlayerPro(
// url: urlnew,
// title:
// '点位视频\n${(widget.index + 1)}、${listDwinfoGetList2[widget.index]['dwmc']}',
// //initVideoSize: Size(704.0, 576.0),
// )));
// print('ret = $ret');
// });
//getDwVideoUrl(index: widget.index);
//getData();
// Flutter 复制文本到剪贴板
// Clipboard.setData(
// ClipboardData(text: listSbglGetList2[widget.index].toString()));
// Fluttertoast.showToast(msg: '点位信息已复制到剪贴板', gravity: ToastGravity.CENTER);
}),
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,
),
);
}
}
+820
View File
@@ -0,0 +1,820 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'dwxx_content.dart';
import '../../../components/dioFun.dart';
import '../../../components/hyxx_data_handle.dart';
import '../../../components/commonFun.dart';
import '../../../services/EventBus.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import '../../../components/doJSON.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
//sbgl是本项目中“设备管理”的统一缩写
class DwxxGetList extends StatefulWidget {
//hyshlx为黑烟审核类型,处理sbgl信息。mapHyshlx[hyshlx]获取为各种类型的设置数据
DwxxGetList({this.hyshlx = 'dwxx', Key key}) : super(key: key);
String hyshlx;
_SbglPageState createState() => _SbglPageState();
}
class _SbglPageState extends State<DwxxGetList> {
//try_setState(); //避免异常报错
try_setState() {
try {
setState(() {});
} catch (e) {
print('setState(() {})异常:${e}');
}
}
@override
void dispose() {
_controller.dispose(); //销毁控制器
super.dispose();
}
@override
void initState() {
hyshlx = widget.hyshlx;
iPage = 0;
listSbglGetList2.clear();
///从接口 mapHyshlx[hyshlx]['api'] 获取第 iPage 页的列表数据,返回 list
getPageList().then((value) {
listSbglGetList2 = value;
//按照用户选择的_selectedValue、_descending对listSbglGetList2进行排序,并延时更新
_listSort();
firstIndex = 0;
lastIndex = 7;
//为播放点位视频读取数据
print('listDwspGetList2 = ${listDwspGetList2}');
listDwspGetList2 = listSbglGetList2;
listDwinfoGetList2 = listSbglGetList2;
print('listDwspGetList2 = ${listDwspGetList2}');
});
// ///从接口 mapHyshlx[theHyshlx]['api'] 获取指定类型第 page 页的列表数据,返回 list
// ///获取点位信息数据
// listDwinfoGetList2.clear();
// getThePageList(theHyshlx: 'dwxx').then((value) {
// listDwinfoGetList2 = value;
// print('listDwinfoGetList2 = \n$listDwinfoGetList2');
// });
//监听设备管理信息数据更新事件
eventBus.on<SbglDataUpdateEvent>().listen((event) async {
print(event.str);
iPage = 0;
listSbglGetList2.clear();
///从接口 mapHyshlx[hyshlx]['api'] 获取第 iPage 页的列表数据,返回 list
getPageList().then((value) {
listSbglGetList2 = value;
//按照用户选择的_selectedValue、_descending对listSbglGetList2进行排序,并延时更新
_listSort();
firstIndex = 0;
lastIndex = 7;
});
});
super.initState();
}
//点位信息数据
//{
// "id": 1,
// "dwip": "172.16.3.1",
// "dwmc": "江北振兴大道",
// "dwbh": 1,
// "dwinfo": "江北振兴大道入城方向",
// "dwzb": "104.607091|28.807061",
// "dwms": "江北振兴大道入城方向,识别孜岩、红坝路入城排放黑烟车辆",
// "dwzt": "正常"
//},
// Widget getDropdownButton() {
// //DropdownMenuItem项目文本list
// List<String> itemList = [
// '主键ID',
// '点位IP',
// '点位名称',
// '点位编号',
// '点位信息',
// '点位坐标',
// '点位描述',
// '点位状态',
// ];
Widget _getListTile(BuildContext context, indexRecord) {
List listCoordinate = listSbglGetList2[indexRecord]["dwzb"].trim().split('|');
return Column(
children: <Widget>[
ListTile(
//leading: new Icon(Icons.phone),
title: Text(
"${listSbglGetList2[indexRecord]['dwbh'].toString()}. ${listSbglGetList2[indexRecord]['dwmc']}",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold)),
subtitle: Text(
'dwIP:${listSbglGetList2[indexRecord]['dwip']},${listSbglGetList2[indexRecord]['dwzt']}',
style: TextStyle(fontSize: 14)),
trailing: Container(
width: 160,
child: Text(
'${listSbglGetList2[indexRecord]['dwms']}' +
', 经纬度:${listCoordinate[0]}、${listCoordinate[1]}',
maxLines: 2,
overflow: TextOverflow.ellipsis,
//textAlign: TextAlign.right,
style: TextStyle(fontSize: 14),
),
),
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
enabled: true,
onTap: () async {
int ret = await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DwxxContent(
title: '设备管理信息详情',
index: indexRecord,
hyshlx: widget.hyshlx,
),
),
);
print('ret = $ret');
},
),
Divider(height: 1.0),
],
);
}
ScrollController _controller = ScrollController(); //ListView控制器
bool isLoading = false; //正在处理下载数据、跳转到首项、跳转到尾项等操作
int firstIndex = 0; //ListView当前显示页面首项0基序号
int lastIndex = 0; //ListView当前显示页面末项0基序号
int itemOnPage = 8; //估计一屏显示的项目数量
Widget getIconButton({IconData iconData, var onPressed, double iconSize = 22}) {
return SizedBox(
height: iconSize,
width: iconSize + 10,
child: IconButton(
padding: EdgeInsets.all(0.0),
icon: Icon(iconData, size: iconSize, color: Colors.white),
onPressed: onPressed,
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
// appBar: AppBar(
// automaticallyImplyLeading: false,
// centerTitle: true,
// //leading: Text(''),
// titleSpacing: 0.0,
// //设置title的左边距
// title: Padding(
// padding: EdgeInsets.only(left: 0, right: 0),
// child: Row(
// //mainAxisAlignment: MainAxisAlignment.start,
// children: [
// getIconAndTextButton(
// iconData: Icons.arrow_back,
// onPress: () {
// Navigator.pop(context);
// },
// ),
// Expanded(
// child: Text("${mapHyshlx[hyshlx]['text']}",
// textAlign: TextAlign.left,
// overflow: TextOverflow.ellipsis,
// style: widget.hyshlx == 'fhycx' ? TextStyle(fontSize: 16) : null),
// ),
// SizedBox(width: 5),
// ],
// ),
// ),
// actions: <Widget>[
// getDropdownButton(),
// SizedBox(width: 10),
// // getIconButton(
// // iconData: Icons.cloud_download,
// // onPressed: !isLoading
// // ? () async {
// // if (isLoading) {
// // return;
// // }
// // isLoading = true;
// // try_setState();
// // //print("I Pressed the Iconbutton");
// // int oldItems = listSbglGetList2.length;
// // for (int i = 0; i < 10; i++) {
// // List list = await getPageList();
// // if (list.length > 0) {
// // listSbglGetList2.addAll(list); //加载累加
// // } else {
// // break;
// // }
// // }
// // Future.delayed(const Duration(milliseconds: 1000), () async {
// // if (listSbglGetList2.length > oldItems) {
// // eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
// // Fluttertoast.showToast(
// // msg: '新增 ${listSbglGetList2.length - oldItems} 条数据下载完成!',
// // toastLength: Toast.LENGTH_SHORT,
// // gravity: ToastGravity.CENTER,
// // );
// //
// // //按照用户选择的_selectedValue、_descending对listSbglGetList2进行排序,并延时更新
// // _listSort();
// // }
// // isLoading = false;
// // try_setState();
// // });
// // }
// // : null,
// // ),
// SizedBox(width: 10),
// getIconButton(
// iconData: Icons.vertical_align_top_outlined,
// onPressed: (!isLoading && (firstIndex > 0)) //未到顶部
// ? () async {
// if (isLoading) {
// return;
// }
// isLoading = true;
// try_setState();
//
// //必须延时执行,否则不能及时完成按钮状态更新
// Timer(
// Duration(milliseconds: 500),
// () {
// _controller.jumpTo(_controller.position.minScrollExtent);
// },
// );
//
// Timer(
// Duration(milliseconds: 1000),
// () {
// // Fluttertoast.showToast(
// // msg: '已经跳转到开头记录!',
// // toastLength: Toast.LENGTH_SHORT,
// // gravity: ToastGravity.CENTER,
// // );
// firstIndex = 0;
// lastIndex = itemOnPage - 1; //0基序号,所以需要减1
// isLoading = false;
// try_setState();
// },
// );
// }
// : null,
// ),
// SizedBox(width: 10),
// getIconButton(
// iconData: Icons.vertical_align_bottom_outlined,
// onPressed: (!isLoading && (lastIndex < listSbglGetList2.length)) //未到尾部
// ? () async {
// if (isLoading) {
// return;
// }
// isLoading = true;
// try_setState();
//
// //必须延时执行,否则不能及时完成按钮状态更新
// Timer(
// Duration(milliseconds: 500),
// () {
// _controller.jumpTo(_controller.position.maxScrollExtent);
// },
// );
//
// Timer(
// Duration(milliseconds: 1000),
// () {
// // Fluttertoast.showToast(
// // msg: '已经跳转到末尾记录!',
// // toastLength: Toast.LENGTH_SHORT,
// // gravity: ToastGravity.CENTER,
// // );
// //0基序号需要减1,再加上底部有一组显示信息,所以需要减2
// firstIndex = listSbglGetList2.length - itemOnPage - 2;
// lastIndex = listSbglGetList2.length;
// isLoading = false;
// try_setState();
// },
// );
// }
// : null,
// ),
// SizedBox(width: 10),
// ],
// ),
appBar: PreferredSize(
preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // here the desired height
child: AppBar(
automaticallyImplyLeading: false,
centerTitle: true,
//leading: Text(''),
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),
// ),
),
),
//1、第1行组件,工具按钮
title: Padding(
padding: EdgeInsets.only(left: 0, right: 0),
child: Row(
//mainAxisAlignment: MainAxisAlignment.start,
children: [
//1.1、返回按钮
getIconAndTextButton(
iconColor: Colors.white,
iconData: Icons.chevron_left_outlined,
onPress: () {
Navigator.pop(context);
},
),
//1.2、title 显示控制
Expanded(
child: Text("${mapHyshlx[hyshlx]['text']}",
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(color: Colors.white, fontSize: 20)),
),
SizedBox(width: 5),
],
),
),
//1.3、尾部工具按钮组
actions: <Widget>[
//getDropdownButton(),
getIconButton(
iconData: Icons.cloud_download,
onPressed: !isLoading
? () async {
if (isLoading) {
return;
}
isLoading = true;
try_setState();
//print("I Pressed the Iconbutton");
int oldItems = listSbglGetList2.length;
for (int i = 0; i < 10; i++) {
List list = await getPageList();
if (list.length > 0) {
listSbglGetList2.addAll(list); //加载累加
} else {
break;
}
}
Future.delayed(const Duration(milliseconds: 1000), () async {
if (listSbglGetList2.length > oldItems) {
eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
Fluttertoast.showToast(
msg: '新增 ${listSbglGetList2.length - oldItems} 条数据下载完成!',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
//按照用户选择的_selectedValue、_descending对listSbglGetList2进行排序,并延时更新
_listSort();
//_controller.jumpTo(1); // _controller.position 能够有效刷新,人眼可察觉的滚动
_controller.jumpTo(0.001); // _controller.position 完美解决有效刷新,而且人眼不可见察觉滚动
//第二次跳转必须延时,否则 _controller.position 不能有效刷新
Future.delayed(Duration(milliseconds: 500), () {
_controller.jumpTo(_controller.position.minScrollExtent);
});
}
isLoading = false;
try_setState();
});
}
: null,
),
SizedBox(width: ScreenUtil().setWidth(32)),
getIconButton(
iconData: Icons.vertical_align_top_outlined,
onPressed: (!isLoading && (firstIndex > 0)) //未到顶部
? () async {
if (isLoading) {
return;
}
isLoading = true;
try_setState();
//必须延时执行,否则不能及时完成按钮状态更新
Timer(
Duration(milliseconds: 500),
() {
_controller.jumpTo(_controller.position.minScrollExtent);
},
);
Timer(
Duration(milliseconds: 1000),
() {
// Fluttertoast.showToast(
// msg: '已经跳转到开头记录!',
// toastLength: Toast.LENGTH_SHORT,
// gravity: ToastGravity.CENTER,
// );
firstIndex = 0;
lastIndex = itemOnPage - 1; //0基序号,所以需要减1
isLoading = false;
try_setState();
},
);
}
: null,
),
SizedBox(width: ScreenUtil().setWidth(32)),
getIconButton(
iconData: Icons.vertical_align_bottom_outlined,
onPressed: (!isLoading && (lastIndex < listSbglGetList2.length)) //未到尾部
? () async {
if (isLoading) {
return;
}
isLoading = true;
try_setState();
//必须延时执行,否则不能及时完成按钮状态更新
Timer(
Duration(milliseconds: 500),
() {
_controller.jumpTo(_controller.position.maxScrollExtent);
},
);
Timer(
Duration(milliseconds: 1000),
() {
// Fluttertoast.showToast(
// msg: '已经跳转到末尾记录!',
// toastLength: Toast.LENGTH_SHORT,
// gravity: ToastGravity.CENTER,
// );
//0基序号需要减1,再加上底部有一组显示信息,所以需要减2
firstIndex = listSbglGetList2.length - itemOnPage - 2;
lastIndex = listSbglGetList2.length;
isLoading = false;
try_setState();
},
);
}
: null,
),
SizedBox(width: ScreenUtil().setWidth(32)),
],
),
),
body: Column(children: [
//2、第2行排序按钮
Container(
height: ScreenUtil().setHeight(142),
decoration: new BoxDecoration(border: new Border.all(color: Colors.red)),
child: Row(
children: [
SizedBox(width: ScreenUtil().setWidth(50)),
Text('排序', style: TextStyle(fontSize: 18)),
Expanded(child: SizedBox.shrink()),
getDropdownButton(),
SizedBox(width: ScreenUtil().setWidth(20)),
],
),
),
(0 == listSbglGetList2.length)
? getMoreWidget(color: Colors.black38)
: Expanded(
child: EasyRefresh(
child: ListView.custom(
//itemExtent: 75.0, //列表项高度
controller: _controller,
cacheExtent: 1.0, // 只有设置了1.0 才能够准确的标记 position 位置
childrenDelegate: MyChildrenDelegate(
_getListTile,
childCount: listSbglGetList2.length,
),
),
onRefresh: () async {
// await Future.delayed(const Duration(seconds: 1), () async {
// iPage = 0;
// //await getWzxxGetList();
// listSbglGetList2 = await getPageList();
// eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
// });
},
onLoad: () async {
if (isLoading) {
return;
}
isLoading = true;
try_setState();
print('iPage = $iPage');
await Future.delayed(const Duration(seconds: 1), () async {
//await getWzxxGetList();
List list = await getPageList();
if (list.length > 0) {
listSbglGetList2.addAll(list); //加载累加
eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
}
isLoading = false;
try_setState();
});
},
header: getHeader(),
footer: getFooter(),
),
)
]),
);
}
//DropdownButton需要设置初始值的时候,初始值必须是显示列表里面的值,否则会导致弹出框异常。
// 比如说:你的DropdownButton的items属性使用的是list这个列表里面的值,那么你的初始值应该在list[index]里面取,要不就会报错。
//
// There should be exactly one item with [DropdownButton]'s value: 0.0.
// Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
// 'package:flutter/src/material/dropdown.dart':
// Failed assertion: line 834 pos 15: 'items == null || items.isEmpty || value == null ||
// items.where((DropdownMenuItem<T> item) {
// return item.value == value;
// }).length == 1'
String _selectedValue = '点位编号';
bool _descending = false; //默认升序排列
Widget _getImage(String _image) {
return Container(
margin: EdgeInsets.only(),
height: ScreenUtil().setWidth(48),
width: ScreenUtil().setWidth(48),
//child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight),
child: Image.asset(_image,
fit: BoxFit.cover, color: isLoading ? Theme.of(context).disabledColor : null));
}
//按照用户选择的_selectedValue、_descending对listSbglGetList2进行排序,并延时更新
Future _listSort({bool bShowToast = false}) {
if (!isLoading && listSbglGetList2.length > 0) {
isLoading = true;
try_setState();
switch (_selectedValue) {
default:
if (_descending) {
//按_selectedValue排序,降序
listSbglGetList2.sort((a, b) =>
(b[mapWzxxDataText[_selectedValue]]).compareTo(a[mapWzxxDataText[_selectedValue]]));
} else {
//按_selectedValue排序,升序
listSbglGetList2.sort((a, b) =>
(a[mapWzxxDataText[_selectedValue]]).compareTo(b[mapWzxxDataText[_selectedValue]]));
}
break;
}
Future.delayed(const Duration(milliseconds: 1000), () {
if (bShowToast) {
Fluttertoast.showToast(
msg: '按“${_selectedValue}”${_descending ? '降序' : '升序'}排列完成!',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
isLoading = false;
try_setState(); //避免如下异常报错
});
}
}
Widget getDropdownButtonItemText(String item) {
return Padding(
padding: EdgeInsets.only(bottom: ScreenUtil().setHeight(3)),
child: Row(
//crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
alignment: Alignment(0, 0),
padding: EdgeInsets.only(top: ScreenUtil().setHeight(10)),
child: item == _selectedValue
? _descending
? _getImage('assets/images/descending.png')
: _getImage('assets/images/ascending.png')
// ? Icon(Icons.arrow_downward_outlined, size: 20)
// : Icon(Icons.arrow_upward_outlined, size: 20)
: SizedBox(),
),
SizedBox(
width: ScreenUtil().setWidth(10),
),
Container(
//alignment: Alignment(0, -1),
child: Text(item,
style: TextStyle(
fontSize: 18,
color: isLoading
? Theme.of(context).disabledColor
: item == _selectedValue
? Colors.blue
: null)),
// style: isLoading
// ? TextStyle(color: Theme.of(context).disabledColor)
// : (item == _selectedValue ? TextStyle(color: Colors.blue) : null)),
),
],
),
);
}
//点位信息数据
//{
// "id": 1,
// "dwip": "172.16.3.1",
// "dwmc": "江北振兴大道",
// "dwbh": 1,
// "dwinfo": "江北振兴大道入城方向",
// "dwzb": "104.607091|28.807061",
// "dwms": "江北振兴大道入城方向,识别孜岩、红坝路入城排放黑烟车辆",
// "dwzt": "正常"
//},
Widget getDropdownButton() {
//DropdownMenuItem项目文本list
List<String> itemList = [
'主键ID',
'点位IP',
'点位名称',
'点位编号',
'点位信息',
'点位坐标',
'点位描述',
'点位状态',
];
//添加按'推送状态'排序
if (hyshlx != 'dwxx') {
// itemList.removeLast();
// itemList.addAll(['推送状态', '主键ID']);
}
//获取DropdownMenuItem项目组件list
List<DropdownMenuItem<String>> _dropDownMenuItems =
itemList.map<DropdownMenuItem<String>>((String item) {
return DropdownMenuItem<String>(
value: item,
child: getDropdownButtonItemText(item),
);
}).toList();
return Padding(
padding: EdgeInsets.only(top: 0, bottom: 0),
child: Container(
alignment: Alignment(0, 0),
width: 135,
margin: EdgeInsets.only(bottom: 0),
padding: EdgeInsets.only(left: 0, bottom: 0),
// decoration: BoxDecoration(
// border: Border.all(width: 0),
// //边框圆角设置
// borderRadius:
// BorderRadius.vertical(top: Radius.elliptical(2, 2), bottom: Radius.elliptical(2, 2)),
// ),
//DropdownButton默认有一条下划线,DropdownButtonHideUnderline去除下划线
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
iconSize: ScreenUtil().setHeight(100),
//itemHeight: ScreenUtil().setHeight(372),
isDense: true,
value: _selectedValue,
items: _dropDownMenuItems,
onChanged: (String selectedValue) {
if (isLoading) {
return;
}
if (_selectedValue == selectedValue) {
_descending = !_descending;
} else {
_descending = true;
}
_selectedValue = selectedValue;
print('_selectedValue = $_selectedValue');
//按抓拍次数排序,降序
// listSbglGetList2.sort((a, b) => (b["yjxx_id"].split(',').length.toString())
// .compareTo(a["yjxx_id"].split(',').length.toString()));
//按照用户选择的_selectedValue、_descending对listSbglGetList2进行排序,并延时更新
_listSort();
},
),
),
),
);
}
}
//https://blog.csdn.net/u014803467/article/details/103750018
//Flutter 使用SliverChildBuilderDelegate获取ListView的第一个和最后一个可见Item序号
// 秋名山交警X 2019-12-28 23:52:52
class _SaltedValueKey extends ValueKey<Key> {
const _SaltedValueKey(Key key)
: assert(key != null),
super(key);
}
class MyChildrenDelegate extends SliverChildBuilderDelegate {
MyChildrenDelegate(
Widget Function(BuildContext, int) builder, {
int childCount,
bool addAutomaticKeepAlive = true,
bool addRepaintBoundaries = true,
}) : super(builder,
childCount: childCount,
addAutomaticKeepAlives: addAutomaticKeepAlive,
addRepaintBoundaries: addRepaintBoundaries);
// Return a Widget for the given Exception
Widget _createErrorWidget(dynamic exception, StackTrace stackTrace) {
final FlutterErrorDetails details = FlutterErrorDetails(
exception: exception,
stack: stackTrace,
library: 'widgets library',
context: ErrorDescription('building'),
);
FlutterError.reportError(details);
return ErrorWidget.builder(details);
}
@override
Widget build(BuildContext context, int index) {
assert(builder != null);
if (index < 0 || (childCount != null && index >= childCount)) return null;
Widget child;
try {
child = builder(context, index);
} catch (exception, stackTrace) {
child = _createErrorWidget(exception, stackTrace);
}
if (child == null) return null;
final Key key = child.key != null ? _SaltedValueKey(child.key) : null;
if (addRepaintBoundaries) child = RepaintBoundary(child: child);
if (addSemanticIndexes) {
final int semanticIndex = semanticIndexCallback(child, index);
if (semanticIndex != null)
child = IndexedSemantics(index: semanticIndex + semanticIndexOffset, child: child);
}
if (addAutomaticKeepAlives) child = AutomaticKeepAlive(child: child);
return KeyedSubtree(child: child, key: key);
}
@override
void didFinishLayout(int _firstIndex, int _lastIndex) {
// TODO: implement didFinishLayout
super.didFinishLayout(_firstIndex, _lastIndex);
}
///监听 在可见的列表中 显示的第一个位置和最后一个位置
@override
double estimateMaxScrollOffset(
int _firstIndex, int _lastIndex, double _leadingScrollOffset, double _trailingScrollOffset) {
//违章信息Listview滚动广播
eventBus.fire(WzxxDataScrollEvent(_firstIndex, _lastIndex));
return super.estimateMaxScrollOffset(
_firstIndex, _lastIndex, _leadingScrollOffset, _trailingScrollOffset);
}
}