美文网首页
Flutter - GridView2 - 实现朋友圈效果(九宫

Flutter - GridView2 - 实现朋友圈效果(九宫

作者: 西半球_ | 来源:发表于2020-02-19 14:13 被阅读0次
demo 地址: https://github.com/iotjin/jh_flutter_demo

效果图

GridView实现朋友圈效果(九宫格.png

关于图片点击全屏浏览请看:https://www.jianshu.com/p/69e58c76afa4

主界面代码

import 'package:flutter/material.dart';
import 'package:flutter_app/JhNinePictureTool.dart';
import 'package:flutter_app/jhBottomSheet.dart';

List<String> dataArr;

List<String> dataArr2;

List getData(){
  dataArr = new List();
  for(int i = 0; i < 9; i++){
    var img;
    if(i%2==0){
      img = "https://gitee.com/iotjh/Picture/raw/master/lufei2.png";
    }else{
      img= "https://gitee.com/iotjh/Picture/raw/master/lufei.png";
    }
    dataArr.add(img);
  }
  return dataArr;
}

List getData2(){
  dataArr2 = new List();
  for(int i = 0; i < 4; i++){
    var img;
    if(i%2==0){
      img = "https://gitee.com/iotjh/Picture/raw/master/lufei2.png";
    }else{
      img= "https://gitee.com/iotjh/Picture/raw/master/lufei.png";
    }
    dataArr2.add(img);
  }
  return dataArr2;
}


class GridViewTest2 extends StatefulWidget {
  @override
  _GridViewTest2State createState() => _GridViewTest2State();
}

class _GridViewTest2State extends State<GridViewTest2> {

  @override
  void initState() {
    super.initState();
    getData();
    getData2();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar:AppBar(
            title:Text('GridView实现朋友圈效果(九宫格)')
        ),
        body:
        Container(
            child:
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text("九宫格"),
                Container(
                    padding: EdgeInsets.fromLTRB(80, 10, 30, 10),
                    color: Colors.blue,
                    child:
                    JhNinePictureTool(
                      imgData: dataArr,
                      lfPaddingSpace: 110,
                      onLongPress: (){
                        JhBottomSheet.showText(context, dataArr: ["保存图片"]);
                      },
                    )
                ),
                Text("九宫格"),
                Container(
                    padding: EdgeInsets.fromLTRB(80, 10, 30, 10),
                    color: Colors.blue,
                    child:
                    JhNinePictureTool(
                      imgData: dataArr2,
                      lfPaddingSpace: 110,
                      onLongPress: (){
                        JhBottomSheet.showText(context, dataArr: ["保存图片"]);
                      },
                    )
                ),




              ],
            )


        )
    );
  }
}


JhNinePictureTool 代码

import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'jhPhotoAllScreenShow.dart';
import 'jhPhotoAllScreenShow2.dart';

const double itemSpace = 5.0;
const double space = 5.0; //上下左右间距

class JhNinePictureTool extends StatelessWidget {

  final List<String> imgData;
  final double lfPaddingSpace; //外部设置的左右间距
  final GestureTapCallback onLongPress;
  JhNinePictureTool({
    this.imgData,
    this.lfPaddingSpace,
    this.onLongPress,
  });

  @override
  Widget build(BuildContext context) {

    var kScreenWidth = MediaQuery.of(context).size.width;

    var lfPadding  = lfPaddingSpace==null ?0.0: lfPaddingSpace;
    var ninePictureW =(kScreenWidth-space*2-2*itemSpace-lfPadding);
    var itemWH = ninePictureW/3;
    int columnCount = imgData.length >6 ? 3:imgData.length <= 3 ? 1:2;
//    print("九宫格宽"+ninePictureW.toString());
//    print("item宽"+itemWH.toString());

    return Container(
        color: Colors.yellow,
        width: kScreenWidth-lfPadding,
        height: columnCount *itemWH +space*2+(columnCount -1)*itemSpace,
        child:
        GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(//可以直接指定每行(列)显示多少个Item
              //一行的Widget数量
              crossAxisCount:3,
              crossAxisSpacing: itemSpace, //水平间距
              mainAxisSpacing: itemSpace, //垂直间距
              childAspectRatio: 1.0,//子Widget宽高比例
            ),
            physics:NeverScrollableScrollPhysics(),
            padding: EdgeInsets.all(space),//GridView内边距
            itemCount: imgData.length,
            itemBuilder: (context, index) {
              return
                GestureDetector(
                  child:

//                CachedNetworkImage(
//                  imageUrl: imgData[index],
//                  imageBuilder: (context, imageProvider) => Container(
//                    decoration: BoxDecoration(
//                      image: DecorationImage(
//                          image: imageProvider,
//                          fit: BoxFit.cover),
//                    ),
//                  ),
//                  placeholder: (context, url) => CircularProgressIndicator(),
//                  errorWidget: (context, url, error) => Icon(Icons.error),
//                ),

                  ConstrainedBox(
                    child:Image.network(imgData[index],fit:BoxFit.cover),
                    constraints: BoxConstraints.expand(),
                  ),

                  onTap: (){
                    print(index);
//                   Navigator.maybePop(context);

                    //FadeRoute是自定义的切换过度动画(渐隐渐现) 如果不需要 可以使用默认的MaterialPageRoute
                    Navigator.of(context).push(new FadeRoute( page:
                    JhPhotoAllScreenShow(
                      imgDataArr:imgData,
                      index: index,
                      onLongPress: onLongPress,
                    )
                    ));

//                    Navigator.of(context).push(
//                      NinePictureAllScreenShow(imgData, index),
//                     );

                  },
                );
            }
        )

    );
  }
}


相关文章

网友评论

      本文标题:Flutter - GridView2 - 实现朋友圈效果(九宫

      本文链接:https://www.haomeiwen.com/subject/tkrafhtx.html