如何解决对 Flutter StatefulWidget 和 StatelessWidget 感到困惑
我继承了一个现有的或多或少可用的 Flutter 应用程序,我需要维护。我有一些基本的 Flutter 知识,但我不是专家。
该应用程序使用 StatelessWidget,但随后它定义了一个状态……这是怎么回事?有人可以帮忙吗。请参阅下面的代码。
class MyApp extends StatelessWidget {
...
}
void main() async{
...
runApp(
ChangeNotifierProvider(
child: MyApp(),create: (_) => AppState(),),);
}
更新:我错误地认为类 AppState 以某种方式使其“有状态”,但它被定义为“类 AppState 扩展 ChangeNotifier”。但是这个 AppState 类确实包含一些在应用执行期间正在填写的信息(例如应用内购买相关信息),因此它是“有点状态”。
解决方法
有状态的小部件:
A stateful widget 是一个 Flutter 小部件,它由两个类组成:小部件及其状态。请参阅 this link 以了解为什么有状态小部件中有两个类。有状态小部件可以重建(因此称为有状态),并用于表单等提交后内容将更改的地方。它是这样实现的:
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
Widget build(BuildContext context) {
return Container();
}
}
优点:
- 可以使用
setState()
方法重建(重新创建) - 有一个state
缺点:
- 大量样板代码
无状态小部件:
stateless widget 是一个无法重建的小部件,导致没有 State 类,因此减少了样板代码。 However,it is by no means faster than a stateful widget。它是这样实现的:
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container();
}
}
优点:
- 更少的样板代码
缺点:
- 无法重建
有状态和无状态小部件
小部件要么是有状态的,要么是无状态的。如果一个小部件可以改变——例如,当用户与其交互时——它就是有状态的。
无状态小部件永远不会改变。 Icon
、IconButton
和 Text
是无状态小部件的示例。无状态小部件子类 StatelessWidget
。
有状态小部件是动态的:例如,它可以响应用户交互触发的事件或接收数据时改变其外观。 Checkbox
、Radio
、Slider
、InkWell
、Form
和 TextField
是有状态小部件的示例。有状态小部件子类 StatefulWidget
。
小部件的状态存储在 State
对象中,将小部件的状态与其外观分开。状态由可以更改的值组成,例如滑块的当前值或复选框是否被选中。当小部件的状态发生变化时,状态对象调用 setState()
,告诉框架重新绘制小部件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。