【问题标题】:Confused about Flutter StatefulWidget and StatelessWidget对 Flutter StatefulWidget 和 StatelessWidget 感到困惑
【发布时间】:2021-09-19 15:15:12
【问题描述】:

我继承了我需要维护的现有的或多或少工作的 Flutter 应用程序。我有一些基本的 Flutter 知识,但我不是专家。

应用程序使用 StatelessWidget,但随后它定义了一个状态……这是怎么回事?有人可以帮忙吗。请参阅下面的代码。

class MyApp extends StatelessWidget {
   ...
}

void main() async{
...

  runApp(
    ChangeNotifierProvider(
      child: MyApp(),
      create: (_) => AppState(),
    ),
  );
}

更新:我错误地认为 AppState 类以某种方式使其“有状态”,但它被定义为“类 AppState 扩展 ChangeNotifier”。但是这个 AppState 类确实包含一些在应用执行期间正在填写的信息(例如应用内购买相关信息),因此它是“有点状态的”。

【问题讨论】:

  • but then it defines a state 是什么意思?我在您上面粘贴的代码中看不到类似的内容。
  • 我的意思是这个“创建:(_)=> AppState()”,但现在我在想,无论如何写它都错误地称之为“状态”,因为AppState被定义为“类 AppState 扩展 ChangeNotifier"
  • 但是这个 AppState 类确实包含一些“有状态的东西”,比如在应用程序执行期间填写的信息并在以后使用......完全混乱......
  • 这个已经回复了一千次了,信息都在Flutter官网上了。请务必在 SoF 中创建新问题之前查看官方文档。

标签: android flutter flutter-android


【解决方案1】:

有状态的小部件:

stateful widget 是一个颤振小部件,它由两个类组成:小部件及其状态。请参阅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();
  }
}

优点:

  • 样板代码更少

缺点:

  • 无法重建

【讨论】:

    【解决方案2】:

    有状态和无状态小部件

    小部件要么是有状态的,要么是无状态的。如果一个小部件可以改变——例如当用户与之交互时——它就是有状态的。

    无状态小部件永远不会改变。 IconIconButtonText 是无状态小部件的示例。无状态小部件子类StatelessWidget

    有状态的小部件是动态的:例如,它可以更改其外观以响应用户交互触发的事件或接收数据时。 CheckboxRadioSliderInkWellFormTextField 是有状态小部件的示例。有状态的小部件子类StatefulWidget

    小部件的状态存储在State 对象中,将小部件的状态与其外观分开。状态由可以更改的值组成,例如滑块的当前值或复选框是否被选中。当小部件的状态发生变化时,状态对象会调用setState(),告诉框架重绘小部件。

    来自Flutter Stateful and StatelessWidget

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2020-05-12
      • 2021-08-16
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2013-03-29
      • 2014-11-02
      • 1970-01-01
      相关资源
      最近更新 更多