Flutter列表ListView学习
1. 热重载
1.1 什么是热重载
- Flutter热重载:在我们调试布局的时候,更改代码,模拟器上可以立即看到代码改动的效果;而不是iOS和Android单独开发需要重新编译,启动,耗时极长。
- 开发效率:Flutter的热重载可帮助开发者快速地进行测试、构建UI、添加功能并更快地修复错误。在iOS和Android模拟器或真机上可以实现毫秒级热重载,并且不会丢失状态。这真的很棒,相信我,如果你是一名原生开发者,体验了Flutter开发流后,很可能就不想重新回去做原生了,毕竟很少有人不吐槽原生开发的编译速度。
1.2 热重载的使用
热重载快捷键:
command + \
或者直接点击热重载按钮,闪电标识:
如果使用终端直接run,热重载直接输入小写的 r,即可;热重启直输入大写的 R,即可
2. 常用快捷键的使用
Dart语言命名规则:
文件名:小写 + _ (组合使用,不需要驼峰规则)
类名 :首字母大写 + 驼峰规则格式化: 按照Dart的语法规则将代码格式优化
command + option + lfunction折叠: 将{}之间的方法折叠为{…}或展开
command -
command +代码块的使用:
stl (无状态stateless widget)
stf (有状态stateful widget)import快捷键: 当使用一个没有import的类时报错,可以使用如下快捷键
option + enter两次切换文件: 在两个.dart文件之间来回切换
command + [
command + ]打开一个文件:
command + shift + o当一个function里面只有一句执行代码的时候,可以用=>简写,如下:
void main() {
runApp(App(); //只有一句执行代码
}void main() => runApp(App());
3. 简单ListView的搭建
Flutter中的ListView类似于iOS中的UITableView,使用之处和iOS的UITableView类似也有区别;
3.1 Widget控件
- 在Flutter中几乎所有的对象都是一个Widget。与原生开发中“控件”不同的是,Flutter中的Widget的概念更广泛,它不仅可以表示UI元素,也可以表示一些功能性的组件如:用于手势检测的 GestureDetector widget、用于APP主题数据传递的Theme等等,而原生开发中的控件通常只是指UI元素。在后面的内容中,我们在描述UI元素时可能会用到“控件”、“组件”这样的概念,读者心里需要知道他们就是widget,只是在不同场景的不同表述而已。由于Flutter主要就是用于构建用户界面的,所以,在大多数时候,读者可以认为widget就是一个控件,不必纠结于概念。
Widget主要接口:
@immutable
abstract class Widget extends DiagnosticableTree {const Widget({ this.key });final Key key;@protectedElement createElement();@overrideString toStringShort() {return key == null ? '$runtimeType' : '$runtimeType-$key';}@overridevoid debugFillProperties(DiagnosticPropertiesBuilder properties) {super.debugFillProperties(properties);properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;}static bool canUpdate(Widget oldWidget, Widget newWidget) {return oldWidget.runtimeType == newWidget.runtimeType&& oldWidget.key == newWidget.key;}
}
- Widget类继承自DiagnosticableTree,DiagnosticableTree即“诊断树”,主要作用是提供调试信息。
- Key: 这个key属性类似于React/Vue中的key,主要的作用是决定是否在下一次build时复用旧的
- widget,决定的条件在canUpdate()方法中。
- createElement():正如前文所述“一个Widget可以对应多个Element”;Flutter Framework在构建UI树时,会先调用此方法生成对应节点的Element对象。此方法是Flutter Framework隐式调用的,在我们开发过程中基本不会调用到。
- debugFillProperties(…) 复写父类的方法,主要是设置诊断树的一些特性。
- canUpdate(…)是一个静态方法,它主要用于在Widget树重新build时复用旧的widget,其实具体来说,应该是:是否用新的Widget对象去更新旧UI树上所对应的Element对象的配置;通过其源码我们可以看到,只要newWidget与oldWidget的runtimeType和key同时相等时就会用newWidget去更新Element对象的配置,否则就会创建新的Element。
以上摘自Flutter官方文档Widget概述:Flutter中文网Widget概述
简单来说Widget就相当于iOS中的UIView
3.2 主要代码
代码主要分为3部分:
- main.dat:主界面,导航栏等;
- listview_demo.dart 列表listview对象控件;
- car.dart 单个widget模型(name,imageUrl);
- main.dart中的代码:
//material.dart相当于iOS中的UIKit
import 'package:flutter/material.dart';
import 'package:flutter_001/model/listview_demo.dart';//Widget 控件 相当于UIView
//Stateful 有状态的控件 Stateless 无状态的控件//void main (){
//
// runApp(
// App(),
// );
//}//当一个function里面只有一句执行代码的时候,可以用=>简写
//如下:void main() => runApp(App());
//runApp相当于iOS中的UIApplicationclass App extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(debugShowCheckedModeBanner: true,home: Home(),//首页theme: ThemeData(primaryColor: Colors.yellow,//导航栏颜色),);}
}class Home extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(backgroundColor: Colors.grey[100],//appBar 导航栏appBar: AppBar(title: Text("ListView",style: TextStyle(color: Colors.deepOrange[300],fontSize: 22,),),),body: ListViewDemo(), //ListView控件);}
}
- 列表listview_demo的代码:
import 'package:flutter/material.dart';import 'car.dart'; //option +enter两次class ListViewDemo extends StatelessWidget {Widget _cellForRow (BuildContext context, int index){ //自定义返回cell的函数//context:上下文//index:第几个widget(第几个cell)return Container(margin: EdgeInsets.all(10),color: Colors.white,child: Column(children: <Widget>[Image.network(datas[index].imageUrl),SizedBox(height:20),Text(datas[index].name,style:TextStyle(color:Colors.blue,fontSize:22,fontWeight: FontWeight.w800,fontStyle: FontStyle.values[1],)),SizedBox(height: 20),],),);}//Column 上下布局//Row 左右布局//Stack 层级布局@overrideWidget build(BuildContext context) {return ListView.builder(itemCount: datas.length,itemBuilder: _cellForRow);}// ListView.builder创建listView,需要传入的参数有// itemCount: 简单理解UITableView中的cell的个数;// itemBuilder: 简单理解UITableView中的cellforRowsAtIndex;// Dart中带_的方法为私有方法,外部不能访问,例如_cellForRow;
}
- 模型car.dart文件中的代码:
class Car {const Car ({ //构造函数this.name,this.imageUrl,});final String name;final String imageUrl;
}//数据源数组:
final List<Car> datas = [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',)];
原文链接:链接
Flutter列表ListView学习相关推荐
- Flutter列表ListView 使用概述
在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...
- flutter列表无法滚动到底部_在闲鱼实习做Flutter是什么感受?
作者:闲鱼技术-炜铖 前言: 我是广东工业大学16级软件工程专业的学生,在今年5月份通过春招作为实习生加入了闲鱼.至今实习了3个月.在闲鱼先后完成了玩家发布页重构,AndroidQ适配,租赁,直播等任 ...
- Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 本文章通过 OpenC ...
- Flutter中用ListView嵌套GridView报错异常
Flutter中用ListView嵌套GridView报错异常 参考文章: (1)Flutter中用ListView嵌套GridView报错异常 (2)https://www.cnblogs.com/ ...
- 《React Native移动开发实战》一一3.4 完善商品列表——ListView组件
3.4 完善商品列表--ListView组件 在完善了搜索框和轮播广告之后,对电商应用的首页的改造已经初见成效.最后,我们要让商品列表的内容也变得更加丰富. 3.4.1 对图片资源进行重构 添加商品图 ...
- jQuery Mobile中列表listview(ol、ul)的data-*选项
全栈工程师开发手册 (作者:栾鹏) jQuery Mobile 所有data-*选项 jQuery Mobile中列表listview的data-*选项 //带有 data-role="li ...
- 高帧率手机 Flutter 列表慢慢拖动的时候会有明显的抖动
高帧率手机上,Flutter列表慢慢拖动的时候会感觉到明显的抖动现象, 比如,一加手机输入的运行频率为120hz,而显示屏的运行频率为90hz.滚动时,这种不匹配会导致性能下降,google团队通过以 ...
- python学习-->tkinter模块学习之Listbox(列表框学习)
大家好! 今天要分享的是学习tkinter模块的Listbox(列表框学习)! 我们今天例子就是通过Listbox帮助我们把对应一条内容放在列表,然后点击按钮在标签显示! 我们先看看代码运行后的结果: ...
- 谷歌技术团队出品,Android Flutter全家桶学习资料【全新版】
Flutter 是谷歌的移动端 UI 框架,可在极短的时间内构建 Android 和 iOS 上高质量的原生级应用. Flutter 可与现有代码一起工作, 它被世界各地的开发者和组织使用, 并且 F ...
最新文章
- 求n!中含有质因子p的个数
- 新 IDE 出现,程序员迎来危机?
- Android之自定义横向滚动菜单
- 爬虫学习笔记(二十)—— 字体反爬
- GROUP BY 和 ORDER BY 同时使用问题
- cisco和H3C命令对比
- WPF TreeView的使用
- Linux关机重启命令
- 利用R语言美化决策树
- SWAT模型学习(二)
- LED透明屏为什么能透明?实现原理
- 利用偏最小二乘法选出最重要的特征波段Matlab
- CIS Benchmarks
- echarts绘制分时图(1)-- 接收及处理股票接口数据
- Python中7种随机函数总结
- 【免费域名】freenom免费申请域名步骤
- 国外电子与通信教材系列最新目录单
- 如何使用cpolar穿透内网访问监控摄像头
- JAVA使用 Shade 进行依赖冲突处理
- 1.文件字符流:什么是文件字符流???