一、效果图
2、主要代码
import 'dart:io' ;
import 'dart:math' ;
import 'package: cached_network_image/ cached_network_image. dart';
import 'package:flutter/material.dart' ;
class ImageGrid extends StatelessWidget {
final List< String> imageUrls;
final double containerSize = 72.0 ;
final double padding = 3.0 ;
final double spacing = 2.0 ;
ImageGrid ( { required this. imageUrls} ) ;
double calculateImageWidth ( int count) {
double containerWidth = 72 ;
double padding = 3 ;
double gap = 2 ;
if ( count <= 4 ) {
return ( containerWidth - padding * 2 - gap) / 2 ;
} else {
return ( containerWidth - padding * 2 - gap * 2 ) / 3 ;
}
}
Widget _buildGrid ( ) {
double imageWidth = calculateImageWidth ( imageUrls. length) ;
int imageCount = imageUrls. length > 9 ? 9 : imageUrls. length;
if ( imageCount == 1 ) {
return Center (
child: Container (
width: containerSize,
height: containerSize,
child: Image. network (
imageUrls[ 0 ] ,
fit: BoxFit. cover,
) ,
) ,
) ;
} else {
int rowCount = 1 ;
int firstNumber = 0 ;
int cellCount = 1 ;
if ( imageCount == 2 ) {
rowCount = 1 ;
cellCount = 2 ;
} else if ( imageCount == 4 || imageCount == 6 ) {
rowCount = 2 ;
cellCount = imageCount == 4 ? 2 : 3 ;
} else if ( imageCount == 9 ) {
rowCount = 3 ;
cellCount = 3 ;
} else if ( imageCount == 3 ) {
rowCount = 2 ;
firstNumber = 1 ;
cellCount = 2 ;
} else if ( imageCount == 5 ) {
rowCount = 2 ;
firstNumber = 2 ;
cellCount = 3 ;
} else if ( imageCount == 7 ) {
rowCount = 3 ;
firstNumber = 1 ;
cellCount = 3 ;
} else if ( imageCount == 8 ) {
rowCount = 3 ;
firstNumber = 2 ;
cellCount = 3 ;
}
return Padding (
padding: EdgeInsets. all ( spacing) ,
child: Column (
mainAxisAlignment: MainAxisAlignment. center,
crossAxisAlignment: CrossAxisAlignment. center,
children: [
if ( firstNumber != 0 )
Row (
mainAxisAlignment: MainAxisAlignment. center,
children: List. generate ( firstNumber, ( cellIndex) {
return Row (
children: [
getImageWidget ( cellIndex, imageWidth) ,
if ( cellIndex != firstNumber - 1 )
SizedBox ( width: spacing) ,
] ,
) ;
} ) ,
) ,
if ( firstNumber != 0 && rowCount > 1 ) SizedBox ( height: spacing) ,
. . . List. generate ( rowCount - ( firstNumber != 0 ? 1 : 0 ) , ( rowIndex) {
return Column (
children: [
Row (
mainAxisAlignment: MainAxisAlignment. center,
children: List. generate ( cellCount, ( cellIndex) {
int index =
firstNumber + rowIndex * cellCount + cellIndex;
return Row (
children: [
getImageWidget ( index, imageWidth) ,
if ( cellIndex != cellCount - 1 )
SizedBox ( width: spacing) ,
] ,
) ;
} ) ,
) ,
if ( rowIndex != rowCount - ( firstNumber != 0 ? 2 : 1 ) )
SizedBox ( height: spacing) ,
] ,
) ;
} ) ,
] ,
) ,
) ;
}
}
getImageWidget ( int index, double width) {
if ( ! imageUrls[ index] . contains ( "http" ) ) {
return Image. file ( File ( imageUrls[ index] ) ,
width: width, height: width, fit: BoxFit. cover) ;
} else {
return CachedNetworkImage (
imageUrl: imageUrls[ index] ,
width: width,
height: width,
fit: BoxFit. cover,
) ;
}
}
@override
Widget build ( BuildContext context) {
return ClipRRect (
borderRadius: BorderRadius. circular ( 6 ) ,
child: Container (
width: containerSize,
height: containerSize,
decoration: BoxDecoration (
color: Color. fromARGB ( 255 , 243 , 4 , 4 ) ,
borderRadius: BorderRadius. circular ( 6 ) ,
) ,
child: _buildGrid ( ) ,
) ,
) ;
}
}