Flutter中的State是什么?

5

我刚开始学习Flutter,作为一个初学者,我在理解状态方面遇到了一些问题。我看过一些YouTube视频,阅读了在线文章。他们解释了为什么应该使用Stateful Widget而不是Stateless Widget,但我真的不明白一个应用程序的哪个部分需要成为Stateful Widget以及setState方法的用途是什么。另外,小部件的状态和应用程序的状态有什么区别?


1
我建议你阅读官方文档,里面详细介绍了Flutter的一切:https://flutter.dev/docs/development/data-and-backend/state-mgmt/intro - Mariano Zorrilla
2
我更新了我的答案。有时间的话请再读一遍。 - X 2
3个回答

13

Flutter是声明式UI框架。这意味着Flutter通过构建用户界面来反映应用程序的当前状态:

Flutter中的布局构建方式

状态可以描述为“在任何时候重新构建UI所需的所有数据”。

当应用程序的状态发生改变(例如,用户在设置屏幕中切换开关)时,您会改变状态,并触发用户界面的重绘。 没有命令式地改变UI本身 (像widget.setText一样)——你改变状态,UI从头开始重建。

您管理的状态可以分成两种概念类型:短暂(widget状态)状态和应用程序状态。

短暂状态

短暂状态(有时称为UI状态或本地状态)是您可以清晰地包含在单个widget中的状态。

对于这种状态,不需要使用状态管理技术(ScopedModel、Redux、Provider、bloc等)。只需要一个StatefulWidget。 您只需要使用setState来更改当前状态。

例如,在下面的示例中,您可以看到底部导航栏中当前选择的项目保存在_MyHomepageState类的_index字段中。 在此示例中,_index是短暂状态。

    class MyHomepage extends StatefulWidget {
    const MyHomepage({Key? key}) : super(key: key);

    @override
    _MyHomepageState createState() => _MyHomepageState();
    }

    class _MyHomepageState extends State<MyHomepage> {
    int _index = 0;

    @override
    Widget build(BuildContext context) {
        return BottomNavigationBar(
        currentIndex: _index,
        onTap: (newIndex) {
            setState(() {
            _index = newIndex;
            });
        },
        // ... items ...
        );
    }
    }

在这里,使用setState()和StatefulWidget的State类中的一个字段是完全自然的。您的应用程序的其他任何部分都不需要访问_index,该变量仅在MyHomepage小部件内部更改。如果用户关闭并重新启动应用程序,您不介意_index重置为零。

应用状态

我们所说的应用状态(有时也称为共享状态)是指不是短暂的状态,您想要在应用程序的许多部分之间共享,并且您希望在用户会话之间保留的状态。

应用状态的示例:

  • 用户首选项
  • 登录信息
  • 社交网络应用中的通知
  • 电子商务应用中的购物车
  • 新闻应用中文章的已读/未读状态

要管理应用状态,您需要研究您的选项。您的选择取决于应用程序的复杂性和性质、团队的先前经验以及许多其他方面。

这是一个使用provider(许多状态管理库之一)管理应用程序广泛状态的示例链接:示例

以下是用于管理应用程序广泛状态的库列表:选项

总之,在任何Flutter应用程序中,有两种概念类型的状态。短暂状态可以使用State和setState()实现,并且通常局限于单个小部件。其余都是您的应用状态。这两种类型在任何Flutter应用程序中都有其位置,它们之间的分割取决于您自己的偏好和应用程序的复杂性。


2

enter image description here

在无状态小部件中,构建函数仅调用一次,从而生成屏幕的用户界面。这意味着通过该小部件您无法再次更改UI。它将一次性渲染(构建)UI。因此,对于这些小部件,您需要在构建小部件之前发送信息。
有状态小部件:可以更改其状态的小部件称为有状态小部件。这意味着应用程序的状态可以使用不同的变量、输入和数据集多次更改。以下是有状态小部件的基本结构。这意味着您可以使用setState方法更改此小部件的UI,而无需再次构建它。
有关更多信息,请参阅-https://medium.com/flutter-community/flutter-stateful-vs-stateless-db325309deae

0

如果我们想要在UI中进行更改,以便使用statefulWidget,否则我们使用statelessWidget。 在大多数情况下,我们将使用statefulWidget。 就是这样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接