assetGridItemBuilder method

  1. @override
Widget assetGridItemBuilder(
  1. BuildContext context,
  2. int index,
  3. List<AssetEntity> currentAssets, {
  4. Widget? specialItem,
})
override

There are several conditions within this builder:

资源构建有几个条件:

Implementation

@override
Widget assetGridItemBuilder(
  BuildContext context,
  int index,
  List<AssetEntity> currentAssets, {
  Widget? specialItem,
}) {
  final int length = currentAssets.length;
  final AssetPathEntity? currentPathEntity =
      context.select<DefaultAssetPickerProvider, AssetPathEntity?>(
    (DefaultAssetPickerProvider p) => p.currentPath,
  );

  if (specialItem != null) {
    if ((index == 0 && specialItemPosition == SpecialItemPosition.prepend) ||
        (index == length &&
            specialItemPosition == SpecialItemPosition.append)) {
      return specialItem;
    }
  }

  final int currentIndex;
  if (specialItem != null &&
      specialItemPosition == SpecialItemPosition.prepend) {
    currentIndex = index - 1;
  } else {
    currentIndex = index;
  }

  if (currentPathEntity == null) {
    return const SizedBox.shrink();
  }

  final bool hasMoreToLoad = context.select<DefaultAssetPickerProvider, bool>(
    (DefaultAssetPickerProvider p) => p.hasMoreToLoad,
  );
  if (index == length - gridCount * 3 && hasMoreToLoad) {
    context.read<DefaultAssetPickerProvider>().loadMoreAssets();
  }

  final AssetEntity asset = currentAssets.elementAt(currentIndex);
  final Widget builder;
  switch (asset.type) {
    case AssetType.audio:
      builder = audioItemBuilder(context, currentIndex, asset);
      break;
    case AssetType.image:
    case AssetType.video:
      builder = imageAndVideoItemBuilder(context, currentIndex, asset);
      break;
    case AssetType.other:
      builder = const SizedBox.shrink();
      break;
  }
  final Widget content = Stack(
    key: ValueKey<String>(asset.id),
    children: <Widget>[
      builder,
      selectedBackdrop(context, currentIndex, asset),
      if (!isWeChatMoment || asset.type != AssetType.video)
        selectIndicator(context, index, asset),
      itemBannedIndicator(context, asset),
    ],
  );
  return assetGridItemSemanticsBuilder(context, index, asset, content);
}