1.ListView的简单介绍

ListView是最常用的可以滚动组件之一,
它可以沿一个方向进行线性排列所有的子组件。
下面是ListView的属性值介绍: scrollDirection:列表的滚动方向,
可选值有Axis的horizontal和vertical,
默认是垂直方向上滚动。 controller:控制器,与列表滚动相关,比如监听列表的滚动事件。 physics: 列表滚动至边缘后继续拖动的物理效果,
Android与iOS效果不同。
Android会呈现出一个波纹状(对应ClampingScrollPhysics),
而iOS上有一个回弹的弹性效果(对应BouncingScrollPhysics)。
如果你想不同的平台上呈现各自的效果可以使用AlwaysScrollableScrollPhysics,
它会根据不同平台自动选用各自的物理效果。如果你想禁用在边缘的拖动效果,
那可以使用NeverScrollableScrollPhysics; shrinkWrap: 该属性将决定列表的长度是否仅包裹其内容的长度。
当ListView嵌在一个无限长的容器组件中时,
shrinkWrap必须为true,否则Flutter会给出警告; padding: 列表内边距; itemExtent: 子元素长度。
当列表中的每一项长度是固定的情况下可以指定该值,
有助于提高列表的性能
(因为它可以帮助ListView在未实际渲染子元素之前就计算出每一项元素的位置); children: 容纳子元素的组件数组。

2.ListTile 属性简介

this.leading,              // 内容的==>前置图标
this.title, // 内容的==>标题
this.subtitle, // 内容的==>副标题
this.trailing, // 内容的==>后置图标
this.isThreeLine = false, // 内容的==>是否三行显示
this.dense, // 内容的==>直观感受是整体大小
this.contentPadding, // 内容的==>内容内边距
this.enabled = true, // 内容 是否禁用
this.onTap, // item onTap 点击事件
this.onLongPress, // item onLongPress 长按事件
this.selected = false, // item 是否选中状态

3.ListView的基本使用

我们做一个新闻列表;
结构非常的简单:有主标题和副标题
title(主标题)和subtitle(subtitle)
我们一起来看看长成什么样子。
class MyCont extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(children: <Widget>[
ListTile(
// 主标题
title: Text('Flutter 由 Google 的工程师团队打造,用于创建高性能、跨平台的移动应用',
//文字左对齐
textAlign: TextAlign.left,
//超出显示省略号
overflow: TextOverflow.ellipsis,
style: TextStyle(
//数字必须是Double类型的
fontSize: 20.0,
// 设置字体的颜色
color: Color.fromARGB(200, 100, 100, 8)
)
),
// 副标题
subtitle: Text('你好flutter'),
),
ListTile(
title: Text('Flutter 由 Google 的工程师团队打造,用于创建高性能、跨平台的移动应用'),
subtitle: Text('你好flutter'),
),
]);
}
}

4.listView列表设置前置图标

class MyCont extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(children: <Widget>[
ListTile(
// 主标题
// 在前面设置图标
leading: Icon(
//设置图标类型
Icons.settings,
//0x后面开始 两位FF表示透明度16进制,
color: Color(0xFFFFB6C1),
//这是图标的大小
size: 30.0
),
// 在后面设置图标
// trailing: Icon(Icons.accessible),
title: Text('flutter教程_2021 Dart Flutter入门实战视频教程132讲',
//文字左对齐
textAlign: TextAlign.left,
//超出显示省略号
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 20.0, //数字必须是Double类型的
// 设置字体的颜色
color: Color(0xFFFFB6C1)
)
),
subtitle: Text('不管是Ios还是Android开发都可以在flutter官网上查到安装及使用步骤,这里我就不累述太多'),
),
]);
}
}

5.设置前置图片

class MyCont extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(children: <Widget>[
ListTile(
// 主标题
// 通过leading可以将图片放在前面
leading: Image.network(
"https://giidu.c/ster/src=http%3A%2F%2Ft14.npg"),
title: Text(
'flutter教程_2021 Dart Flutter入门实战视频教程132讲',
textAlign: TextAlign.left, //文字左对齐
overflow: TextOverflow.ellipsis, //超出显示省略号
style: TextStyle(
fontSize: 20.0, //数字必须是Double类型的
// 设置字体的颜色
color: Color(0xFFFFB6C1)
)
),
subtitle: Text('不管是Ios还是Android开发都可以在flutter官网上查到安装及使用步骤,这里我就不累述太多'),
),
]);
}
}

6.垂直列表

class MyCont extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(children: <Widget>[
Container(
width: 750.0,
height: 200.0,
color:Color(0xFFFFB6C1),
// 外边距 左上右下,跟css不一样哈
margin: EdgeInsets.fromLTRB(10, 10, 10, 0),
),
Container(
width: 750.0,
height: 200.0,
color: Color(0xFFFFB6C1),
// 外边距 左上右下,跟css不一样哈
margin: EdgeInsets.fromLTRB(10, 10, 10, 0),
)
]);
}
}

7.水平排列

class MyCont extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
height: 200.0,
child:new ListView(
// 水平排列
scrollDirection: Axis.horizontal, children: <Widget>[
Container(
width: 220.0,
height: 200.0,
color: Color(0xFFFFB6C1),
// 外边距 左上右下,跟css不一样哈
margin: EdgeInsets.fromLTRB(10, 10, 10, 0),
),
Container(
width: 220.0,
height: 200.0,
color: Color(0xFFFFB6C1),
// 外边距 左上右下,跟css不一样哈
margin: EdgeInsets.fromLTRB(10, 10, 10, 0),
),
Container(
width: 220.0,
height: 200.0,
color: Color(0xFFFFB6C1),
// 外边距 左上右下,跟css不一样哈
margin: EdgeInsets.fromLTRB(10, 10, 10, 0),
),
]
)
);
}
}

8.动态列表

在项目的实际开发过程中;
我们会有很多的列表;
我们想将ListView中children中的代码封装成为一个函数。
方便后期的管理
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(appBar: AppBar(title: Text('首页')), body: MyCont()),
//设置顶部的颜色
theme: ThemeData(primarySwatch: Colors.yellow),
);
}
} class MyCont extends StatelessWidget {
// Lis里面的数据必须是Widget组件;
// _backDataList方法下划线开头,表示当前这个类私有的。
List<Widget> _backDataList() {
return [
ListTile(
title: Text('我是新闻标题1'),
),
ListTile(
title: Text('我是新闻标题2'),
),
ListTile(
title: Text('我是新闻标题3'),
),
ListTile(
title: Text('我是新闻标题4'),
)
];
} @override
Widget build(BuildContext context) {
return ListView(children: this._backDataList());
}
}

9.往数组中添加数据进行循环

class MyCont extends StatelessWidget {
// Lis里面的数据必须是Widget组件;
// _backDataList方法下划线开头,表示当前这个类私有的。
List<Widget>_backDataList() {
// 声明了一个数组,里面的数据类型是Widget
List<Widget> list = [];
for (var i = 0; i < 10; i++) {
list.add(ListTile(
title: Text('我是新闻标题$i'),
));
}
return list;
}
@override
Widget build(BuildContext context) {
return ListView(children: this._backDataList());
}
}

10.为什么要使用ListView.builder

ListView.builder下的两个属性值
itemCount:指定被循环数组的长度
itemBuilder:它有2个参数。
itemBuilder(contText, index) {
contText表示的循环的内容
index表示循环的索引值
} 如果itemBuilder下是一个封装的函数,
不要添加括号,因为括号表示调用;
直接itemBuilder:this.youFunc就可以了 使用ListView.builder的优势:
ListView.builder适合列表项比较多(或者无限)的情况,
只有当子组件真正显示的时候列表才会被创建,
也就说通过该构造函数创建的ListView是支持基于Sliver的懒加载模型的。
也就是说使用ListView.builder可以提升性能。
下面我们将会使用ListView.builder来创建一个列表
在lib目录下创建一个res
在res目录下创建demo.dart
demo.dart文件下有数据的哈
import 'res/demo.dart';
List listData = [
{
'title': 'Python 创作季,秀出你的 Python 文章
}
]
后面使用listData就可以直接获取数据了哈 class MyCont extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView.builder(
// itemCount:指定该数组的长度
itemCount: listData.length,
//itemBuilder 会进行循环遍历
itemBuilder: (contText, index) {
return ListTile(
title: Text(listData[index]['title']),
//还有很多的属性xxxx........
);
},
);
}
}
前面我们说了,使用ListView.builder可以提高性能;
但是我们发现了itemBuilder下如果有很多属性的话;
那么就会变得非常的臃肿的;
后期是不利于我们维护;
那么我们能不能将 itemBuilder中的抽离出去了?
经过我的查询文档发现是可以的
请看下面:

11.将itemBuilder中的属性抽离出去

我们可以将原来itemBuilder下的代码
封装成为一个方法放置在自定义的_getListData下;
方便我们后期的维护以及修改
class MyCont extends StatelessWidget {
//自定义的方法
Widget _getListData(contText, index){
return ListTile(
title: Text(listData[index]['title']),
);
} @override
Widget build(BuildContext context) {
return ListView.builder(
// itemCount:指定该数组的长度
itemCount: listData.length,
//this._getListData是不需要加括号的;
// 我们这里表示的复制该方法
// this._getListData()表示的是直接去调用这个方法
itemBuilder:this._getListData
);
}
}

12.ListView children与ListView.builder的区别

通过前面的例子,
我们可以发现ListView有默认构造函数。
ListView默认构造函数有一个children参数,
children接受一个Widget列表[List], 通过children参数的形式接受的子组件列表。
这种方式需要将所有的children都提前创建好;
因此需要提前做大量的工作;
所以:这种形式只适合少量的子组件的情况 ListView.builder
ListView.builder适合列表项比较多(或者无限)的情况,
只有当子组件真正显示的时候列表才会被创建,
也就说通过该构造函数创建的ListView是支持基于Sliver的懒加载模型的。

13.制作一个好看的列表

我们将使用后置图标trailing这个属性来完成图片后置。
同时我们将给一个容器组件Container;
容器组件的宽高来限制图片的大小;
我们将会对图片进行裁剪,
在lib目录下创建一个res
在res目录下创建demo.dart
demo.dart文件下有数据的哈
import 'res/demo.dart';
List listData = [
{
'title': 'Python 创作季,秀出你的 Python 文章
}
] class MyCont extends StatelessWidget {
// Lis里面的数据必须是Widget组件;
// _backDataList方法下划线开头,表示当前这个类私有的。
List<Widget> _backDataList() {
var temtepleList = listData.map((value) {
return ListTile(
title: Text(
value['title'],
// 超出显示省略号
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 16.0, color: Color(0xFF86909c)),
),
subtitle: Text(
value['cont'],
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 13.0, color: Color(0xFF86909c)),
),
trailing: Container(
width: 90.0, //容器宽
height: 70.0, //容器高
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.0),
image: DecorationImage(
image: NetworkImage(
value['img'],
),
alignment: Alignment.topLeft, //左上角居中
fit: BoxFit.cover, //裁剪,充满整个容器。不会变形
)
)
)
);
});
// 转化成为一个数组
return temtepleList.toList();
} @override
Widget build(BuildContext context) {
return ListView(children: this._backDataList());
}
}

flutter中 ListView的使用的更多相关文章

  1. flutter中ListView的详细讲解

    1.ListView的简单介绍 ListView是最常用的可以滚动组件之一, 它可以沿一个方向进行线性排列所有的子组件. 下面是ListView的属性值介绍: scrollDirection:列表的滚 ...

  2. 从零学习Fluter(四):Flutter中ListView组件系列详展

    今天继续研究了一些Flutter,主要时关于ListVIew那一块的东西,有 SingleChildScrollViewListViewGridViewCustomScrollView 感觉Flutt ...

  3. Flutter 中 ListView 的使用

    这个小例子使用的是豆瓣 API 中 正在上映的电影的开放接口,要实现的主要效果如下: JSON 数据结构 Item 结构 Item 的结构是一个 Card 包含着一个 Row 然后这个 Row 里面左 ...

  4. flutter系列之:flutter中listview的高级用法

    目录 简介 ListView的常规用法 创建不同类型的items 总结 简介 一般情况下,我们使用Listview的方式是构建要展示的item,然后将这些item传入ListView的构造函数即可,通 ...

  5. Flutter: 图解 ListView 的多种绑定方式

       小菜昨天刚学习了一下底部状态栏 BottomNavigationBar 的基本使用方法,今天学习一下 ListView 的基本用法.       小菜觉得 Flutter 中 ListView ...

  6. mvp 在 flutter 中的应用

    在 Android 应用程序开发过程中,我们经常会用到一些所谓的架构方法,如:mvp,mvvm,clean等.之所以这些方法会被推崇是因为他们可以大大的解耦我们的代码的功能模块,让我们的代码在项目中后 ...

  7. Flutter中用ListView嵌套GridView报错异常

    flutter中的ListView组件和GridView组件都是常用的布局组件,有时候ListView中需要嵌套GridView来使用,例如下图: 这种情况就需要在ListView里面再嵌套一个Gri ...

  8. 在Flutter中构建布局

    这是在Flutter中构建布局的指南.首先,您将构建以下屏幕截图的布局.然后回过头, 本指南将解释Flutter的布局方法,并说明如何在屏幕上放置一个widget.在讨论如何水平和垂直放置widget ...

  9. flutter中的生命周期函数

    前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的时机做该做的事情,flutter中的State生命周期和android以及React Native的生命周期类似. 先看一张 ...

  10. Flutter 中的基本路由

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航,并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...

随机推荐

  1. Codeforces Round 901 (Div

    C. Jellyfish and Green Apple 题解 显然\(n \% m =0\),答案一定为\(0\) 如果\(n > m\),我们显然可以将\(n / m\)的苹果分给每个人,然 ...

  2. 使用PicGo存储markdown图片(阿里云或者github)

    PicGo代替极简图床 之前使用极简床图,但是后来好像挂了,真是一件悲伤的事,最近才发现了一个神器,开源的PicGo,已经有各个平台的版本了.链接如下:https://github.com/Molun ...

  3. Flutter查漏补缺2

    Flutter的理念架构 Flutter架构分为三层 参考官方文档 Framework层(dart) flutter engine层(C/C++) embeder层(platform-specific ...

  4. [Blazor] 一文理清 Blazor Identity 鉴权验证

    一文理清 Blazor Identity 鉴权验证 摘要 在现代Web应用程序中,身份认证与授权是确保应用安全性和用户数据保护的关键环节.Blazor作为基于C#和.NET的前端框架,提供了丰富的身份 ...

  5. 2024年1月Java项目开发指南16:用户自由选择字段查询、是否模糊查询

    我们希望用户可以自己控制是否要模糊查询 用户可以自由的选择字段去查询. 如上图,我在前端页面准备了 多选框:决定是否模糊查询.(True or False) 下拉选择框:决定要查询关键词的所属字段 输 ...

  6. go编译可以指定os和arch

    是的,Go 编译器支持通过环境变量来指定目标操作系统(OS)和架构(Arch).这允许你为不同的平台交叉编译 Go 程序.你可以使用 GOOS 和 GOARCH 环境变量来指定目标系统. 例如,如果你 ...

  7. Qt编写物联网管理平台38-多种数据库支持

    一.前言 本系统设计之初就要求支持多种不同的数据库,比如sqlite.mysql.postgres.sqlserver等,甚至包括国产数据库比如人大金仓kingbase等,(由于现在国产化的大力推进, ...

  8. Qt音视频开发20-海康sdk本地播放

    一.前言 海康sdk中包含了MP4解码播放库,对应的API函数都是PlayM4开头的,顾名思义播放MP4,海康的视频默认可以保存成MP4文件,可以用通用的播放器来播放,这就是为啥前面好多篇文章讲到的各 ...

  9. 网络编程懒人入门(十三):一泡尿的时间,快速搞懂TCP和UDP的区别

    本文引用了作者Fundebug的"一文搞懂TCP与UDP的区别"一文的内容,感谢无私分享. 1.引言 网络协议是每个搞网络通信应用开发(比如IM.推送.网关等等)的程序员都必须要掌 ...

  10. Java子线程无法获取Attributes的解决方法

    在Java多线程编程中,开发者经常会遇到子线程无法获取主线程设置的Attributes的问题.Attributes通常用于存储与当前线程相关的数据,尤其在Web应用中,它们常用于请求上下文的管理.然而 ...