Flutter之瀑布流效果——Flutter基础系列

2023-10-27

需求:

相信android和ios的瀑布流效果大家都试过,网上有很多实现方法和开源库,今天我来为大家介绍一下如何在Flutter中实现瀑布流,整理一下方便以后学习,顺便分享给大家。

一、生成二维码

1、导入依赖

在 pubspec.yaml 中 dependencies 节点下添加:

  # 瀑布流插件
  flutter_staggered_grid_view: ^0.3.3
  # 网络缓存图片
  cached_network_image : ^0.6.2

2、引入代码

import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:cached_network_image/cached_network_image.dart';

3、创建方式

StaggeredGridView一共有6中创建方式:

StaggeredGridView.count()
StaggeredGridView.countBuilder()
StaggeredGridView.builder()
StaggeredGridView.custom()
StaggeredGridView.extent()
StaggeredGridView.extentBuilder()

StaggeredGridView.count():创建了一个纵轴方向固定Tile个数的布局,适合子Widget个数比较少的情况,使用List来设置。

StaggeredGridView.countBuilder():和StaggeredGridView.count()差不多,区别在于适合子Widget数量比较多,需要动态创建的情况。

StaggeredGridView.extent():创建了一个在纵轴方法指定Tile个数的最大值的布局,适合子Widget个数比较少的情况,使用List来设置。

StaggeredGridView.extentBuilder():和StaggeredGridView.extent()差不多,区别在于适合子Widget数量比较多,需要动态创建的情况。

StaggeredGridView.builder()和StaggeredGridView.custom()更高级也更灵活。

这里我们选择使用countBuilder

      body: StaggeredGridView.countBuilder(
          crossAxisCount: 4,   //横轴单元格数量
          itemCount: 20,  //元素数量
          itemBuilder: (context,i){
             return new Material(
               elevation: 8.0,
               borderRadius: BorderRadius.all(Radius.circular(8.0)),
               child: new CachedNetworkImage(
                 imageUrl: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg1.yuntouxiang.com%2Fuploads%2F20130521%2F21-022304_646.jpg&refer=http%3A%2F%2Fimg1.yuntouxiang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613615452&t=590bdef8fdbfb5c972066acbeca6543d",
                 imageBuilder: (context, imageProvider) => Container(
                   decoration: BoxDecoration(
                     borderRadius: BorderRadius.all(Radius.circular(8.0)),
                     image: DecorationImage(
                         image: imageProvider,
                         fit: BoxFit.fitHeight,
                         ),
                   ),
                 ),
               ),
             );
          },
          staggeredTileBuilder: (index){
            return StaggeredTile.count(2, index.isEven ? 2 : 1);  //第一个参数是横轴所占的单元数,第二个参数是主轴所占的单元数
          },
          padding: EdgeInsets.all(8),
          mainAxisSpacing: 8.0,
          crossAxisSpacing: 8.0,
      ),

itemBuilder是每个瀑布流的item,imageUrl可以改成数组,这样就可以显示不同的图片。crossAxisCount是指横轴总宽度被分为4份,总计四个单元格,itemCount指总元素数量

staggeredTileBuilder: (index){
            return StaggeredTile.count(2, index.isEven ? 2 : 1);  //第一个参数是横轴所占的单元数,第二个参数是主轴所占的单元数
          },

我设置每个item的宽度占2个单元格,这样就是一行两个,左右平分空间,高度偶数item为2,奇数为1,这个如果每个item高度都有不同高度的话,可以将item的高度用数组导入。

具体效果:
在这里插入图片描述

完整代码如下所示:

import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:cached_network_image/cached_network_image.dart';

class Staggered extends StatefulWidget {
  @override
  _StaggeredState createState() => _StaggeredState();
}

class _StaggeredState extends State<Staggered> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("瀑布流"),
      ),
      body: StaggeredGridView.countBuilder(
          crossAxisCount: 4,   //横轴单元格数量
          itemCount: 20,  //元素数量
          itemBuilder: (context,i){
             return new Material(
               elevation: 8.0,
               borderRadius: BorderRadius.all(Radius.circular(8.0)),
               child: new CachedNetworkImage(
                 imageUrl: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg1.yuntouxiang.com%2Fuploads%2F20130521%2F21-022304_646.jpg&refer=http%3A%2F%2Fimg1.yuntouxiang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613615452&t=590bdef8fdbfb5c972066acbeca6543d",
                 imageBuilder: (context, imageProvider) => Container(
                   decoration: BoxDecoration(
                     borderRadius: BorderRadius.all(Radius.circular(8.0)),
                     image: DecorationImage(
                         image: imageProvider,
                         fit: BoxFit.fitHeight,
                         ),
                   ),
                 ),
               ),
             );
          },
          staggeredTileBuilder: (index){
            return StaggeredTile.count(2, index.isEven ? 2 : 1);  //第一个参数是横轴所占的单元数,第二个参数是主轴所占的单元数
          },
          padding: EdgeInsets.all(8),
          mainAxisSpacing: 8.0,
          crossAxisSpacing: 8.0,
      ),
    );
  }
}

基础篇


Flutter之自定义底部导航条以及页面切换实例——Flutter基础系列

Flutter之自定义顶部Tab——Flutter基础系列

Flutter之抽屉组件drawer,设置drawer宽度——Flutter基础系列

Flutter之自定义按钮RaisedButton、OutlineButton、IconButton等——Flutter基础系列

Flutter之实现生成二维码,扫描二维码——Flutter基础系列

Flutter之基本路由,命名路由跳转,返回上一页,替换路由和返回根路由——Flutter基础系列

Flutter之瀑布流效果——Flutter基础系列——Flutter基础系列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter之瀑布流效果——Flutter基础系列 的相关文章

随机推荐

  • 基于模糊控制算法的水位控制研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及讲解 1 概述 模糊逻辑控制是由模糊集理论 模糊语言变量
  • win7下安装高版本的nodejs16及以上版本

    win7下安装nodejs16 4 0 1 nodejs下载地址 https nodejs org dist v13 9 0 https nodejs org dist latest v16 x 2 通过以上路径 分别下载下面资源包 nod
  • SpringMVC拦截器

    1 拦截器的三个抽象方法 SpringMVC中的拦截器有三个抽象方法 preHandle 控制器方法执行之前执行preHandle 其boolean类型的返回值表示是否拦截或放行 返回true为放行 即调用控制器方法 返回flse表示拦截
  • 【分享】原力计划的初衷 【探讨】新的一年,你对原力计划有哪些期待?

    课前小差 哈喽 大家好 我是几何心凉 这是一份全新的专栏 唯一得倒CSDN王总的授权 来对于我们每周四的绿萝时间 直达CSDN 直播内容进行总结概括 让大家能够省去看直播回放的时间也能够了解直播内容和官方的最新动态 希望大家给予凉哥最大的支
  • 【阿里三面】好险!本以为是场普通的阿里面试,没想到二面就迎来了P9大佬

    前言 阿里 我是在BOSS上投的简历 之前也投过一次 简历都没通过筛选 后来让前辈帮我改了一下简历 重新投另一个部门 获得了面试机会 5月15日 中午HR打电话过来预约了下午4点半面试 说会在线笔试 让我准备好 一面 70分钟 突击电话面试
  • 基于FPGA的正弦波发生器设计与实现

    基于FPGA的正弦波发生器设计与实现 摘要 本文介绍了一种基于FPGA的正弦波发生器的设计与实现 通过使用FPGA的数字信号处理功能 可以实现高精度 高性能的正弦波生成 文章首先介绍了DDS Direct Digital Synthesis
  • 大骗局星钻共享拍卖不为人知的的秘密

    钻石恒久远 一颗永流传 作为当之无愧的宝石之王 钻石从开采到初步打磨再到深层加工最后到售卖 需要经历无数道工序流程 平均每开采一克拉的钻石胚 需要至少处理250吨的矿石 而这一克拉的钻石胚还需要经过切磨雕琢 最后以闪耀动人的钻石成品面世时
  • vue自定义校验规则的动态必填字段

  • 10秒学会codeblocks里批量替换变量名

    10秒学会codeblocks里批量替换变量名 我想把下面代码所有的frontt改成front 应该怎么做呢 typedef struct QueueElementType element MAXSIZE int frontt int re
  • Latex基本使用

    一 文字 加粗 textbf 文字 加颜色 textcolor 颜色 文字 如 textcolor cyan TABLE II 一个单词的首字母下沉占用两行 单词剩余部分大写 IEEEPARstart 单词首字母 单词剩余部分 如 IEEE
  • Linux下的FILE*结构体

    FILE 结构体解析 struct file结构体定义在include Linux fs h中定义 文件结构体代表一个打开的文件 系统中的每个打开的文件在内核空间都有一个关联的 struct file 它由内核在打开文件时创建 并传递给在文
  • 笔记本网络计算机和设备不可见,xp电脑不显示无线网络的七种原因和解决方法...

    xp纯净版系统电脑打开后发现桌面右下角不显示无线网络 如果要设置无线网络都不知道从哪里下手 这到底是怎么回事 造成xp系统不显示无线网络的原因有很多种 下面和大家讲解一下xp电脑不显示无线网络的七种原因和解决方法 故障原因 一 无线网卡驱动
  • k8s config多集群管理

    k8s config多集群管理 contexts 查看 kubectl config get contexts 创建 kubectl config set context my context 修改 kubectl config set c
  • pycharm整体缩进,整体取消缩进

    整体缩进 tab 整体取消缩进 tab shift
  • [游戏商业化]一些基础概念点,做个记录

    A 商业化业务逻辑 核心 三者之间的关系 产品的最终目标是实现盈利 获取利润 产品的主要目标是发展用户 吸引用户 留下用户 通过投放产品广告为产品带来用户 变现 广告变现 是最简单 最有效且不存在领域限制的变现方式 通过在App上展示广告主
  • 数据结构--- 树

    一 知识补充 定义 树是一种数据结构 它是由n n 0 个有限节点组成一个具有层次关系的集合 把它叫做 树 是因为它看起来像一棵倒挂的树 也就是说它是根朝上 而叶朝下的 它具有以下的特点 每个节点有零个或多个子节点 没有父节点的节点称为根节
  • 独家专访BlockCity区块城市徐志翔:DAO是未来元宇宙的核心

    转载说明 最近随着ChatGPT的出圈 整个AIGC领域倍受关注 唱衰媒体人的声音也开始不绝于耳 但看到这样有质量的长文 我想也不是每个媒体人都将会被AI替代吧 本文来自前瞻 元宇宙观察 专栏记者采访 作者声明分享无版权限制 如下为全文内容
  • 基础算法题 —— 合唱队(最长递增子序列)

    题解 枚举每个位置左右侧分别所能站的做多人 自左向右递增 求每个位置左边最多可站多少人 含自己 dp1 自右向左递增 求每个位置右边最多可站多少人 含自己 dp2 选择第 i 个位置不移动的情况下 合唱队所能站的人数 dp1 i dp2 i
  • 学习文件day20--关于File

    java io File File的每一个实例用于表示硬盘上的一个文件或目录 实际上表示的是一个抽象路径 File可以 1 访问其表示的文件或目录的属性信息 名字 大小 修改时间等 2 操作文件或目录 创建 删除 3 访问一个目录中的所有子
  • Flutter之瀑布流效果——Flutter基础系列

    需求 相信android和ios的瀑布流效果大家都试过 网上有很多实现方法和开源库 今天我来为大家介绍一下如何在Flutter中实现瀑布流 整理一下方便以后学习 顺便分享给大家 一 生成二维码 1 导入依赖 在 pubspec yaml 中