第一个flutter demo—— 无限滚动的列表应用
Material Design (质感设计),Google开发的设计语言,拓展于Google即时的卡片设计。
flutter提供了丰富的质感设计风格的widgets,在flutter中,几乎所有都是widget,
hello world
1 | import 'package:flutter/material.dart'; //导入Material Design |
由此可知,一个App是由widget组成的。widget可以一层层嵌套,它的最终显示样式,由它嵌套的子widget决定
示例中,body是一个widget,里面包含了Center widget,Center widget又包含了Text widget,Center widget决定了子widget以居中样式呈现,所以body的呈现样式是居中显示了文本 Hello World
引入开源包
使用 english_words 资源包,英文单词数据资源
项目中 pubspec.yaml
是资源管理包,类似iOS开发中使用cocopads的 Podfile
。
在 dependencies
栏下添加资源包名:english_words: ^3.1.5
(3.1.5 或更高版本)
1 | dependencies: |
添加之后,在VSCode右上角,有一个方块加向下箭头的图标 Get Packages
,点击便可安装资源包,控制台会打印安装结果:
1 | [first_demo] flutter packages get |
同时会在 pubspec.lock
文件中增加了添加的包名和版本信息:
1 | english_words: |
使用资源包English words
示例代码:
1 | import 'package:english_words/english_words.dart'; //引入english_words,写类WordPair时,会自动引入 |
点击 command + s
(也可点击VSCode上悬浮栏的闪电按钮)会热重载,APP中的文字会不断变化。
StatefulWidget
上述demo中,是用的StatelessWidget,这是不可变的widget,属性不能改变,都是final的。
StatefulWidget是可变的widget,它本身不可变,但它有一个 State
状态类,这个在widget整个生命周期一直存在,是可变的。
创建一个StatefulWidget,和创建StatelessWidget一样,示例代码:
1 | class RandomWorld extends StatefulWidget { |
方法中 WorldState
是StatefulWidget的 State 类,这个类通过createState()方法创建,后跟创建 State类的自定义方法 WorldState()
1 | class WorldState extends State<RandomWorld> { |
这是创建State的实现方法,WorldState集成自State,<RandomWords>
代表着专门用于RandomWorld
的State泛型类。里面的build方法比较容易理解,就是创建widget的build方法,里面返回了一个动态的Text。这说明State也是一个widget。
万物皆widget啊!
剩下的就是使用StatefulWidget,在MyApp中使用StatefulWidget的自定义RandomWorld,动态name用不到了,直接使用RandomWorld()
1 | class MyApp extends StatelessWidget { |
运行程序,跟之前别无二致,还是APP中的英文词组在变化。但变化从由StatelessWidget
里的一个widget控制,变为由StatefulWidget
的 State
控制。
无限滚动列表
无限滚动是动态的,在上述demo中开发无限滚动列表,需要在State类 WorldState
中操作。
无限滚动列表,需要有个无限的数组数据源,所以首先在 WorldState
创建一个数组,用于存放数据源:
1 | class WorldState extends State<RandomWorld> { |
有了数据源,开始创建一个ListView,这是列表widget:
1 | Widget _listView() { |
向列表中添加文本也是个私有方法 _buildRow
:
1 | Widget _buildRow(WordPair name) { //传参,数组中的元素WordPair |
至此,无限列表已经创建完了。要将无限列表添加到 WorldState
中,替换原来赋值词组的方法 :
1 |
|
最后再更改MyApp的方法:
1 | class MyApp extends StatelessWidget { |
运行便呈现了无限滚动列表!
demo的完整代码见工程中的 first_demo