美文网首页Flutter
Flutter实现 瀑布流+高斯模糊效果+上拉加载+下拉刷新

Flutter实现 瀑布流+高斯模糊效果+上拉加载+下拉刷新

作者: StevenHu_Sir | 来源:发表于2019-09-29 09:23 被阅读0次

    1.心动我的

    /// 我心动的列表
    ///
    /// created by hujintao
    /// created at 2019-09-11
    //
    import 'package:flutter/material.dart';
    import 'package:flutter_easyrefresh/easy_refresh.dart';
    import 'package:flutter_screenutil/flutter_screenutil.dart';
    import 'package:fpdxapp/components/dialogs/app_update.dart';
    import 'package:fpdxapp/components/dialogs/dialog_wrapper.dart';
    import 'package:fpdxapp/components/dialogs/unlock_cp_dialog.dart';
    import 'package:fpdxapp/components/vip_tag.dart';
    import 'package:fpdxapp/constants/icons.dart';
    import 'package:fpdxapp/constants/style.dart';
    import 'package:fpdxapp/dao/friends/heartBeat.dart';
    import 'package:fpdxapp/model/friends/heartBeat.dart';
    import 'package:fpdxapp/utils/date_util.dart';
    import 'package:fpdxapp/utils/toast.dart';
    import 'package:fpdxapp/utils/utils.dart';
    import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
    
    class MyHeartBeatList extends StatefulWidget {
      @override
      _MyHeartBeatListState createState() => _MyHeartBeatListState();
    }
    
    class _MyHeartBeatListState extends State<MyHeartBeatList> with AutomaticKeepAliveClientMixin{
    
      //加载更多key 必填
      GlobalKey<RefreshFooterState> _footerKey =
          new GlobalKey<RefreshFooterState>();
    
      //下拉刷新key 必填
      GlobalKey<RefreshHeaderState> _headerKey =
          new GlobalKey<RefreshHeaderState>();
    
      List<HeartBeatList> heartBeatList = [];
      int _page;
      ScrollController _scrollController;
    
      @override
      // TODO: implement wantKeepAlive
      bool get wantKeepAlive => true;
      /// 渐变色
      final gradient = Utils.parseAngleToAlignment(90);
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        this._refreshData();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: this.heartBeatList != null && this.heartBeatList.length > 0
              ? _buildContent()
              : _noDataWidget(),
        );
      }
    
      Widget _buildContent() {
        return EasyRefresh(
          refreshHeader: ClassicsHeader(
            key: _headerKey,
            bgColor: Colors.white,
            textColor: Colors.pink,
            moreInfoColor: Colors.pink,
            refreshReadyText: '下拉刷新',
            refreshingText: '正在努力刷新',
            refreshedText: '加载完成',
            showMore: true,
            moreInfo: '正在加载中',
          ),
          refreshFooter: ClassicsFooter(
            key: _footerKey,
            bgColor: Colors.white,
            textColor: Colors.pink,
            moreInfoColor: Colors.pink,
            showMore: true,
            noMoreText: '暂时没有更多了',
            loadReadyText: '上拉加载',
            loadedText: '加载完毕',
            loadText: '上拉加载更多',
            loadingText: '正在努力加载更多',
            moreInfo: '正在加载中',
          ),
          child: new StaggeredGridView.countBuilder(
            itemCount:
                this.heartBeatList.length > 0 ? this.heartBeatList.length : 0,
            primary: false,
            crossAxisCount: 4,
            mainAxisSpacing: ScreenUtil().setWidth(30),
            crossAxisSpacing: ScreenUtil().setWidth(30),
            itemBuilder: (BuildContext context, int index) => new Container(
              height: ScreenUtil().setHeight(582),
                color: Colors.transparent,
                child: _buildImageItem(heartBeatList[index])),
            staggeredTileBuilder: (int index) =>
                new StaggeredTile.count(2, index.isEven ? 3 : 2.5),
            padding: EdgeInsets.only(
                left: ScreenUtil().setWidth(32), right: ScreenUtil().setWidth(32)),
          ),
          loadMore: () async {
            print('没有更多了.......');
            _addMoreData();
          },
          onRefresh: () async {
            print('下拉刷新~~~~');
            _refreshData();
          },
        );
      }
    
      /// DetailItem
      Widget _buildImageItem(HeartBeatList item) {
        return new GestureDetector(
          onTap: () {
            Toast.show("点击了");
          },
          child: Container(
            decoration: BoxDecoration(
                color: Color(0xffF3F4F5),
                borderRadius: BorderRadius.circular(10.0),
                image: DecorationImage(
                    image: NetworkImage(
                        item != null && item.photoSrc != null ? item.photoSrc : ''),
                    fit: BoxFit.cover) //设置图片的填充模式
                ),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                // 顶部阴影
                Container(
                  height: ScreenUtil().setHeight(129),
                  decoration: BoxDecoration(
                    gradient: LinearGradient(
                        colors: [
                          Color(0xFF030303).withOpacity(0.06),
                          Color(0xFF565656).withOpacity(0.06),
                        ],
                        begin: Alignment(gradient['beginX'], gradient['beginY']),
                        end: Alignment(gradient['endX'], gradient['endY'])),
                    borderRadius: BorderRadius.only(
                      topLeft: Radius.circular(10.0),
                      topRight: Radius.circular(10.0),
                    ),
                  ),
                  child: Container(
                    margin: EdgeInsets.only(
                      left: ScreenUtil().setWidth(10),
                      right: ScreenUtil().setWidth(17),
                    ),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Container(
                          margin: EdgeInsets.only(top: ScreenUtil().setHeight(17)),
                          child: Row(
                            children: <Widget>[
                              Icon(
                                MyIcons.heart,
                                size: ScreenUtil().setSp(40),
                                color: Colors.white,
                              ),
                              Container(
                                margin: EdgeInsets.only(
                                  left: ScreenUtil().setWidth(5),
                                  top: ScreenUtil().setWidth(5),
                                ),
                                child: Text(
                                  item != null && item.praises != null
                                      ? item.praises.toString()
                                      : '',
                                  style: TextStyle(
                                    fontSize: ScreenUtil().setSp(20),
                                    color: Colors.white,
                                  ),
                                  textAlign: TextAlign.center,
                                ),
                              )
                            ],
                          ),
                        ),
                        Container(
                          margin: EdgeInsets.only(top: ScreenUtil().setHeight(19)),
                          child: ClipOval(
                            child: Container(
                              color: Colors.black.withOpacity(0.24),
                              padding: EdgeInsets.all(ScreenUtil().setWidth(10)),
                              child: Icon(
                                MyIcons.lock,
                                size: ScreenUtil().setSp(42),
                                color: Colors.white,
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
                // 底部阴影
                Container(
                  height: ScreenUtil().setHeight(129),
                  decoration: BoxDecoration(
                    gradient: LinearGradient(
                        colors: [
                          Color(0xFF030303).withOpacity(0.06),
                          Color(0xFF565656).withOpacity(0.06),
                        ],
                        begin: Alignment(gradient['beginX'], gradient['beginY']),
                        end: Alignment(gradient['endX'], gradient['endY'])),
                    borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(10.0),
                      bottomRight: Radius.circular(10.0),
                    ),
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      // 标签
                      Container(
                        margin: EdgeInsets.only(top: ScreenUtil().setHeight(33)),
                        child: Row(
                          children: <Widget>[
                            // 性别标识
                            item.sex == 1
                                ? Container(
                                    margin: EdgeInsets.only(
                                        left: ScreenUtil().setHeight(22)),
                                    child: ClipOval(
                                      child: Container(
                                        color: Color(0xff6CC1FD),
                                        padding: EdgeInsets.all(
                                            ScreenUtil().setWidth(3)),
                                        child: Icon(
                                          MyIcons.sex_boy,
                                          size: ScreenUtil().setSp(20),
                                          color: Colors.white,
                                        ),
                                      ),
                                    ),
                                  )
                                : Container(
                                    margin: EdgeInsets.only(
                                        left: ScreenUtil().setHeight(22)),
                                    child: ClipOval(
                                      child: Container(
                                        color: MyColors.primary,
                                        padding: EdgeInsets.all(
                                            ScreenUtil().setWidth(3)),
                                        child: Icon(
                                          MyIcons.sex_girl,
                                          size: ScreenUtil().setSp(20),
                                          color: Colors.white,
                                        ),
                                      ),
                                    ),
                                  ),
                            // 认证标识
                            item.user.wxAuth != null && item.user.wxAuth != 0
                                ? Container(
                                    margin: EdgeInsets.only(
                                        left: ScreenUtil().setHeight(9)),
                                    child: Image(
                                      image: NetworkImage(
                                          'https://oss.pocketuniversity.cn/media/2019-01-05/5c3029ad417ce.png'),
                                      width: ScreenUtil().setWidth(25),
                                    ),
                                  )
                                : Container(),
                            SizedBox(
                              width: ScreenUtil().setWidth(5),
                            ),
                            // VIP标识
                            VipTag(item.user?.beVipAt ?? 0,
                                item.user?.supvipEndat ?? 0, 0)
                          ],
                        ),
                      ),
                      // 描述
                      Container(
                        margin: EdgeInsets.only(
                            left: ScreenUtil().setWidth(21),
                            right: ScreenUtil().setWidth(21)),
                        child: Text(
                          item.updatedAt != null
                              ? DateUtil.howLongAgo(item.updatedAt) + '心动过你'
                              : '',
                          overflow: TextOverflow.ellipsis,
                          maxLines: 1,
                          textAlign: TextAlign.left,
                          style: TextStyle(
                            fontSize: ScreenUtil().setSp(31),
                            color: Colors.white,
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      /// 无数据占位
      Widget _noDataWidget() {
        return Container(
          child: Center(
            child: Column(
              children: <Widget>[
                // 图片
                Container(
                  margin: EdgeInsets.only(
                    top: ScreenUtil().setHeight(199),
                  ),
                  child: Image(
                    image: Utils.getAssetImgWithPath('nodata_heartBeatMine'),
                    width: ScreenUtil().setWidth(451),
                    height: ScreenUtil().setHeight(357),
                    fit: BoxFit.cover,
                  ),
                ),
                // 文字
                Container(
                  margin: EdgeInsets.only(
                    top: ScreenUtil().setHeight(29),
                  ),
                  child: Text(
                    '你目前还没有心动的人~',
                    style: TextStyle(
                        color: Color(0xFF999999), fontSize: ScreenUtil().setSp(30)),
                  ),
                ),
                // 按钮
                GestureDetector(
                  onTap: () {
                    Toast.show('去首页心动');
                  },
                  child: Container(
                    margin: EdgeInsets.only(
                      top: ScreenUtil().setHeight(70),
                    ),
                    width: ScreenUtil().setWidth(520),
                    height: ScreenUtil().setHeight(100),
                    decoration: BoxDecoration(
                      color: Color(0xffFFF1F2),
                      // 设置渐变色
                      gradient: LinearGradient(
                        colors: [Color(0xFFFFF9FB1), Color(0xFFFF69A2)],
                        begin: Alignment(-1, -1),
                        end: Alignment(1.0, 0.56),
                      ),
                      borderRadius:
                          BorderRadius.circular(ScreenUtil().setHeight(50)),
                    ),
                    child: Center(
                      child: Text(
                        '去首页心动',
                        style: TextStyle(
                            color: Colors.white, fontSize: ScreenUtil().setSp(35)),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      /// 下拉刷新数据
      Future<Null> _refreshData() async {
        _page = 0;
        _getPostData(false);
      }
    
      /// 上拉加载数据
      Future<Null> _addMoreData() async {
        _page++;
        _getPostData(true);
      }
    
      /// 获取我心动的列表数据
      void _getPostData(bool _beAdd) async {
        print('page:${_page}');
        var r = await HeartBeatDao.getMyHeartBeatAllList(page: _page);
        setState(() {
          if (!_beAdd) {
            heartBeatList.clear();
            heartBeatList = r.data;
          } else {
            heartBeatList.addAll(r.data);
          }
        });
      }
    
      @override
      void didChangeDependencies() {
        super.didChangeDependencies();
        _scrollController = ScrollController();
    
        _scrollController.addListener(_handleScroll);
      }
    
      void _handleScroll() {}
    
      @override
      void dispose() {
        _scrollController?.removeListener(_handleScroll);
        super.dispose();
      }
    }
    

    2.我心动的列表

    import 'dart:ui';
    
    /// 心动我的列表
    ///
    /// created by hujintao
    /// created at 2019-09-11
    //
    import 'package:flutter/material.dart';
    import 'package:flutter_easyrefresh/easy_refresh.dart';
    import 'package:flutter_screenutil/flutter_screenutil.dart';
    import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
    import 'package:fpdxapp/components/blur_widget/blur_widget.dart';
    import 'package:fpdxapp/components/vip_tag.dart';
    import 'package:fpdxapp/constants/icons.dart';
    import 'package:fpdxapp/constants/style.dart';
    import 'package:fpdxapp/dao/friends/heartBeat.dart';
    import 'package:fpdxapp/model/friends/heartBeat.dart';
    import 'package:fpdxapp/utils/date_util.dart';
    import 'package:fpdxapp/utils/toast.dart';
    import 'package:fpdxapp/utils/utils.dart';
    
    class HeartBeatMineList extends StatefulWidget {
      @override
      _HeartBeatMineListState createState() => _HeartBeatMineListState();
    }
    
    class _HeartBeatMineListState extends State<HeartBeatMineList>
        with AutomaticKeepAliveClientMixin {
      //加载更多key 必填
      GlobalKey<RefreshFooterState> _footerKey =
          new GlobalKey<RefreshFooterState>();
    
      //下拉刷新key 必填
      GlobalKey<RefreshHeaderState> _headerKey =
          new GlobalKey<RefreshHeaderState>();
    
      List<HeartBeatList> heartBeatList = [];
      int _page;
    
      ScrollController _scrollController;
    
      @override
      // TODO: implement wantKeepAlive
      bool get wantKeepAlive => true;
    
      /// 渐变色
      final gradient = Utils.parseAngleToAlignment(90);
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        this._refreshData();
      }
    
      /// 下拉刷新数据
      Future<Null> _refreshData() async {
        _page = 0;
        _getPostData(false);
      }
    
      /// 上拉加载数据
      Future<Null> _addMoreData() async {
        _page++;
        _getPostData(true);
      }
    
      /// 获取我心动的列表数据
      void _getPostData(bool _beAdd) async {
        print('page:${_page}');
        var r = await HeartBeatDao.getHeartBeatMineAllList(page: _page);
        setState(() {
          if (!_beAdd) {
            heartBeatList.clear();
            heartBeatList = r.data;
          } else {
            heartBeatList.addAll(r.data);
          }
        });
      }
    
      @override
      void didChangeDependencies() {
        super.didChangeDependencies();
        _scrollController = ScrollController();
    
        _scrollController.addListener(_handleScroll);
      }
    
      void _handleScroll() {}
    
      @override
      void dispose() {
        _scrollController?.removeListener(_handleScroll);
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: this.heartBeatList != null && this.heartBeatList.length > 0
              ? _buildContent()
              : _noDataWidget(),
        );
      }
    
      Widget _buildContent() {
        return EasyRefresh(
          refreshHeader: ClassicsHeader(
            key: _headerKey,
            bgColor: Colors.white,
            textColor: Colors.pink,
            moreInfoColor: Colors.pink,
            refreshReadyText: '下拉刷新',
            refreshingText: '正在努力刷新',
            refreshedText: '加载完成',
            showMore: true,
            moreInfo: '正在加载中',
          ),
          refreshFooter: ClassicsFooter(
            key: _footerKey,
            bgColor: Colors.white,
            textColor: Colors.pink,
            moreInfoColor: Colors.pink,
            showMore: true,
            noMoreText: '暂时没有更多了',
            loadReadyText: '上拉加载',
            loadedText: '加载完毕',
            loadText: '上拉加载更多',
            loadingText: '正在努力加载更多',
            moreInfo: '正在加载中',
          ),
          child: new StaggeredGridView.countBuilder(
            itemCount:
                this.heartBeatList.length > 0 ? this.heartBeatList.length : 0,
            primary: false,
            crossAxisCount: 4,
            mainAxisSpacing: ScreenUtil().setWidth(30),
            crossAxisSpacing: ScreenUtil().setWidth(30),
            itemBuilder: (BuildContext context, int index) => new Container(
                color: Colors.transparent,
                child: _buildImageItem(heartBeatList[index])),
            staggeredTileBuilder: (int index) =>
                new StaggeredTile.count(2, index.isEven ? 3 : 2.5),
            padding: EdgeInsets.only(
                left: ScreenUtil().setWidth(32), right: ScreenUtil().setWidth(32)),
          ),
          loadMore: () async {
            print('没有更多了.......');
            _addMoreData();
          },
          onRefresh: () async {
            print('下拉刷新~~~~');
            _refreshData();
          },
        );
      }
    
      /// DetailItem
      Widget _buildImageItem(HeartBeatList item) {
        return new GestureDetector(
          onTap: () {
            Toast.show("点击了");
          },
          child: Container(
            decoration: BoxDecoration(
              color: Colors.white,
              boxShadow: [
                BoxShadow(
                    color: Color(0xffF3F4F5), offset: Offset(1, 1), spreadRadius: 1)
              ],
              borderRadius: BorderRadius.only(
                bottomLeft: Radius.circular(10.0),
                bottomRight: Radius.circular(10.0),
              ),
            ),
            child: Stack(
              overflow: Overflow.clip,
              alignment: Alignment(-1, 1),
              children: <Widget>[
                // 背景图片
                Container(
                  decoration: BoxDecoration(
                      color: Color(0xffF3F4F5),
                      borderRadius: BorderRadius.only(
                        topLeft: Radius.circular(10.0),
                        topRight: Radius.circular(10.0),
                      ),
                      image: DecorationImage(
                          image: NetworkImage(item != null && item.photoSrc != null
                              ? item.photoSrc
                              : ''),
                          fit: BoxFit.cover) //设置图片的填充模式
                      ),
                  margin: EdgeInsets.only(bottom: ScreenUtil().setHeight(20)),
                ),
                // 矩形高斯模糊效果
                BlurRectWidget(
                  child: Container(),
                  opacity: 0.8,
                ),
                // 主题
                Positioned(
                  top: 0,
                  left: 0,
                  right: 0,
                  bottom: ScreenUtil().setHeight(20),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      // 顶部阴影
                      Container(
                        height: ScreenUtil().setHeight(129),
                        decoration: BoxDecoration(
                          gradient: LinearGradient(
                              colors: [
                                Color(0xFF030303).withOpacity(0.06),
                                Color(0xFF565656).withOpacity(0.06),
                              ],
                              begin:
                                  Alignment(gradient['beginX'], gradient['beginY']),
                              end: Alignment(gradient['endX'], gradient['endY'])),
                          borderRadius: BorderRadius.only(
                            topLeft: Radius.circular(10.0),
                            topRight: Radius.circular(10.0),
                          ),
                        ),
                        child: Container(
                          margin: EdgeInsets.only(
                            left: ScreenUtil().setWidth(10),
                            right: ScreenUtil().setWidth(17),
                          ),
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: <Widget>[
                              Container(
                                margin: EdgeInsets.only(
                                    top: ScreenUtil().setHeight(17)),
                                child: Row(
                                  children: <Widget>[
                                    Icon(
                                      MyIcons.heart,
                                      size: ScreenUtil().setSp(40),
                                      color: Colors.white,
                                    ),
                                    Container(
                                      margin: EdgeInsets.only(
                                        left: ScreenUtil().setWidth(5),
                                        top: ScreenUtil().setWidth(5),
                                      ),
                                      child: Text(
                                        item != null && item.praises != null
                                            ? item.praises.toString()
                                            : '',
                                        style: TextStyle(
                                          fontSize: ScreenUtil().setSp(20),
                                          color: Colors.white,
                                        ),
                                        textAlign: TextAlign.center,
                                      ),
                                    )
                                  ],
                                ),
                              ),
                              Container(
                                margin: EdgeInsets.only(
                                    top: ScreenUtil().setHeight(19)),
                                child: ClipOval(
                                  child: Container(
                                    color: Colors.black.withOpacity(0.24),
                                    padding:
                                        EdgeInsets.all(ScreenUtil().setWidth(10)),
                                    child: Icon(
                                      MyIcons.lock,
                                      size: ScreenUtil().setSp(42),
                                      color: Colors.white,
                                    ),
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                      ),
                      // 底部阴影
                      Container(
                        height: ScreenUtil().setHeight(129),
                        decoration: BoxDecoration(
                          gradient: LinearGradient(
                              colors: [
                                Color(0xFF030303).withOpacity(0.06),
                                Color(0xFF565656).withOpacity(0.06),
                              ],
                              begin:
                                  Alignment(gradient['beginX'], gradient['beginY']),
                              end: Alignment(gradient['endX'], gradient['endY'])),
                        ),
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            // 标签
                            Container(
                              margin:
                                  EdgeInsets.only(top: ScreenUtil().setHeight(33)),
                              child: Row(
                                children: <Widget>[
                                  // 性别标识
                                  item.sex == 1
                                      ? Container(
                                          margin: EdgeInsets.only(
                                              left: ScreenUtil().setHeight(22)),
                                          child: ClipOval(
                                            child: Container(
                                              color: Color(0xff6CC1FD),
                                              padding: EdgeInsets.all(
                                                  ScreenUtil().setWidth(3)),
                                              child: Icon(
                                                MyIcons.sex_boy,
                                                size: ScreenUtil().setSp(20),
                                                color: Colors.white,
                                              ),
                                            ),
                                          ),
                                        )
                                      : Container(
                                          margin: EdgeInsets.only(
                                              left: ScreenUtil().setHeight(22)),
                                          child: ClipOval(
                                            child: Container(
                                              color: MyColors.primary,
                                              padding: EdgeInsets.all(
                                                  ScreenUtil().setWidth(3)),
                                              child: Icon(
                                                MyIcons.sex_girl,
                                                size: ScreenUtil().setSp(20),
                                                color: Colors.white,
                                              ),
                                            ),
                                          ),
                                        ),
                                  // 认证标识
                                  item.user.wxAuth != null && item.user.wxAuth != 0
                                      ? Container(
                                          margin: EdgeInsets.only(
                                              left: ScreenUtil().setHeight(9)),
                                          child: Image(
                                            image: NetworkImage(
                                                'https://oss.pocketuniversity.cn/media/2019-01-05/5c3029ad417ce.png'),
                                            width: ScreenUtil().setWidth(25),
                                          ),
                                        )
                                      : Container(),
                                  SizedBox(
                                    width: ScreenUtil().setWidth(5),
                                  ),
                                  // VIP标识
                                  VipTag(item.user?.beVipAt ?? 0,
                                      item.user?.supvipEndat ?? 0, 0)
                                ],
                              ),
                            ),
                            // 描述
                            Container(
                              margin: EdgeInsets.only(
                                  left: ScreenUtil().setWidth(21),
                                  right: ScreenUtil().setWidth(21)),
                              child: Text(
                                item.updatedAt != null
                                    ? DateUtil.howLongAgo(item.updatedAt) + '心动过你'
                                    : '',
                                overflow: TextOverflow.ellipsis,
                                maxLines: 1,
                                textAlign: TextAlign.left,
                                style: TextStyle(
                                  fontSize: ScreenUtil().setSp(31),
                                  color: Colors.white,
                                ),
                              ),
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
                // 进度条
                Container(
                  height: ScreenUtil().setHeight(20),
                  child: _ProgressBar(
                    start: 0,
                    end: 0,
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      /// 无数据占位
      Widget _noDataWidget() {
        return Container(
          child: Center(
            child: Column(
              children: <Widget>[
                // 图片
                Container(
                  margin: EdgeInsets.only(
                    top: ScreenUtil().setHeight(199),
                  ),
                  child: Image(
                    image: Utils.getAssetImgWithPath('nodata_myHeartBeat'),
                    width: ScreenUtil().setWidth(451),
                    height: ScreenUtil().setHeight(357),
                    fit: BoxFit.cover,
                  ),
                ),
                // 文字
                Container(
                  margin: EdgeInsets.only(
                    top: ScreenUtil().setHeight(29),
                  ),
                  child: Text(
                    '你目前还没有心动的人~',
                    style: TextStyle(
                        color: Color(0xFF999999), fontSize: ScreenUtil().setSp(30)),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
      /// 创建交友卡片 占位
      Widget _noIDCardWidget() {
        return Container(
          child: Center(
            child: Column(
              children: <Widget>[
                // 图片
                Container(
                  margin: EdgeInsets.only(
                    top: ScreenUtil().setHeight(199),
                  ),
                  child: Image(
                    image: Utils.getAssetImgWithPath('nodata_heartBeatMine_noID'),
                    width: ScreenUtil().setWidth(451),
                    height: ScreenUtil().setHeight(357),
                    fit: BoxFit.cover,
                  ),
                ),
                // 文字
                Container(
                  margin: EdgeInsets.only(
                    top: ScreenUtil().setHeight(29),
                  ),
                  child: Text(
                    '创建交友卡片后,可解锁“心动我的”人',
                    style: TextStyle(
                        color: Color(0xFF999999), fontSize: ScreenUtil().setSp(30)),
                  ),
                ),
                // 按钮
                GestureDetector(
                  onTap: () {
                    Toast.show('创建交友卡片');
                  },
                  child: Container(
                    margin: EdgeInsets.only(
                      top: ScreenUtil().setHeight(70),
                    ),
                    width: ScreenUtil().setWidth(520),
                    height: ScreenUtil().setHeight(100),
                    decoration: BoxDecoration(
                      color: Color(0xffFFF1F2),
                      // 设置渐变色
                      gradient: LinearGradient(
                        colors: [Color(0xFFFFF9FB1), Color(0xFFFF69A2)],
                        begin: Alignment(-1, -1),
                        end: Alignment(1.0, 0.56),
                      ),
                      borderRadius:
                          BorderRadius.circular(ScreenUtil().setHeight(50)),
                    ),
                    child: Center(
                      child: Text(
                        '创建交友卡片',
                        style: TextStyle(
                            color: Colors.white, fontSize: ScreenUtil().setSp(35)),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      }
    
    }
    
    /// 进度条
    class _ProgressBar extends StatelessWidget {
    
      /// 起始进度, <1
      final double start;
    
      /// 结束进度, <=1
      final double end;
    
      _ProgressBar({this.start, this.end});
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder(
            future: Future.delayed(const Duration(milliseconds: 300)),
            builder: (_, data) => AnimatedContainer(
                  height: ScreenUtil().setHeight(6),
                  width: MediaQuery.of(context).size.width * this.end,
                  duration: Duration(milliseconds: 300),
                  decoration: BoxDecoration(
                    color: MyColors.primary,
                    borderRadius: BorderRadius.only(
                      bottomLeft: Radius.circular(10.0),
                      bottomRight: Radius.circular(10.0),
                    ),
                  ),
                ));
      }
    }
    

    效果图

    瀑布流-效果图.gif

    补充

    1.瀑布流关键代码

    Widget _buildContent() {
        return EasyRefresh(
          refreshHeader: ClassicsHeader(
            key: _headerKey,
            bgColor: Colors.white,
            textColor: Colors.pink,
            moreInfoColor: Colors.pink,
            refreshReadyText: '下拉刷新',
            refreshingText: '正在努力刷新',
            refreshedText: '加载完成',
            showMore: true,
            moreInfo: '正在加载中',
          ),
          refreshFooter: ClassicsFooter(
            key: _footerKey,
            bgColor: Colors.white,
            textColor: Colors.pink,
            moreInfoColor: Colors.pink,
            showMore: true,
            noMoreText: '暂时没有更多了',
            loadReadyText: '上拉加载',
            loadedText: '加载完毕',
            loadText: '上拉加载更多',
            loadingText: '正在努力加载更多',
            moreInfo: '正在加载中',
          ),
          child: new StaggeredGridView.countBuilder(
            itemCount:
                this.heartBeatList.length > 0 ? this.heartBeatList.length : 0,
            primary: false,
            crossAxisCount: 4,
            mainAxisSpacing: ScreenUtil().setWidth(30),
            crossAxisSpacing: ScreenUtil().setWidth(30),
            itemBuilder: (BuildContext context, int index) => new Container(
              height: ScreenUtil().setHeight(582),
                color: Colors.transparent,
                child: _buildImageItem(heartBeatList[index])),
            staggeredTileBuilder: (int index) =>
                new StaggeredTile.count(2, index.isEven ? 3 : 2.5),
            padding: EdgeInsets.only(
                left: ScreenUtil().setWidth(32), right: ScreenUtil().setWidth(32)),
          ),
          loadMore: () async {
            print('没有更多了.......');
            _addMoreData();
          },
          onRefresh: () async {
            print('下拉刷新~~~~');
            _refreshData();
          },
        );
      }
    

    2.高斯模糊效果

    import 'package:flutter/material.dart';
    import 'package:flutter_screenutil/flutter_screenutil.dart';
    
    /// 矩形高斯模糊效果
    class BlurRectWidget extends StatefulWidget {
    
      final Widget child;
    
      /// 模糊值
      final double sigmaX;
      final double sigmaY;
    
      /// 透明度
      final double opacity;
    
      /// 外边距
      final double blurMargin;
    
    
      const BlurRectWidget(
          {Key key,
          this.child,
          this.sigmaX,
          this.sigmaY,
          this.opacity,
          this.blurMargin})
          : super(key: key);
    
      @override
      _BlurRectWidgetState createState() => _BlurRectWidgetState();
    }
    
    class _BlurRectWidgetState extends State<BlurRectWidget> {
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: widget.blurMargin != null
              ? widget.blurMargin
              : EdgeInsets.only(bottom: ScreenUtil().setHeight(20)),
          child: ClipRRect(
            borderRadius: BorderRadius.only(topLeft: Radius.circular(10),topRight: Radius.circular(10)),
            child: BackdropFilter(
              filter: ImageFilter.blur(
                sigmaX: this.widget.sigmaX != null ? this.widget.sigmaX : 20,
                sigmaY: this.widget.sigmaY != null ? this.widget.sigmaY : 20,
              ),
              child: Container(
                color: Colors.white10,
                child: this.widget.opacity != null
                    ? Opacity(
                        opacity: widget.opacity,
                        child: this.widget.child,
                      )
                    : this.widget.child,
              ),
            ),
          ),
        );
      }
    }
    

    相关文章

      网友评论

        本文标题:Flutter实现 瀑布流+高斯模糊效果+上拉加载+下拉刷新

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