一、效果图  
 
 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 ( ) , 
      ) , 
    ) ; 
  } 
}