Flutter开发之滚动Widget

2023-11-10

移动端数据量比较大时,我们都是通过列表来进行展示的,比如商品数据、聊天列表、通信录、朋友圈等。
在Android中,我们可以使用ListView或RecyclerView来实现,在iOS中,我们可以通过UITableView来实现。
在Flutter中,我们也有对应的列表Widget,就是ListView

一、ListView

1.1、ListView的基本使用

ListView可以沿一个方向(垂直或水平方向,默认是垂直方向)来排列其所有子Widget。

一种最简单的使用方式是直接将所有需要排列的子Widget放在ListView的children属性中即可。

我们直接使用ListView进行演练:

class MyHomeBody extends StatelessWidget {
  final TextStyle textStyle = TextStyle(fontSize: 20, color: Colors.redAccent);

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: <Widget>[
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text("人的一切痛苦,本质上都是对自己无能的愤怒。", style: textStyle),
        ),
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text("人活在世界上,不可以有偏差;而且多少要费点劲儿,才能把自己保持到理性的轨道上。", style: textStyle),
        ),
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text("我活在世上,无非想要明白些道理,遇见些有趣的事。", style: textStyle),
        )
      ],
    );
  }
}

效果图如下:
在这里插入图片描述
1.2、ListTitle的使用

在开发中,我们经常见到一种列表,有一个图标或图片(Icon),有一个标题(Title),有一个子标题(Subtitle),还有尾部一个图标(Icon)。

我们使用ListTitle来实现:

class MyHomeBody extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: <Widget>[
        ListTile(
          leading: Icon(Icons.people, size: 36,),
          title: Text("联系人"),
          subtitle: Text("联系人信息"),
          trailing: Icon(Icons.arrow_forward_ios),
        ),
        ListTile(
          leading: Icon(Icons.email, size: 36,),
          title: Text("邮箱"),
          subtitle: Text("邮箱地址信息"),
          trailing: Icon(Icons.arrow_forward_ios),
        ),
        ListTile(
          leading: Icon(Icons.message, size: 36,),
          title: Text("消息"),
          subtitle: Text("消息详情信息"),
          trailing: Icon(Icons.arrow_forward_ios),
        ),
        ListTile(
          leading: Icon(Icons.map, size: 36,),
          title: Text("地址"),
          subtitle: Text("地址详情信息"),
          trailing: Icon(Icons.arrow_forward_ios),
        )
      ],
    );
  }
}

效果图如下:
在这里插入图片描述

1.3、垂直方向滚动

我们可以通过设置 scrollDirection 参数来控制视图的滚动方向。

我们通过下面的代码实现一个水平滚动的内容:

class MyHomeBody extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return ListView(
      scrollDirection: Axis.horizontal,
      itemExtent: 200,
      children: <Widget>[
        Container(color: Colors.red, width: 200),
        Container(color: Colors.green, width: 200),
        Container(color: Colors.blue, width: 200),
        Container(color: Colors.purple, width: 200),
        Container(color: Colors.orange, width: 200),
      ],
    );
  }
}

需要注意的是,我们给Container设置width,否则它没有宽度,不能正常显示;我们给ListView设置一个itemExtent,该属性会设置滚动方向上每个item所占据的宽度。
在这里插入图片描述

2.1、ListView.build

通过构造函数中的children传入所有的子Widget有一个问题:默认会创建出所有的子Widget。
但是对于用户来说,一次性构建出所有的Widget并不会有什么差异,但是对于我们的程序来说会产生性能问题,而且会增加首屏的渲染时间。
我们可以ListView.build来构建子Widget,提供性能。

2.1.1、ListView.build基本使用

ListView.build适用于子Widget比较多的场景,该构造函数将创建子Widget交给了一个抽象的方法,交给ListView进行管理,ListView会在真正需要的时候去创建子Widget,而不是一开始就全部初始化好。

ListView.build方法有两个重要参数:

  1. itemBuilder:列表项创建的方法。当列表滚动到对应位置的时候,ListView会自动调用该方法来创建对应的子Widget。类型是IndexedWidgetBuilder,是一个函数类型。
  2. itemCount表示列表项的数量,如果为空,则表示ListView为无限列表。
class MyHomeBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: 100,
      itemExtent: 80,
      itemBuilder: (BuildContext context, int index) {
        return ListTile(title: Text("标题$index"), subtitle: Text("详情内容$index"));
      }
    );
  }
}

在这里插入图片描述

2.1.2、ListView.build动态数据
之前搞了一个test.json文件,里面的数据如下:

{
  "status": "0000",
  "message": "success",
  "data": {
    "title": {
      "id": "001",
      "name" : "蔬菜"
    },
    "content": [
      {
        "id": "001",
        "value":"白菜"
      },
      {
        "id": "002",
        "value":"萝卜"
      },
      {
        "id": "003",
        "value":"黄瓜"
      },
      {
        "id": "004",
        "value":"西红柿"
      },
      {
        "id": "005",
        "value":"茄子"
      },
      {
        "id": "006",
        "value":"冬瓜"
      }
    ]
  }
}

又写了一个model:

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';

class ContentModel{
  String status;
  String message;
  Data data;
  ContentModel.fromMap(Map<String,dynamic> json){
    this.status = json["status"];
    this.message = json["message"];
    var data = json["data"];
    this.data = Data.fromMap(data["title"],data['content']);
  }
}
Future<List<contentItem>> getContents() async{
  var jsonString = await rootBundle.loadString('json/test.json');
    final jsonResult = json.decode(jsonString);
    Map map = new Map<String, dynamic>.from(jsonResult);
    var data = jsonResult["data"];
    List<contentItem> contents = new List();
    for(Map<String,dynamic>map in data["content"]){
      contents.add(contentItem.fromMap(map));
    }
    return contents;
}
class Data{
  Datatitle title;
  List <contentItem> contents;
  Data.fromMap(Map<String,dynamic> title,List<dynamic> content){

    this.title = Datatitle.fromMap(title);
    var contents = content;
    this.contents = content.map((item) {
      return contentItem.fromMap(item);
    }).toList();
  }
}
class Datatitle{
  String id;
  String name;
  Datatitle.fromMap(Map<String,dynamic>title){
    this.id = title['id'];
    this.name = title['name'];
  }
}
class contentItem{
  String id;
  String value;
  contentItem.fromMap(Map<String,dynamic>title){
    this.id = title['id'];
    this.value = title['value'];
  }
}

现在我们用json数据来展示一个列表。
现在我们进行一个思考

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

Flutter开发之滚动Widget 的相关文章

随机推荐

  • oswatch

    作者 eygle English Version 转载时请以超链接形式标明文章 出处和作者信息及 本声明 链接 http www eygle com archives 2007 07 oracle os watcher html 站内相关文
  • Java虚拟机 -- 垃圾收集器

    介绍垃圾收集器之前先要了解三个知识点 Stop the World JVM由于要执行GC而停止应用程序的执行 任何一种GC算法中都会发生 多数GC优化通过减少Stop the world发生的时间来提高程序性能 Safepoint 安全点
  • 团队共创法成功实施的几个重点

    转自 http blog sina com cn s blog 503d1fff0101bmz3 html 团队共创法是参与的科技 Technology of Participation ToPTM 方法之一 创始於文化事业学会 Insti
  • FileInputStream(文件字节输入流)

    目录 FileInputStream 文件字节输入流 1 InputStream 常用的子类 2 FileInputStream介绍 2 1 构造方法摘要 2 2 方法摘要 2 3 应用实例 请使用FileInputStream读取 hel
  • 锐捷睿易无线网桥IP地址和WIFI密码

  • 交易信号有效性测算1——N日涨跌幅

    在交易信号发出后 我们需要一些程序化的流程 来验证信号的有效性 其中信号发出后N日的涨跌幅就是一个比较常见的任务 布林带交易策略 我们以布林带 BOLL 交易策略为示例 中轨线 N日移动平均线 上轨线 中轨线 k 标准差 下轨线 中轨线 k
  • C语言 指针的内容

    目录 一 指针与变量 指针的含义 1 1 指针类型和指针变量 二 指针操作 三 指针与数组 3 1 用指针标识整型数组 3 2 指针运算 3 2 3指针数组 3 3 3 字符串指针 四 字符串内容 4 1 单字符的输入输出 4 2 函数 4
  • [YOLO专题-2]:总体-YOLO目标检测的网络总体架构与核心概念

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122118894 目录 前言说明 第1
  • Sqli-labs——lesson11

    在11关是登录界面了 我们可以先用bp抓包来看它的post请求来再在Hackbar里面的post data里面对数据进行操作 1 在对uname的admin加上 后回显错误 说明此处存在注入漏洞 2 首先先在username中验证 用 or
  • matlab读.h5文件

    之前用 python 给 nuswide 提取了 VGG19 特征 因为文件太大 超过 mat 限制 存成 h5 见 1 现在一个 matlab 程序要读 可以用 h5disp 查看 h5 文件内容的结构 各个 datasets 然后用 h
  • DDK(Driver Developer Kit)和WDK(Windows Driver Kit)的区别

    首先 先从基础的东西说起 开发WINDOWS下的驱动程序 需要一个专门的开发包 如 开发JAVA程序 我们可能需要一个JDK 开发WINDOWS应用程序 我们需要WINDOWS的SDK 现在开发WINDOWS下的驱动程序 我们需要一个DDK
  • 个人兴趣项目汇总

    实时多人2d监测平台 deh传感器数据监控大屏 deh数字孪生 three js deh故障诊断软件系统 SAR故障诊断系统 自动化工厂展示大屏 Minest数据集数字检测平台 汇总在线展示链接
  • Java代码审计之命令执行漏洞

    进行代码审计时遇到一个比较典型命令执行漏洞 适合新手学习 给大家分享下整个过程 从代码中可以看出来程序只使用trim 方法对jdk进行了两遍的空格过滤 然后直接和后面拼接的命令一起执行 接着来找一下这个方法的调用链 可以看到这里依次调用了3
  • jquery怎么获取radio的值

    1 获取选中值 三种方法都可以 input radio checked val input type radio checked val input name rd checked val
  • java 实体类 临时注解_MyBatis-Plus 常用注解

    TableName TableId 主键专属 比如数据中的表中的字段是id 但是实体类是userId 那么就需要在userId上打上这个注解 用法 设置主键映射 value映射主键字段的名字 type 设置主键类型 主键的生成策略 圈起来的
  • git提交代码完整目录(详细)

    1 找到需要提交的git代码 2 初始化 git init 3 查询状态 git status 4 添加代码 git add test txt test txt是需要提交的文件 git add all 提交所有 5 git文件commit仓
  • DKVMN知识追踪描述

    由于在线学习课程的兴起 学习者在课程学习过程中有很多习题练习的记录 利用这些记录 知识追踪 Knowledge Tracing 希望通过对学习者过往练习的结果分析其当前对一些概念的掌握程度 知识追踪任务可以形式化为一个有监督的序列学习问题
  • eclipse + armgcc + pyocd(CMSIS-DAP) 进行嵌入式MCU Debug

    eclipse armgcc pyocd CMSIS DAP 进行嵌入式MCU Debug 由于中美贸易战的影响 备用方案将采用国产MCU 经过乱开发委员会的评估 认为华大 HDSC 的MCU性价比不错 但是keil官网找不到所选芯片的pd
  • Java thread中对异常的处理策略

    https www cnblogs com googlemeoften p 5769216 html
  • Flutter开发之滚动Widget

    移动端数据量比较大时 我们都是通过列表来进行展示的 比如商品数据 聊天列表 通信录 朋友圈等 在Android中 我们可以使用ListView或RecyclerView来实现 在iOS中 我们可以通过UITableView来实现 在Flut