Flutter:当我可以使用全局变量并改用 setState 时,状态管理库需要什么?
Flutter: What is the need of state management libraries when I can use global variables and use setState instead?
我知道 bloc 模式或 getX 会提供额外的功能,而不仅仅是 flutter 中的状态管理,但我主要担心的是为什么我应该使用 bloc 或 getX 或任何其他状态管理库,而不是仅仅将 setState 与全局变量一起使用?
我也明白,如果我从 child class 更新全局变量的值并导航回 parent 那么它的状态将不会更新,而是克服这个问题,我只是从 child class 调用了 parent 的 setState()。我的方法有什么问题吗?如果有,那又如何?
每当您调用 setState()
函数时,您的整个 Stateful 或 Stateless Widget 将再次重建。它使您的应用程序的性能降低。
例如: 您有一个像 Following
这样的无状态小部件
Scaffold(
body: Column(
children: [
Container(
child: Text(SomeText);
),
FlatButton(
onPressed: (){
seState({
//change Text Function
});
}
)
]
)
)
在这里,当您单击按钮时,它的功能是更改 SomeText
的值,现在这些所有代码都将重建,是的,它用新值替换 SomeText
。但它不仅改变了它,而且重建了整个小部件来改变它。
这里不是setState()
方法,如果你使用任何状态管理库,那么它只会改变SomeText的值而不影响其他小部件。
作为初学者你可以试试Provider
setState
函数调用再次构建整个小部件,这是一个性能问题。状态管理在不构建整个小部件的情况下管理状态。此外,如果您的数据在多个屏幕上使用,您必须使用繁琐的参数来传递该数据。这就是我们使用状态管理库的原因。希望它能回答问题。
我对flutter的性能不是很了解,我比较关心的是可维护性:
当 child 知道 parent 时,反之亦然,小部件上发生了太多事情,您将无法对抽象进行分层,并且在一段时间内变得难以推理。
在 javascript 中,我们遵循讨论 top-down 状态流的通量模式:如果您的应用程序状态不遵循单向流,那么理解起来会很麻烦时间不多了。
如果上面没有提升状态逻辑,如果需要在其他地方访问相同的数据,您的组件将不会有 single source of truth
。
希望这是有道理的。
调用 setState()
的问题在于,它将重建所有 children,你调用它的地方。
你可以优化它,InheritedWidget。
但是,InheritedWidget
为您提供了样板代码。
因此,使用一些状态管理库而不是维护总是实用的 InheritedWidgets
。
我知道 bloc 模式或 getX 会提供额外的功能,而不仅仅是 flutter 中的状态管理,但我主要担心的是为什么我应该使用 bloc 或 getX 或任何其他状态管理库,而不是仅仅将 setState 与全局变量一起使用?
我也明白,如果我从 child class 更新全局变量的值并导航回 parent 那么它的状态将不会更新,而是克服这个问题,我只是从 child class 调用了 parent 的 setState()。我的方法有什么问题吗?如果有,那又如何?
每当您调用 setState()
函数时,您的整个 Stateful 或 Stateless Widget 将再次重建。它使您的应用程序的性能降低。
例如: 您有一个像 Following
这样的无状态小部件Scaffold(
body: Column(
children: [
Container(
child: Text(SomeText);
),
FlatButton(
onPressed: (){
seState({
//change Text Function
});
}
)
]
)
)
在这里,当您单击按钮时,它的功能是更改 SomeText
的值,现在这些所有代码都将重建,是的,它用新值替换 SomeText
。但它不仅改变了它,而且重建了整个小部件来改变它。
这里不是setState()
方法,如果你使用任何状态管理库,那么它只会改变SomeText的值而不影响其他小部件。
作为初学者你可以试试Provider
setState
函数调用再次构建整个小部件,这是一个性能问题。状态管理在不构建整个小部件的情况下管理状态。此外,如果您的数据在多个屏幕上使用,您必须使用繁琐的参数来传递该数据。这就是我们使用状态管理库的原因。希望它能回答问题。
我对flutter的性能不是很了解,我比较关心的是可维护性:
当 child 知道 parent 时,反之亦然,小部件上发生了太多事情,您将无法对抽象进行分层,并且在一段时间内变得难以推理。
在 javascript 中,我们遵循讨论 top-down 状态流的通量模式:如果您的应用程序状态不遵循单向流,那么理解起来会很麻烦时间不多了。
如果上面没有提升状态逻辑,如果需要在其他地方访问相同的数据,您的组件将不会有
single source of truth
。
希望这是有道理的。
调用 setState()
的问题在于,它将重建所有 children,你调用它的地方。
你可以优化它,InheritedWidget。
但是,InheritedWidget
为您提供了样板代码。
因此,使用一些状态管理库而不是维护总是实用的 InheritedWidgets
。