getListWidget method

Widget getListWidget(
  1. Widget? itemBuilder(
    1. T item
    ), {
  2. Widget? onEmptyList,
  3. Widget? dividerBuilder(
    1. dynamic value
    )?,
  4. PartOfDate partOfDate = PartOfDate.day,
  5. Key? key,
})

Виджет списка объектов Если задать grFieldName в контроллере!!! - то сгруппирует элементы по заданному полю. Автоматически добавит в начало сортировку по grFieldName в направлении sortDirection (по умолчанию NsgSortingDirection.ascending). После добавит sortingParams, а затем getRequestFilter.sorting. В случае, если grFieldName - дата, будет считать объеты различными согласно partOfDate. Для каждой группы будет выведен заголовок dividerBuilder, а если список пуст - onEmptyList.

matchC.getListWidget(
            (match) {
              return
                child: MatchNewCard(
                  matchItem: match
                );
            },
            dividerBuilder: (currentDate) {
              currentDate as DateTime;
              return Container(
                margin: const EdgeInsets.only(bottom: 10, right: 20, left: 20),
                padding: const EdgeInsets.all(5),
                width: double.infinity,
                decoration: BoxDecoration(color: nsgtheme.colorSecondary, borderRadius: BorderRadius.circular(6)),
                child: Text(
                  '${NsgDateFormat.dateFormat(currentDate, format: (currentDate.year < DateTime.now().year)
                    ? 'dd MMMM yyyy, EE'
                    : 'dd MMMM, EE', locale: FutbolistaApp.defaultLocale.languageCode)}'.toUpperCase(),
                  textAlign: TextAlign.center,
                ),
              );
            },
  ),

Implementation

Widget getListWidget(
  Widget? Function(T item) itemBuilder, {
  Widget? onEmptyList,
  Widget? Function(dynamic value)? dividerBuilder,
  PartOfDate partOfDate = PartOfDate.day,
  Key? key,
}) => obx((state) {
  DataGroupList dataGroups;
  if (grFieldName != null) {
    dataGroups = DataGroupList(_getGroupsByFieldName(grFieldName!, partOfDate), needDivider: true);
  } else {
    dataGroups = DataGroupList([DataGroup(data: items, groupFieldName: "")]);
  }

  //scrollController.heightMap.clear();
  scrollController.dataGroups = dataGroups;

  Future.delayed(Duration(seconds: 0), () => scrollController.jumpTo(scrollController.lastOffset));

  return ListView.builder(
    controller: scrollController,
    itemCount: scrollController.dataGroups.length + (items.isEmpty ? 1 : 2),
    itemBuilder: (context, i) {
      if (items.isEmpty) {
        return onEmptyList ?? Padding(padding: EdgeInsets.only(top: 15, left: 20), child: Text(tran.empty_list));
      } else {
        if (i > scrollController.dataGroups.length) {
          if (scrollController.status == NsgLoadingScrollStatus.loading) {
            return NsgBaseController.getDefaultProgressIndicator();
          } else {
            return const SizedBox();
          }
        } else {
          var elem = scrollController.dataGroups.getElemet(i);
          if (elem.isDivider) {
            if (dividerBuilder != null) {
              return Container(
                key: elem.key,
                /*onHeight: (h) => scrollController.heightMap.addAll({i: h}),*/ child: dividerBuilder(elem.value) ?? SizedBox(),
              );
            } else {
              return Container(key: elem.key, /*onHeight: (h) => scrollController.heightMap.addAll({i: h}),*/ child: elem.group.goupDividerWidget);
            }
          } else {
            return Container(
              key: elem.key,
              /*onHeight: (h) => scrollController.heightMap.addAll({i: h}),*/ child: itemBuilder(elem.value as T) ?? SizedBox(),
            );
          }
        }

        // if (i >= items.length) {
        //   if (scrollController.status == NsgLoadingScrollStatus.loading) {
        //     return NsgBaseController.getDefaultProgressIndicator();
        //   } else {
        //     return const SizedBox();
        //   }
        // } else {
        //   return itemBuilder(items[i]);
        // }
      }
    },
  );
});