Flutter中StatelessWidget和StatefulWidget之间的异同

792 阅读2分钟
Flutter中Widgets的两大分类:
  • 无状态的Widgets一般都直接或间接继承StatelessWidget。
  • 有状态的Widgets一般都直接或间接继承StatefulWidget。
何谓有无状态?

指的是,Widget内部显示所依赖的数据是否会发生变化,是否需要使用setState去重新build。比如:我们打开一个页面,该页面只负责展示固定的列表数据,没有其他附加操作,该列表数据也不会发生变化,那么该页面就可以extends StatelessWidget。但是如果该页面的列表涉及到上下拉刷新数据,那么就需要继承StatefulWidget了,因为上下拉刷新完数据后,需要使用setState来重新build,也就是状态改变了。 更简单一点,当你写一个widget页面时,如果需要用到setState就必须继承StatefulWidget,否则一般都是继承StatelessWidget,但这不是必须的,也可以继承StatefulWidget,顶多不用setState,选择StatelessWidget,表示我们知道这里的数据不会发生变化,是无状态体系,同时模板代码写的也更少。

响应式编程

我的理解是这样的,也可以说是状态式编程,指的是页面可能有多个状态,每个状态显示的页面内容是不同的,当指定不同的状态时,显示该状态对应的页面内容,比如,一个带上下拉刷新的列表,其工作过程是这样的:

  • 打开页面,初始list=[],长度为0,这是一种状态,此时页面显示的是“暂无数据”的内容,我们姑且称之为空数据状态,这里可能是setState((){isEmpty=true;});。
  • 页面进行网络请求,发现网络不通,请求失败,此时页面显示“没有网络,请稍后重试”,这是网络异常状态,这里可能是setState((){ isEmpty=false; isNetError=true;});。
  • 网络恢复后,页面获取到了数据,展示了列表,这是一种页面状态,这是有数据状态。当进行上下拉刷新后,list数据内容发生变化,需要setState重新build,这也是展示更多或更少数据的状态,这里可能是setState((){ isEmpty=false; isNetError=false;dataList=list});。 从上看出,页面至少有空页面状态、网络异常页面状态、有数据状态,有数据状态也可以细分为page=0状态,page=1状态,......
继承StatelessWidget后的模板代码
class  xxx  extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
继承StatefulWidget后的模板代码
class xxx  extends StatefulWidget {
  @override
  xxx_State createState() => xxx_State();
}

class xxx_State extends State<xxx> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}