import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hyzp_ybqx/components/commonFun.dart';
import 'package:hyzp_ybqx/pages/Works/HYSH/tsjj_content_new.dart';
import 'package:hyzp_ybqx/services/EventBus.dart';

import '../../../components/commonFun.dart';
import '../../../components/dioFun.dart';
import '../../../components/doJSON.dart';
import '../../../components/hyxx_data_handle.dart';
import '../../../services/EventBus.dart';
import 'fhycx_content_new.dart';
import 'hysh_content_new.dart';

///flutter中如何获取子类Widget并调用它的方法    萤火虫离别的礼物    2019.08.07 15:46:08   https://www.jianshu.com/p/b16f70dd692c
//在flutter中开发中，会发现当子类Widget是StatefulWidget类型的时候，想要获取它的State并调用State中的方法，感觉无从下手。
// 不像是在iOS中，可以直接调用一个类的公开的方法，flutter可以通过key来实现。每个Widget都是唯一标识的。此唯一标识对应于可选的Key参数。
// 如果省略，Flutter将为您生成一个。key主要分为四种：GlobalKey，LocalKey，UniqueKey或ObjectKey，GlobalKey确保key是在整个应用程序唯一的，
// 这次我们就要使用它来实现。我们需要给子Widget定义一个唯一的GlobalKey，然后根据这个key获取到这个Widget，进行相关的操作，下面是相关的代码：
//这里就是关键的代码，定义一个key
//GlobalKey<MyFijkPanelWidgetBuilderState> _myFijkPanelWidgetBuilderStateKey = new GlobalKey<MyFijkPanelWidgetBuilderState>();

//Hycs是本项目中“黑烟初审”的统一缩写
//Hysh是本项目中“黑烟审核（包括：黑烟初审、黑烟复审、推送交警）”的统一缩写
class HyshGetListNew extends StatefulWidget {
  //hyshlx为黑烟审核类型，处理'hycs'黑烟初审、'hyfh'黑烟复审。mapHyshlx[hyshlx]获取为各种类型的设置数据
  HyshGetListNew({this.hyshlx = 'hycs', this.title, Key key}) : super(key: key);
  String hyshlx;
  String title = '';

  _HyshPageState createState() => _HyshPageState();
}

class _HyshPageState extends State<HyshGetListNew> {
  //try_setState();   //避免如下异常报错
  try_setState() {
    try {
      setState(() {});
    } catch (e) {
      print('setState(() {})异常：${e}');
    }
  }

  @override
  void dispose() {
    _controller.dispose(); //销毁控制器
    super.dispose();
  }

  @override
  void initState() {
    hyshlx = widget.hyshlx;

    ///从接口 mapHyshlx[theHyshlx]['api'] 获取指定类型第 page 页的列表数据，返回 list
    ///获取点位信息数据
    listDwinfoGetList2.clear();
    getThePageList(theHyshlx: 'dwxx').then((value) {
      listDwinfoGetList2 = value;
      print('listDwinfoGetList2 = \n$listDwinfoGetList2');
    });

    //getHycsGetList();
    iPage = 0;
    listHycsGetList2.clear();
    //listTsjjTszt.clear(); //与listHycsGetList2对应
    //getAllItems(1000);

    //从接口mapHyshlx[hyshlx]['api']获取数据，通过list返回。再添加到listHycsGetList2中
    getPageList(perpage: 100).then((value) {
      listHycsGetList2 = value;
      if (listHycsGetList2.isEmpty) {
        _empty = _emptyInfo;
        try_setState();
        return;
      }
      //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
      _listSort();
      firstIndex = 0;
      lastIndex = 7;
    });

    //监听违章信息数据更新事件
    eventBus.on<HycsDataUpdateEvent>().listen((event) async {
      print(event.str);
      //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
      iPage = 0;
      listHycsGetList2 = await getPageList(perpage: 100);
      if (listHycsGetList2.isEmpty) {
        _empty = _emptyInfo;
        try_setState();
        return;
      }

      _listSort();
    });

    //监听违章信息推送状态更新事件
    // eventBus.on<HycsTsztUpdateEvent>().listen((event) async {
    //   print(event.str);
    //   try_setState();
    //   //_listSort();
    // });

    //监听违章信息数据审核事件
    eventBus.on<WzxxDataAuditEvent>().listen((event) async {
      print('HycsGetList: ' + event.str);
      //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
      if (listHycsGetList2.isEmpty) {
        _empty = _emptyInfo;
        try_setState();
        return;
      }
      _listSort();
    });

    //监听违章信息Listview滚动事件
    eventBus.on<WzxxDataScrollEvent>().listen((event) async {
      firstIndex = event.firstIndex;
      lastIndex = event.lastIndex;
      try_setState();
    });

    super.initState();
  }

  // 车牌号码
  // 车牌颜色
  // 车辆类型
  // 林格曼黑度
  // 抓拍次数
  // 首次抓拍时间
  // 首次抓拍地点
  int today = 0;
  int sum = 0;
  String _emptyInfo = '\n当前没有待审记录';
  String _empty = '';

  Widget _getListTile(BuildContext context, indexRecord) {
    // print('indexRecord = ${indexRecord}');
    // print('listTsjjTszt = ${listTsjjTszt}');
    // Color markColor;
    // FontWeight markBold;
    // print('EndDayOfYesterDayStamp = ${getEndDayOfYesterDayStamp()}');
    // print('zpsj = ${listHycsGetList2[indexRecord]['zpsj']}');
    // if (listHycsGetList2[indexRecord]['zpsj'] > getEndDayOfYesterDayStamp()) {
    //   Color markColor = Colors.lightBlue;
    //   FontWeight markBold = FontWeight.bold;
    //   print('markColor = $markColor, markBold = $markBold');
    // }

    return Column(
      children: <Widget>[
        ListTile(
          //leading: new Icon(Icons.phone),
          title: Text(
              "${(indexRecord + 1).toString()}. " +
                  listHycsGetList2[indexRecord]['plate_id'] +
                  '(${listHycsGetList2[indexRecord]['plate_color']})，${listHycsGetList2[indexRecord]['clfl']}',
              style: TextStyle(fontSize: 14)),
          subtitle: Text(getDate(listHycsGetList2[indexRecord]['zpsj']),
              style: TextStyle(
                  fontSize: 14,
                  color: listHycsGetList2[indexRecord]['zpsj'] > getEndDayOfYesterdayStamp()
                      ? Colors.lightBlue
                      : null,
                  fontWeight: listHycsGetList2[indexRecord]['zpsj'] > getEndDayOfYesterdayStamp()
                      ? FontWeight.bold
                      : null)),
          trailing: Container(
            width: 110,
            child: Text(
              (hyshlx != 'hycs' ? '${mapTsztText[listHycsGetList2[indexRecord]['tszt']]}，' : '') +
                  '黑度 ${listHycsGetList2[indexRecord]['lgmzs'].toString()}，' +
                  // listHycsGetList2[indexRecord]['dwms'] +
                  getDwmc(listHycsGetList2[indexRecord]['dwip']) +
                  '。 抓拍 ${listHycsGetList2[indexRecord]['yjxx_id'].split(',').length.toString()} 次',
              //+ '，id：${listHycsGetList2[indexRecord]['id'].toString()}',
              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 = -1;
            if (hyshlx == 'fhycx') {
              ret = await Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (context) => FhycxContentNew(
                      hyshlx: widget.hyshlx,
                      title: '非黑烟车',
                      indexRecord: indexRecord,
                      id: listHycsGetList2[indexRecord]['id']),
                ),
              );
              print('hyshContentFirstAudit整型返回值：-1 表示出现异常，其余为更新结果，1表示成功，0表示无更新，false表示失败');
            } else if (hyshlx == 'tsjj') {
              ret = await Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (context) => TsjjContentNew(
                      hyshlx: widget.hyshlx,
                      title: '推送交警详情',
                      indexRecord: indexRecord,
                      id: listHycsGetList2[indexRecord]['id']),
                ),
              );
              print('hyshContentFirstAudit整型返回值：-1 表示出现异常，其余为更新结果，1表示成功，0表示无更新，false表示失败');
            } else {
              ret = await Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (context) => HyshContentNew(
                      hyshlx: widget.hyshlx,
                      title: '违章审核详情',
                      indexRecord: indexRecord,
                      id: listHycsGetList2[indexRecord]['id']),
                ),
              );
              print('hyshContentFirstAudit整型返回值：-1 表示出现异常，其余为更新结果，1表示成功，0表示无更新，false表示失败');

              if (1 == ret) {
                iPage = 0;
                listHycsGetList2 = await getPageList(perpage: 100);
                eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
                print('${mapHyshlx[hyshlx]['text']}结果已成功上传服务器。');
                // Fluttertoast.showToast(
                //     msg: '${mapHyshlx[hyshlx]['text']}结果已成功上传服务器。', gravity: ToastGravity.CENTER);
              } else {
                // Fluttertoast.showToast(
                //     msg: '违章信息${mapHyshlx[hyshlx]['text']}结果上传失败。', gravity: ToastGravity.CENTER);
              }
            }
            print('ret = $ret');
          },
          // onLongPress: () async {
          //   bFlash = false;
          //   Navigator.of(context)
          //       .push(
          //     PageRouteBuilder(
          //       opaque: false,
          //       pageBuilder: (context, animation, secondaryAnimation) =>
          //           customDialogG(title: '收到的消息', index: indexRecord),
          //     ),
          //   )
          //       .then((value) {
          //     print('Page2_Contacts bFlash = $bFlash');
          //     if (bFlash) {
          //       try_setState(); //避免如下异常报错
          //     }
          //   });
          // },
        ),
        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: 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: Column(
                    children: [
                      Text("${mapHyshlx[hyshlx]['text']}",
                          textAlign: TextAlign.left,
                          overflow: TextOverflow.ellipsis,
                          style: TextStyle(color: Colors.white, fontSize: 20)),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Text('${today.toString()}',
                              style: TextStyle(
                                  fontSize: 16,
                                  color: Colors.redAccent,
                                  fontWeight: FontWeight.w900)),
                          Text(' / ${sum.toString()}',
                              style: TextStyle(fontSize: 16, color: Colors.white))
                        ],
                      )
                    ],
                  ),
                ),
                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 = listHycsGetList2.length;
                      for (int i = 0; i < 10; i++) {
                        List list = await getPageList(perpage: 100);
                        if (list.length > 0) {
                          listHycsGetList2.addAll(list); //加载累加
                        } else {
                          break;
                        }
                      }
                      Future.delayed(const Duration(milliseconds: 1000), () async {
                        if (listHycsGetList2.length > oldItems) {
                          eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
                          Fluttertoast.showToast(
                            msg: '新增 ${listHycsGetList2.length - oldItems} 条数据下载完成！',
                            toastLength: Toast.LENGTH_SHORT,
                            gravity: ToastGravity.CENTER,
                          );
                          // _selectedValue = '抓拍次数';
                          // _descending = true;
                          //getDropdownButton();

                          //这种方式刷新后，按钮状态无法正常恢复
                          //listSort().then((value) {
                          //  //_controller.jumpTo(1);  // _controller.position 能够有效刷新，人眼可察觉的滚动
                          //  _controller.jumpTo(0.001); // _controller.position 能够有效刷新，人眼不可见察觉的滚动
                          //  //第二次跳转必须延时，否则 _controller.position 不能有效刷新
                          //  Future.delayed(Duration(milliseconds: 500), () {
                          //    _controller.jumpTo(_controller.position.minScrollExtent);
                          //  });
                          //});

                          //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
                          _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 < listHycsGetList2.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 = listHycsGetList2.length - itemOnPage - 2;
                          lastIndex = listHycsGetList2.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)),
              ],
            ),
          ),
          //3、第3行组件，数据显示区域
          _empty.isNotEmpty
              ? Text(_empty, style: TextStyle(fontSize: 20))
              : (0 == listHycsGetList2.length)
                  ? getMoreWidget(color: Colors.black38)
                  : Expanded(
                      child: EasyRefresh(
                      child: ListView.custom(
                        controller: _controller,
                        cacheExtent: 1.0, // 只有设置了1.0 才能够准确的标记position 位置
                        childrenDelegate: MyChildrenDelegate(
                          // (BuildContext context, int index) {
                          //   return new Dismissible(
                          //     key: new Key(listHycsGetList2[index]),
                          //     onDismissed: (direction) {
                          //       //被移除回掉
                          //       listHycsGetList2.removeAt(index);
                          //       var item = listHycsGetList2[index];
                          //       Scaffold.of(context).showSnackBar(new SnackBar(content: new Text("$item")));
                          //     },
                          //     child: new ListTile(
                          //       title: new Text(listHycsGetList2[index]),
                          //     ),
                          //   );
                          // },
                          _getListTile,
                          childCount: listHycsGetList2.length,
                        ),
                      ),

                      // child: ListView.builder(
                      //   controller: _controller,
                      //   itemCount: listHycsGetList2.length,
                      //   itemBuilder: _getListTile,
                      // ),
                      onRefresh: () async {
                        // await Future.delayed(const Duration(seconds: 1), () async {
                        //   iPage = 0;
                        //   //await getWzxxGetList();
                        //   listHycsGetList2 = 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(perpage: 100);
                          if (list.length > 0) {
                            listHycsGetList2.addAll(list); //加载累加
                            eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
                          }
                          isLoading = false;
                          try_setState();
                        });
                      },
                      header: getHeader(),
                      footer: getFooter(),
                    ))
        ],
      ),
    );
  }

  // Widget getDropdownButton() {
  //   return DropdownButton<String>(
  //     value: _selectedValue,
  //     onChanged: (String newValue) {
  //       setState(() {
  //         _selectedValue = newValue;
  //       });
  //     },
  //     items: <String>['One', 'Two', 'Free', 'Four'].map<DropdownMenuItem<String>>((String value) {
  //       return DropdownMenuItem<String>(
  //         value: value,
  //         child: Text(value),
  //       );
  //     }).toList(),
  //   );
  // }

  //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 = true;

  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));
  }

  //统计今日抓拍次数 today
  Future getToday() async {
    today = 0;
    int _yesterDayStamp = getEndDayOfYesterdayStamp();
    for (var item in listHycsGetList2) {
      //统计今日抓拍次数
      if (item['zpsj'] > _yesterDayStamp) {
        today++;
      }
    }
  }

  //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
  Future _listSort({bool bShowToast = false}) {
    if (!isLoading && listHycsGetList2.length > 0) {
      //dart中,对List结构数据进行排序，注意 sort方法 会直接改变原List数组结构
      //myList.sort((a, b) => (b.age).compareTo(a.age)); /// sort List<Map<String,dynamic>>
      // "yjxx_id": "654",

      //按抓拍次数排序，升序
      //listHycsGetList2.sort((a, b) => (a["yjxx_id"].slipt(',')).compareTo(b["yjxx_id"]).slipt(','));
      //按抓拍次数排序，降序
      //listHycsGetList2.sort((a, b) => (b["yjxx_id"].slipt(',')).compareTo(a["yjxx_id"]).slipt(','));

      //listHycsGetList2.sort((a, b) => (a["lgmzs"]).compareTo(b["lgmzs"]));    //按lgmzs排序，升序
      //listHycsGetList2.sort((a, b) => (b["lgmzs"]).compareTo(a["lgmzs"]));    //按lgmzs排序，降序

      //按抓拍次数排序，升序
      // listHycsGetList2.sort((a, b) => (a["yjxx_id"].split(',').length.toString())
      //     .compareTo(b["yjxx_id"].split(',').length.toString()));
      //按抓拍次数排序，降序
      // listHycsGetList2.sort((a, b) => (b["yjxx_id"].split(',').length.toString())
      //     .compareTo(a["yjxx_id"].split(',').length.toString()));

      isLoading = true;
      try_setState();
      sum = listHycsGetList2.length; //当前记录总数
      getToday(); //统计今日抓拍次数 today

      switch (_selectedValue) {
        case '抓拍次数':
          if (_descending) {
            //按抓拍次数排序，降序
            listHycsGetList2.sort((a, b) =>
                (b[mapWzxxDataText[_selectedValue]].split(',').length.toString())
                    .compareTo(a[mapWzxxDataText[_selectedValue]].split(',').length.toString()));
          } else {
            //按抓拍次数排序，升序
            listHycsGetList2.sort((a, b) =>
                (a[mapWzxxDataText[_selectedValue]].split(',').length.toString())
                    .compareTo(b[mapWzxxDataText[_selectedValue]].split(',').length.toString()));
          }
          break;
        case '推送状态':
          if (_descending) {
            // Unhandled Exception: NoSuchMethodError: The method 'compareTo' was called on null.
            //按_selectedValue排序，降序
            listHycsGetList2.sort((a, b) =>
                (b[mapWzxxDataText[_selectedValue]]).compareTo(a[mapWzxxDataText[_selectedValue]]));
          } else {
            //按_selectedValue排序，升序
            listHycsGetList2.sort((a, b) =>
                (a[mapWzxxDataText[_selectedValue]]).compareTo(b[mapWzxxDataText[_selectedValue]]));
          }
          break;
        default:
          if (_descending) {
            //按_selectedValue排序，降序
            listHycsGetList2.sort((a, b) =>
                (b[mapWzxxDataText[_selectedValue]]).compareTo(a[mapWzxxDataText[_selectedValue]]));
          } else {
            //按_selectedValue排序，升序
            listHycsGetList2.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 getDropdownButton() {
    //DropdownMenuItem项目文本list
    List<String> itemList = [
      '抓拍次数',
      '林格曼黑度',
      '抓拍时间',
      '抓拍地点',
      '车牌颜色',
      //'车牌号码',
      '车辆类型',
      //'主键ID',
    ];

    //添加按'推送状态'排序
    if (hyshlx != 'hycs') {
      // itemList.removeLast();
      // itemList.addAll(['推送状态', '主键ID']);
      itemList.addAll(['推送状态']);
    }

    //获取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: 145,
        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');

              //按抓拍次数排序，降序
              // listHycsGetList2.sort((a, b) => (b["yjxx_id"].split(',').length.toString())
              //     .compareTo(a["yjxx_id"].split(',').length.toString()));

              //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
              _listSort();
            },
          ),
        ),
      ),
    );

    //没有padding: ，会报错Failed assertion: line 1644 pos 15: 'padding != null': is
    // return Padding(
    //   // child: OutlineButton(
    //   //   borderSide: BorderSide(width: 4.0),
    //   //   child: Text('Hi'),
    //   //   onPressed: () {},
    //   //   padding: EdgeInsets.all(0),
    //   // ),
    // );

    // return SizedBox(
    //   height: 30,
    //   width: 30,
    //   child: Container(
    //     color: Colors.black45,
    //   ),
    // );

    // return Container(
    //   decoration: new BoxDecoration(
    //       border: new Border.all(color: Color(0xFFFF0000), width: 0.5),
    //       color: Color(0xFF9E9E9E),
    //       borderRadius: new BorderRadius.circular((20.0))),
    //   height: 28.0,
    //   width: 130,
    //   alignment: Alignment.center,
    //   child: Text('sdsd'),
    // );

    //   ConstrainedBox(
    //   constraints: BoxConstraints(
    //     //minWidth: double.infinity, //宽度尽可能大
    //     //minHeight: _listTileHeight, //最小高度
    //     maxHeight: 20, //最大高度
    //   ),
    // );
  }

  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)),
          ),
        ],
      ),
    );
  }

// Widget getDropdownButtonItemText(String item) {
//   return Row(
//     //crossAxisAlignment: CrossAxisAlignment.center,
//     children: [
//       Container(
//         alignment: Alignment(0, 0.28),
//         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: 3,
//       ),
//       Container(
//         //alignment: Alignment(0, -1),
//         child: Text(item,
//             style: isLoading
//                 ? TextStyle(color: Theme.of(context).disabledColor)
//                 : (item == _selectedValue ? TextStyle(color: Colors.blue) : null)),
//       ),
//     ],
//   );
// }
//
// Widget getDropdownButton() {
//   //DropdownMenuItem项目文本list
//   List<String> itemList = [
//     '抓拍次数',
//     '林格曼黑度',
//     '抓拍时间',
//     '抓拍地点',
//     '车牌颜色',
//     '车牌号码',
//     '车辆类型',
//     '主键ID',
//   ];
//
//   //添加按'推送状态'排序
//   if (hyshlx != 'hycs') {
//     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: 10, bottom: 10),
//     child: Container(
//       alignment: Alignment(0.7, 0),
//       width: 125,
//       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>(
//           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');
//
//             //按抓拍次数排序，降序
//             // listHycsGetList2.sort((a, b) => (b["yjxx_id"].split(',').length.toString())
//             //     .compareTo(a["yjxx_id"].split(',').length.toString()));
//
//             //按照用户选择的_selectedValue、_descending对listHycsGetList2进行排序，并延时更新
//             _listSort();
//           },
//         ),
//       ),
//     ),
//   );
//
//   //没有padding: ，会报错Failed assertion: line 1644 pos 15: 'padding != null': is
//   // return Padding(
//   //   // child: OutlineButton(
//   //   //   borderSide: BorderSide(width: 4.0),
//   //   //   child: Text('Hi'),
//   //   //   onPressed: () {},
//   //   //   padding: EdgeInsets.all(0),
//   //   // ),
//   // );
//
//   // return SizedBox(
//   //   height: 30,
//   //   width: 30,
//   //   child: Container(
//   //     color: Colors.black45,
//   //   ),
//   // );
//
//   // return Container(
//   //   decoration: new BoxDecoration(
//   //       border: new Border.all(color: Color(0xFFFF0000), width: 0.5),
//   //       color: Color(0xFF9E9E9E),
//   //       borderRadius: new BorderRadius.circular((20.0))),
//   //   height: 28.0,
//   //   width: 130,
//   //   alignment: Alignment.center,
//   //   child: Text('sdsd'),
//   // );
//
//   //   ConstrainedBox(
//   //   constraints: BoxConstraints(
//   //     //minWidth: double.infinity, //宽度尽可能大
//   //     //minHeight: _listTileHeight, //最小高度
//   //     maxHeight: 20, //最大高度
//   //   ),
//   // );
// }
}

//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) {
    // print(
    //     'firstIndex = $_firstIndex, lastIndex = $_lastIndex, leadingScrollOffset = $_leadingScrollOffset,'
    //     'trailingScrollOffset : $_trailingScrollOffset  ');

    //违章信息Listview滚动广播
    eventBus.fire(WzxxDataScrollEvent(_firstIndex, _lastIndex));

    return super.estimateMaxScrollOffset(
        _firstIndex, _lastIndex, _leadingScrollOffset, _trailingScrollOffset);
  }
}
