1. 热重载

1.1 什么是热重载

  • Flutter热重载:在我们调试布局的时候,更改代码,模拟器上可以立即看到代码改动的效果;而不是iOS和Android单独开发需要重新编译,启动,耗时极长。

  • 开发效率:Flutter的热重载可帮助开发者快速地进行测试、构建UI、添加功能并更快地修复错误。在iOS和Android模拟器或真机上可以实现毫秒级热重载,并且不会丢失状态。这真的很棒,相信我,如果你是一名原生开发者,体验了Flutter开发流后,很可能就不想重新回去做原生了,毕竟很少有人不吐槽原生开发的编译速度。

1.2 热重载的使用

热重载快捷键:

command + \

或者直接点击热重载按钮,闪电标识:

如果使用终端直接run,热重载直接输入小写的 r,即可;热重启直输入大写的 R,即可

2. 常用快捷键的使用

  1. Dart语言命名规则:
    文件名:小写 + _ (组合使用,不需要驼峰规则)
    类名 :首字母大写 + 驼峰规则

  2. 格式化: 按照Dart的语法规则将代码格式优化
    command + option + l

  3. function折叠: 将{}之间的方法折叠为{…}或展开
    command -
    command +

  4. 代码块的使用:
    stl (无状态stateless widget)
    stf (有状态stateful widget)

  5. import快捷键: 当使用一个没有import的类时报错,可以使用如下快捷键
    option + enter两次

  6. 切换文件: 在两个.dart文件之间来回切换
    command + [
    command + ]

  7. 打开一个文件:
    command + shift + o

  8. 当一个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部分:

  1. main.dat:主界面,导航栏等;
  2. listview_demo.dart 列表listview对象控件;
  3. 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学习相关推荐

  1. Flutter列表ListView 使用概述

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  2. flutter列表无法滚动到底部_在闲鱼实习做Flutter是什么感受?

    作者:闲鱼技术-炜铖 前言: 我是广东工业大学16级软件工程专业的学生,在今年5月份通过春招作为实习生加入了闲鱼.至今实习了3个月.在闲鱼先后完成了玩家发布页重构,AndroidQ适配,租赁,直播等任 ...

  3. Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. ** 你可能需要 CSDN 网易云课堂教程 掘金 EDU学院教程 知乎 Flutter系列文章 本文章通过 OpenC ...

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

    Flutter中用ListView嵌套GridView报错异常 参考文章: (1)Flutter中用ListView嵌套GridView报错异常 (2)https://www.cnblogs.com/ ...

  5. 《React Native移动开发实战》一一3.4 完善商品列表——ListView组件

    3.4 完善商品列表--ListView组件 在完善了搜索框和轮播广告之后,对电商应用的首页的改造已经初见成效.最后,我们要让商品列表的内容也变得更加丰富. 3.4.1 对图片资源进行重构 添加商品图 ...

  6. jQuery Mobile中列表listview(ol、ul)的data-*选项

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile 所有data-*选项 jQuery Mobile中列表listview的data-*选项 //带有 data-role="li ...

  7. 高帧率手机 Flutter 列表慢慢拖动的时候会有明显的抖动

    高帧率手机上,Flutter列表慢慢拖动的时候会感觉到明显的抖动现象, 比如,一加手机输入的运行频率为120hz,而显示屏的运行频率为90hz.滚动时,这种不匹配会导致性能下降,google团队通过以 ...

  8. python学习-->tkinter模块学习之Listbox(列表框学习)

    大家好! 今天要分享的是学习tkinter模块的Listbox(列表框学习)! 我们今天例子就是通过Listbox帮助我们把对应一条内容放在列表,然后点击按钮在标签显示! 我们先看看代码运行后的结果: ...

  9. 谷歌技术团队出品,Android Flutter全家桶学习资料【全新版】

    Flutter 是谷歌的移动端 UI 框架,可在极短的时间内构建 Android 和 iOS 上高质量的原生级应用. Flutter 可与现有代码一起工作, 它被世界各地的开发者和组织使用, 并且 F ...

最新文章

  1. 求n!中含有质因子p的个数
  2. 新 IDE 出现,程序员迎来危机?
  3. Android之自定义横向滚动菜单
  4. 爬虫学习笔记(二十)—— 字体反爬
  5. GROUP BY 和 ORDER BY 同时使用问题
  6. cisco和H3C命令对比
  7. WPF TreeView的使用
  8. Linux关机重启命令
  9. 利用R语言美化决策树
  10. SWAT模型学习(二)
  11. LED透明屏为什么能透明?实现原理
  12. 利用偏最小二乘法选出最重要的特征波段Matlab
  13. CIS Benchmarks
  14. echarts绘制分时图(1)-- 接收及处理股票接口数据
  15. Python中7种随机函数总结
  16. 【免费域名】freenom免费申请域名步骤
  17. 国外电子与通信教材系列最新目录单
  18. 如何使用cpolar穿透内网访问监控摄像头
  19. JAVA使用 Shade 进行依赖冲突处理
  20. 1.文件字符流:什么是文件字符流???

热门文章

  1. 多功能频谱分析仪TFN RMT系列,满足您对频谱分析仪的多种幻想。
  2. 小程序设置整个页面的背景颜色
  3. 真实经历,互联网大厂升职加薪那些事
  4. 网路营销seo站群策略
  5. Android中监听电源键长按、Home键、Home键长按
  6. Microsoft Surface 平板电脑
  7. 无线信息和能量传输:结构设计和速率-能量平衡
  8. 怎么将svn服务器上的文件彻底删除,如何彻底删除SVN中的文件和文件夹(附恢复方法)...
  9. 12款多媒体能力SDK与开发平台盘点
  10. 看 PrisonBreak,学美语