assetGridItemBuilder method

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

There are several conditions within this builder:

资源构建有几个条件:

Implementation

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

  int currentIndex;
  switch (specialItemPosition) {
    case SpecialItemPosition.none:
    case SpecialItemPosition.append:
      currentIndex = index;
      break;
    case SpecialItemPosition.prepend:
      currentIndex = index - 1;
      break;
  }

  // Directly return the special item when it's empty.
  if (currentPathEntity == null) {
    if (allowSpecialItemWhenEmpty &&
        specialItemPosition != SpecialItemPosition.none) {
      return specialItemBuilder!(context);
    }
    return const SizedBox.shrink();
  }

  final int _length = currentAssets.length;
  if (currentPathEntity.isAll &&
      specialItemPosition != SpecialItemPosition.none) {
    if ((index == 0 && specialItemPosition == SpecialItemPosition.prepend) ||
        (index == _length &&
            specialItemPosition == SpecialItemPosition.append)) {
      return specialItemBuilder!(context);
    }
  }

  if (!currentPathEntity.isAll) {
    currentIndex = index;
  }

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

  final AssetEntity asset = currentAssets.elementAt(currentIndex);
  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;
  }
  return Stack(
    key: ValueKey<String>(asset.id),
    children: <Widget>[
      builder,
      selectedBackdrop(context, currentIndex, asset),
      if (!isWeChatMoment || asset.type != AssetType.video)
        selectIndicator(context, asset),
      itemBannedIndicator(context, asset),
    ],
  );
}