assetGridItemBuilder method
Widget
assetGridItemBuilder(
- BuildContext context,
- int index,
- List<
AssetEntity> currentAssets
override
There're several conditions within this builder:
- Return specialItemBuilder while the current path is all and specialItemPosition is not equal to SpecialItemPosition.none.
- Return item builder according to the asset's type.
- Load more assets when the index reached at third line counting backwards.
资源构建有几个条件:
- 当前路径是全部资源且 specialItemPosition 不等于 SpecialItemPosition.none 时,将会通过 specialItemBuilder 构建内容。
- 根据资源类型返回对应类型的构建:
- AssetType.audio -> audioItemBuilder 音频类型
- AssetType.image, AssetType.video -> imageAndVideoItemBuilder 图片和视频类型
- 在索引到达倒数第三列的时候加载更多资源。
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,
if (!isWeChatMoment || asset.type != AssetType.video)
selectIndicator(context, asset),
],
);
}