Flutter实战指南
上QQ阅读APP看书,第一时间看更新

2.10 创建StatefulWidget小部件

现在单击应用中的按钮没有任何反应,因为监听方法是空的,这个按钮应该具有添加更多Card小部件的功能。那么怎样再添加更多的Card呢?还有个问题是怎样通过单击按钮来添加Card小部件呢?

在按钮的监听方法中,我们想改变一些数据,然后动态地添加到卡片的列表中。我们需要管理一组数据,例如从服务器获得的数据,后边的章节将会介绍。

首先确认build()方法什么时候被调用,build()方法会在应用第一次加载的时候被Flutter调用,或者当数据发生改变的时候也会被调用。可以在onPressed监听的方法中管理这组数据,每次单击按钮时都要改变这组Card。StatelessWidget满足不了这个需求,因为它是一个很简单的小部件,StatelessWidget可以接收外部的数据,然后简单地调用build()方法,构建一个小部件树,它没办法管理内部数据。如果内部数据发生变化,也不能重新调用build()方法,因为StatelessWidget不能管理内部数据。StatelessWidget只能在第一次被创建的时候调用build()方法,或者是接收到某些外部数据发生变化时,它会调用build()方法,所以现在不能使用StatelessWidget。我们需要使用StatefulWidget,State可以被简单地理解为数据,可以使用存储在小部件中的数据,同时也可以改变这些数据。当我们改成StatefulWidget后会有一个错误提示,显示缺少方法createState(),如图2.19所示。

图2.19 缺少方法createState()

createState()方法是必须要创建的,现在我们把这个类用大括号结束,代码如下:

在Myapp类中输入createState()方法,Visual Studio Code会给提示,单击回车键,代码如下:

createState()方法返回一个有状态的小部件对象,<>是泛型,State这个类是属于flutter/material包。这个状态对象应该属于Myapp。实际上需要创建两个类来一起工作,createState()方法需要返回一个新的State对象,然后把这个对象配置给Myapp。还需要创建第二个类,可以写成_MyappState,类名中的下画线是一种约定,表示它不能被其他文件使用,只能在这个文件中使用。后面的内容可能会使用多个文件,可以把Myapp引入到文件中并使用它,但是不可以使用_MyappState,然后输入extends,因为State这个对象是属于Flutter的,需要覆盖build()方法,这是因为State这个类中也有build()方法。现在我们只需要告诉Flutter,这个状态类是属于Myapp这个小部件的,需要在<>中加上Myapp,表明这个State属于谁,这样这两个类的关系就创建起来了。Myapp需要返回_MyappState对象,所以把_MyappState()返回。代码如下:

类Myapp创建了一个State对象,这个对象包含build()方法,Flutter内部会调用build()方法,这就是StatefulWidget的使用方法。那么怎么去使用StatefulWidget改变这组Card呢?下一节我们将详细讲解。