import 'dart:async';

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';

import 'sbbj_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';

//sbbj是本项目中“设备报警”的统一缩写
class SbbjGetList extends StatefulWidget {
  //hyshlx为黑烟审核类型，处理sbbj信息。mapHyshlx[hyshlx]获取为各种类型的设置数据
  SbbjGetList({this.hyshlx = 'sbbj', Key key}) : super(key: key);
  String hyshlx;

  _SbbjPageState createState() => _SbbjPageState();
}

class _SbbjPageState extends State<SbbjGetList> {
  //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;
    listSbbjGetList2.clear();

    ///从接口 mapHyshlx[hyshlx]['api'] 获取第 iPage 页的列表数据，返回 list
    getPageList().then((value) {
      listSbbjGetList2 = value;
      //按照用户选择的_selectedValue、_descending对listSbbjGetList2进行排序，并延时更新
      _listSort();
      firstIndex = 0;
      lastIndex = 7;
    });

    ///从接口 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;
      listSbbjGetList2.clear();

      ///从接口 mapHyshlx[hyshlx]['api'] 获取第 iPage 页的列表数据，返回 list
      getPageList().then((value) {
        listSbbjGetList2 = value;
        //按照用户选择的_selectedValue、_descending对listSbbjGetList2进行排序，并延时更新
        _listSort();
        firstIndex = 0;
        lastIndex = 7;
      });
    });

    super.initState();
  }

  // List listSbbjGetList2 = [
  //   {
  //     "id": 1196,
  //     "bjlx": "风扇",
  //     "content": "串口COM1获取风扇异常数据",
  //     "dwip": "172.16.3.12",
  //     "sbip": "192.168.1.10",
  //     "addtime": "2021-02-16 09:50:30",
  //     "workflow": 999
  //   },
  // ];

  Widget _getListTile(BuildContext context, indexRecord) {
    return Column(
      children: <Widget>[
        ListTile(
          //leading: new Icon(Icons.phone),
          title: Text(
              "${(indexRecord + 1).toString()}. " +
                  getDate(listSbbjGetList2[indexRecord]['addtime']) +
                  '，',
              style: TextStyle(fontSize: 14)),
          subtitle: Text(
              getDwmc(listSbbjGetList2[indexRecord]['dwip']) +
                  '，' +
                  (listSbbjGetList2[indexRecord]['workflow'] == 999 ? '已处理' : '待处理'),
              style: TextStyle(fontSize: 14)),
          trailing: Container(
            width: 160,
            child: Text(
              '${listSbbjGetList2[indexRecord]['bjlx']}， 报警：${listSbbjGetList2[indexRecord]['content']}' +
                  '， 设备IP：${listSbbjGetList2[indexRecord]['sbip']}' +
                  'ID：${listSbbjGetList2[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 = await Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => SbbjContent(
                  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: 14) : 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 = listSbbjGetList2.length;
      //               for (int i = 0; i < 10; i++) {
      //                 List list = await getPageList();
      //                 if (list.length > 0) {
      //                   listSbbjGetList2.addAll(list); //加载累加
      //                 } else {
      //                   break;
      //                 }
      //               }
      //               Future.delayed(const Duration(milliseconds: 1000), () async {
      //                 if (listSbbjGetList2.length > oldItems) {
      //                   eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
      //                   Fluttertoast.showToast(
      //                     msg: '新增 ${listSbbjGetList2.length - oldItems} 条数据下载完成！',
      //                     toastLength: Toast.LENGTH_SHORT,
      //                     gravity: ToastGravity.CENTER,
      //                   );
      //
      //                   //按照用户选择的_selectedValue、_descending对listSbbjGetList2进行排序，并延时更新
      //                   _listSort();
      //                 }
      //                 isLoading = false;
      //                 try_setState();
      //               });
      //             }
      //           : null,
      //     ),
      //     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,
      //     ),
      //     getIconButton(
      //       iconData: Icons.vertical_align_bottom_outlined,
      //       onPressed: (!isLoading && (lastIndex < listSbbjGetList2.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 = listSbbjGetList2.length - itemOnPage - 2;
      //                   lastIndex = listSbbjGetList2.length;
      //                   isLoading = false;
      //                   try_setState();
      //                 },
      //               );
      //             }
      //           : null,
      //     ),
      //   ],
      // ),
      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 = listSbbjGetList2.length;
                      for (int i = 0; i < 10; i++) {
                        List list = await getPageList();
                        if (list.length > 0) {
                          listSbbjGetList2.addAll(list); //加载累加
                        } else {
                          break;
                        }
                      }
                      Future.delayed(const Duration(milliseconds: 1000), () async {
                        if (listSbbjGetList2.length > oldItems) {
                          eventBus.fire(WzxxDataAuditEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
                          Fluttertoast.showToast(
                            msg: '新增 ${listSbbjGetList2.length - oldItems} 条数据下载完成！',
                            toastLength: Toast.LENGTH_SHORT,
                            gravity: ToastGravity.CENTER,
                          );

                          //按照用户选择的_selectedValue、_descending对listSbbjGetList2进行排序，并延时更新
                          _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 < listSbbjGetList2.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 = listSbbjGetList2.length - itemOnPage - 2;
                          lastIndex = listSbbjGetList2.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 == listSbbjGetList2.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: listSbbjGetList2.length,
                    ),
                  ),
                  onRefresh: () async {
                    // await Future.delayed(const Duration(seconds: 1), () async {
                    //   iPage = 0;
                    //   //await getWzxxGetList();
                    //   listSbbjGetList2 = 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) {
                        listSbbjGetList2.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 = 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));
  }

  //按照用户选择的_selectedValue、_descending对listSbbjGetList2进行排序，并延时更新
  Future _listSort({bool bShowToast = false}) {
    if (!isLoading && listSbbjGetList2.length > 0) {
      isLoading = true;
      try_setState();

      switch (_selectedValue) {
        default:
          if (_descending) {
            //按_selectedValue排序，降序
            listSbbjGetList2.sort((a, b) =>
                (b[mapWzxxDataText[_selectedValue]]).compareTo(a[mapWzxxDataText[_selectedValue]]));
          } else {
            //按_selectedValue排序，升序
            listSbbjGetList2.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)),
          ),
        ],
      ),
    );
  }

  // List listSbbjGetList2 = [
  //   {
  //     "id": 1196,
  //     "bjlx": "风扇",
  //     "content": "串口COM1获取风扇异常数据",
  //     "dwip": "172.16.3.12",
  //     "sbip": "192.168.1.10",
  //     "addtime": "2021-02-16 09:50:30",
  //     "workflow": 999
  //   },
  // ];

  Widget getDropdownButton() {
    //DropdownMenuItem项目文本list
    List<String> itemList = [
      '添加时间',
      '主键ID',
      '设备类型',
      '报警内容',
      '点位IP',
      '设备IP',
      '处理状态',
    ];

    //添加按'推送状态'排序
    if (hyshlx != 'sbbj') {
      // 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');

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

              //按照用户选择的_selectedValue、_descending对listSbbjGetList2进行排序，并延时更新
              _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);
  }
}
