我刚开始学习 Flutter,作为初学者,我在理解状态方面遇到了一些问题。我在 YouTube 上看了一些视频,在线阅读文章。他们解释了为什么应该使用 Stateful Widget 而不是 Stateless 的原因。但是我真的无法理解应用程序的哪一部分需要成为 Stateful Widget 以及 setState 方法的用途是什么。另外小部件的状态和应用程序的状态有什么区别?
Flutter 是声明性的。这意味着 Flutter 构建其用户界面以反映您应用的当前状态:
状态可以被描述为“你需要的任何数据,以便在任何时候重建你的 UI”。
当您的应用程序的状态发生变化时(例如,用户在设置屏幕中拨动一个开关),您会更改状态,并触发用户界面的重绘。UI 本身没有必要的更改(如 widget.setText)——您更改状态,然后 UI 从头开始重建。
您自己管理的状态可以分为两种概念类型:临时(您问题上的小部件状态)状态和应用程序状态。
短暂的状态
临时状态(有时称为 UI 状态或本地状态)是您可以巧妙地包含在单个小部件中的状态。
不需要在这种状态上使用状态管理技术(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 重置为零。
应用状态
不是短暂的状态,您希望在应用程序的许多部分之间共享,并且希望在用户会话之间保留的状态,就是我们所说的应用程序状态(有时也称为共享状态)。
应用状态示例:
为了管理应用程序状态,您需要研究您的选择。您的选择取决于您的应用程序的复杂性和性质、您团队之前的经验以及许多其他方面。
这是使用提供程序(许多状态管理库之一)的应用程序范围状态管理示例的链接,Example。
这是用于应用程序范围状态管理的库列表,Options。
总之,任何 Flutter 应用程序中都有两种概念上的状态类型。临时状态可以使用 State 和 setState() 来实现,并且通常是单个小部件的本地状态。剩下的就是你的应用状态。这两种类型在任何 Flutter 应用程序中都有自己的位置,两者之间的划分取决于您自己的偏好和应用程序的复杂性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句