【Flutter】【widget】listview 的快速学习

51 篇文章 4 订阅
订阅专栏

widget名字:listview

  • 列表,可以滚动,快速创建可滚动列表

功能:

功能:

  1. 滚动一个列表
  2. 注意点: listview 的元素如果超过的屏幕,那么flutter 会销毁他,包括他的状态state,但是addAutomaticKeepAlives 这个选项默认是true的,保存他们的状态,如果才不会被销毁,你可以尝试下addAutomaticKeepAlives设置为fasle。状态会被销毁

使用实例和代码:

import 'package:flutter/material.dart';

void main() {
 runApp(const MyApp());
}

class MyApp extends StatelessWidget {
 const MyApp({super.key});

 // This widget is the root of your application.
 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     title: 'Flutter Demo',
     theme: ThemeData(
       // This is the theme of your application.
       //
       // Try running your application with "flutter run". You'll see the
       // application has a blue toolbar. Then, without quitting the app, try
       // changing the primarySwatch below to Colors.green and then invoke
       // "hot reload" (press "r" in the console where you ran "flutter run",
       // or simply save your changes to "hot reload" in a Flutter IDE).
       // Notice that the counter didn't reset back to zero; the application
       // is not restarted.
       primarySwatch: Colors.blue,
     ),
     home: const MyHomePage(title: 'Flutter Demo Home Page'),
   );
 }
}

class Car {
 const Car({
   required this.name,
   required this.imageUrl,
 });

 final String name;
 final String imageUrl;
}

class MyHomePage extends StatefulWidget {
 const MyHomePage({super.key, required this.title});

 final String title;
 @override
 State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
//模型数组,图片的地址
 final List<Car> datas = const [
   Car(
     name: '保时捷918 Spyder',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-7d8be6ebc4c7c95b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '兰博基尼Aventador',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-e3bfd824f30afaac?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '法拉利Enzo',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-a1d64cf5da2d9d99?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: 'Zenvo ST1',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-bf883b46690f93ce?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '迈凯伦F1',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-5a7b5550a19b8342?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '萨林S7',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-2e128d18144ad5b8?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '科尼赛克CCR',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-01ced8f6f95219ec?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '布加迪Chiron',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-7fc8359eb61adac0?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '轩尼诗Venom GT',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-d332bf510d61bbc2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   ),
   Car(
     name: '西贝尔Tuatara',
     imageUrl:
         'https://upload-images.jianshu.io/upload_images/2990730-3dd9a70b25ae6bc9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240',
   )
 ];

 @override
 Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(
       title: Text(widget.title),
     ),
     body:
         //ListView 的一种形式,可以滚动,应用在widget 比较少的情况下。
         ListView(
                 physics: ClampingScrollPhysics(),//滚动的效果,NeverScrollablePhysics,BouncingScrollPhysics,ClampingScrollPhysics,FixedExtentScrollPhysics 自行尝试
       itemExtent: 120, //每个widget 的高,会覆盖到sizebox的高德设置
       children: List.generate(datas.length, (index) {
         return Card(
           elevation: 20,
           surfaceTintColor: Colors.amber,
           margin: const EdgeInsets.all(10),
           child: Image.network(
             datas[index].imageUrl,
             fit: BoxFit.cover,
           ),
         );
       }),
     ),
   );
 }
}

第二种形式:

         // ListView.builder(
            //     itemCount: datas.length //告知widget children 的个数。减少性能损耗
            //     ,
            //     itemBuilder: (context, int index) {
            //       return Card(
            //         elevation: 20,
            //         surfaceTintColor: Colors.red,
            //         margin: const EdgeInsets.all(10),
            //         child: Image.network(
            //           loadingBuilder: (context, child, loadingProgress) {
            //             //如果loadingProgress 已经是null 就显示图片widget
            //             if (loadingProgress == null) {
            //               return child;
            //             }
            //             //laoding widget
            //             return const CupertinoActivityIndicator();
            //           },
            //           datas[index].imageUrl,
            //           fit: BoxFit.cover,
            //         ),
            //       );
            //     }),


截图:

在这里插入图片描述

第三种:
            //第三种形式,widget 下面有一个下划线
            ListView.separated(
                itemBuilder: (context, int index) {
                  return Card(
                    elevation: 20,
                    surfaceTintColor: Colors.red,
                    margin: const EdgeInsets.all(10),
                    child: Image.network(
                      loadingBuilder: (context, child, loadingProgress) {
                        //如果loadingProgress 已经是null 就显示图片widget
                        if (loadingProgress == null) {
                          return child;
                        }
                        //laoding widget
                        return const CupertinoActivityIndicator();
                      },
                      datas[index].imageUrl,
                      fit: BoxFit.cover,
                    ),
                  );
                },
                separatorBuilder: (context, int index) {
                  return const Divider(
                    height: 10,
                    thickness: 10,
                    color: Colors.red,
                  ); //也可以是其他的widget
                },
                itemCount: datas.length));

截图:

在这里插入图片描述

第四种:
            ListView.custom(
                childrenDelegate: SliverChildBuilderDelegate(
                    childCount: datas.length, (context, int index) {
          return Card(
            elevation: 20,
            surfaceTintColor: Colors.red,
            margin: const EdgeInsets.all(10),
            child: Image.network(
              loadingBuilder: (context, child, loadingProgress) {
                //如果loadingProgress 已经是null 就显示图片widget
                if (loadingProgress == null) {
                  return child;
                }
                //laoding widget
                return const CupertinoActivityIndicator();
              },
              datas[index].imageUrl,
              fit: BoxFit.cover,
            ),
          );
        }))

ScrollController 控制ListView滚动

<1>滚动距离的监听

在listview 里面设置了固定单个widget的高度是120逻辑像素,所以当第一个widget 完全不可见的时候,滚动的具体刚好是120.这样就可以监听滚动的距离


  //控制器,控制滚动的位置等
  late final ScrollController _scrollController;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _scrollController = ScrollController()
      ..addListener(() {
        print(_scrollController.offset);
      });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body:
          //ListView 的一种形式,可以滚动,应用在widget 比较少的情况下。
          ListView(
        controller: _scrollController,
        itemExtent: 120, //每个widget 的高,会覆盖到sizebox的高德设置
        // scrollDirection: Axis.horizontal, //滚动的方向,水平滚动,还是垂直方向滚动
        children: List.generate(datas.length, (index) {
          return Card(
            elevation: 20,
            surfaceTintColor: Colors.amber,
            margin: const EdgeInsets.all(10),
            child: Image.network(
              datas[index].imageUrl,
              fit: BoxFit.cover,
            ),
          );
        }),
      ),);

在这里插入图片描述

     floatingActionButton: FloatingActionButton(
       onPressed: () {
         //跳转到顶部
         // _scrollController.jumpTo(0);

         //有动画效果的,跳转到顶部
         _scrollController.animateTo(0,
             duration: Duration(seconds: 1), curve: Curves.easeInBack);
       },
       child: Icon(Icons.upload),
     )
第 1-6 课:Flutter Widget 结构概览
持续学习中
09-22 445
Flutter 的面向对象的编程方式,吸取了 React 的编程组件化思维。Flutter 的所有类都可以看做是 Widget,大部分的类都是继承自 Widget 类。所有学习和了解 Flutter 有哪些 Widget、怎么分类的,对我们后续快速学习非常有用,也可以对 Flutter 的结构层级有一个大致的了解。本文将主要介绍: Flutter 的整体结构层级 Flutter 的...
Androidwidget使用listview布局
04-19
Androidwidget使用listview布局,快速上手,可以直接用在项目里面
flutter的key在widget list的作用以及必要性
weixin_34397291的博客
02-28 432
在做一个flutter的项目过程中,体会到了key在widget渲染中发挥的作用以及开发者需要避免的坑,在次提出共勉 与react的diff算法类似(vue的也是),flutter在渲染同级类似的item的时候也是采用key值判断来重新渲染的。因此如果你的业务中如果包含了一个同类型的widget list,记得要为每个widget加上一个...
Android API 中文 (42) —— ListView
weixin_34023863的博客
11-19 130
前言   关键字:Android API 中文 , Android 中文 API , android.widget.ListView     本章内容是 android.widget.ListView,译为"列表视图",版本为Android 2.2 r1,翻译来自"Tina",这是翻译组至今独立完成翻译最长的一篇 ,再次感谢"Tina"为大家带来优质的翻译稿 !期待你一起参与Android ...
Flutter--List列表组件
最新发布
Gaga246的博客
04-08 1115
列表组件的常用参数: (1) scrollDirection Axis Axis.horizontal表示水平列表,Axis.vertical垂直列表 (2) padding EdgeInsetsGeometry 内边距 (3) resolve bool 组件反向排序 (4) children List 列表元素。(2)图片列表 我们不仅仅可以使用上述的ListTile实现图片列表,使用Image和Text也是可以实现图文列表的。使用ListTile可以配合ListView快速实现垂直列表的效果。
Flutter ListWidget>放在Column中显示不全问题
fearlessnesszhang的博客
02-18 2537
目前有个简单页面的实现,其中放置List<Widget>数据时,显示不全。 目前实现方法: 1. 最上面分为一层 2.input框一层 3.SKU + QTY 为一个层 4.内容列表一层 代码: //最上面 HeadWidget( title: 'Receiving By Single SKU-Scan SKU', text: 'Cancel', onTap: () { // Navigator.of(contex.
Flutter入门:教程4 ListView
04-06
Flutter的Markdown和XML(Widget树)表示中,我们可以这样创建一个基本的ListView: ```dart import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget ...
Flutter Widget详解:常见Widget及其使用场景
Flutter Widget简介 ## 1.1 什么是Widget? 在Flutter中,一切皆为WidgetWidgetFlutter应用的基本构建块,可以是一个按钮、一个文本框、一个布局等等。Flutter中的一切都是Widget,甚至整个应用本身也是一个...
Flutter Widget详解:探索Flutter的基本构建模块
# 1. 引言 Flutter是一个跨平台的移动应用开发框架,由Google开发,旨在帮助开发者使用一套代码基数构建高性能、高保真度的应用程序。Flutter使用自己的UI库,名为Widgets,...## 1.2 FlutterWidget概念 在Flutte
Flutter 列表控件ListView
热门推荐
喻志强的博客
03-01 1万+
Flutter ListView 列表布局在手机上是最最常用的控件了。 Android上的RecycleView尤其的强大。 Flutter中也给我们提供了ListView,不过就目前的体验来看,性能跟原生的ListView或RecycleView比还是有一点差距的。滑动起来还是略卡。 下面我们来看一下ListView的相关知识 继承关系 可以看到,ListView和GridView都继承自Bo...
android AppWidget ListView
11-06
android app widget 使用listview 源码
Flutter 学习ListView Widget
Vinku的博客
12-19 248
import 'package:flutter/material.dart'; void main () => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context){ return MaterialApp( title:'123', home:Scaffold( appBar:new AppBa.
Flutter (八) Widget 列表
没有翅膀的我们,只是随便认为不能飞而已
06-07 856
ListView ListView是最常用的可滚动widget,它可以沿一个方向线性排布所有子widget。 scrollDirection:列表排列方向,默认是垂直方法,Axis.vertical。水平是Axis.horizontal; itemExtent:该参数如果不为null,则会强制children的"长度"为itemExtent的值;这里的"长度"是指滚动方向上子widget的长度,...
Android_WidgetListview的用法
nahfang的博客
01-31 1347
环境:win10 编译软件 : AS 这里只讲listview的基础用法,建议先查询widget相关知识后再来 先利用AS创建一个ListWidget,系统会自动帮你生成一个AppWidgetProvider,以及布局文件 /xml中的list_widget_info.xml和/layout中的list_widget.xml这里就不具体介绍了。开始我们的小例子叭 list_widget.xml中添加listview控件 <LinearLayout xmlns:android="http://sche
Flutter 2-11】Flutter手把手教程UI布局和Widget——列表ListView
弗拉德的技术博客
01-20 441
ListView是在移动端非常常见的控件,在大多数的展示场景中都离不开ListView。在Flutter中对ListView的封装也非常好,简单几行代码就可以满足我们布局一个滚动列表的需求。
第五章:Scrollable Widgets(二) -- ListView
Waruler的博客
03-27 2591
ListView的四种构建方式及使用场景
Flutter开发(五):Flutter布局与列表
wuqingsen1的博客
10-28 789
1.Flutter 中的线性布局(Android 中 LinearLayout) 在 Flutter 中,可以使用 Row (横向)和 Column (纵向) widget 来实现同样的效果: void main() { runApp(MaterialApp(home: MyApp())); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return R
Flutter开发 10.Widget-ListView详解
xuanwenchao的专栏
03-30 2959
爪爪
flutter之布局Widget
iOSbird的博客
05-08 232
为了实现界面内组件的各种排布方式,我们需要进行布局,和其他端不同的是,Flutter中因为万物皆Widget,所以布局也是使用Widget来完成的。 Flutter中的布局组件非常多,有31个用于布局的组件。我们没必要一个个全部掌握,掌握最常用的,一些特殊的组件用到时去查文档即可。 Flutter将布局组件分成了 单子布局组件(Single-child layout widgets) 和 多子布局组件(Multi-child layout widgets) 一. 单子布局组件 单子布局组件的含义是其只.
Flutter实现ListView:豆瓣电影接口实战
"本示例展示了如何在...通过这个示例,开发者可以学习到如何在Flutter中结合网络请求、JSON解析和ListView组件来构建一个实际的应用场景。这有助于理解和掌握Flutter中的数据获取、界面构建以及用户交互的基本流程。
84
原创
77
点赞
269
收藏
5224
粉丝
关注
私信
写文章

热门文章

  • 【python】python跑长时间脚本运行导致的内存和CPU的占用高的解决 10066
  • 【Python】字符串和16进制的相互转换,以及不同进制之间的转换 7677
  • 【Flutter】【弹窗】弹窗的快速上手使用和自定义Dialog 7387
  • 【python】winreg 的快速适用,修改使用注册表功能 6287
  • 【linux】ssh 远程登录报错 : Permission denied (publickey,gssapi-keyex,gssapi-with-mic)的处理 6227

分类专栏

  • CanOe 1篇
  • Python 其他 24篇
  • C# 1篇
  • Flutter 51篇
  • python tesseract 2篇
  • python flask 2篇
  • linux 1篇
  • Python Selenium 1篇

最新评论

  • 【python】dict和json的转换写入,以及中文乱码的处理

    howard986: 不错,管用。

  • 【python】python跑长时间脚本运行导致的内存和CPU的占用高的解决

    Cartoon SuperMan: 软件,是我服务器的负载情况

  • 【python】python跑长时间脚本运行导致的内存和CPU的占用高的解决

    iooiboy: 亲爱的博主你好,请问最后一张图是怎么来的,是软件还是代码输出的这个图片

  • 【Flutter】【package】auto_size_text 文字自动适配大小

    阿童木咯畈: 大佬出品,必属精品~!

  • 【python】winreg 的快速适用,修改使用注册表功能

    KuYouRan: 请问如何操作注册表中的使用大括号的那些项?

最新文章

  • 【CANOE】【诊断功能】NRC 优先级功能
  • 【Python】对应接口url 被编码后的处理
  • 【python】乱码的处理总结
2024年2篇
2023年8篇
2022年74篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家玻璃钢景观雕塑电话虎年春节商场美陈驻马店玻璃钢雕塑厂家电话亳州玻璃钢雕塑价钱玻璃钢雕塑加工哪里好卡通雕塑福娃玻璃钢雕塑武汉玻璃钢景观雕塑设计和龙玻璃钢景观雕塑西安商场美陈布置3米玻璃钢仿铜鼎雕塑东莞玻璃钢卡通老鼠雕塑宜兴商场入口美陈长丰玻璃钢雕塑福建水果玻璃钢雕塑哪家便宜浙江玻璃钢人物雕塑定做艺术商场美陈怎么样红色玻璃钢雕塑参考价玻璃钢雕塑年限四川特色商场美陈销售企业开封玻璃钢商场美陈评价高的玻璃钢雕塑造型贴金玻璃钢彩绘雕塑哪家有广西玻璃钢狗雕塑舟山环保玻璃钢雕塑武汉汉西矩形玻璃钢花盆别致的山羊玻璃钢雕塑锦江玻璃钢造型雕塑河北仿铜玻璃钢雕塑订做价格透明树脂玻璃钢户外人物雕塑徐州定做玻璃钢雕塑厂价格香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化