当状态随 Provider 发生变化时,使用 StatelessWidget 是不是安全?

Posted

技术标签:

【中文标题】当状态随 Provider 发生变化时,使用 StatelessWidget 是不是安全?【英文标题】:It is safe to use StatelessWidget when the state changes with a Provider?当状态随 Provider 发生变化时,使用 StatelessWidget 是否安全? 【发布时间】:2021-03-26 16:50:10 【问题描述】:

我看到 Flutter 团队这样建议:​​

例如,在 android 中,这类似于放置带有徽标的 ImageView。 > 在运行时徽标不会更改,因此请在 Flutter 中使用 StatelessWidget。 如果您想根据在进行 HTTP 调用或用户交互后收到的数据动态更改 UI,那么您必须使用 StatefulWidget 并告诉 Flutter 框架该小部件的状态已更新,以便它可以更新该小部件。 https://flutter.dev/docs/get-started/flutter-for/android-devs#how-do-i-update-widgets

我使用provider,它允许您使用ChangeNotifierProvider 来重建小部件树。

如果我有一个StatelessWidget 并且我们使用一个ChangeNotifierProvider,当ChangeNotifier 通知更改并且小部件重新构建时,build 函数仍会被多次调用,这让我对差异感到很困惑在StatelessWidgetStatefullWidget 之间。

    如果我们在其中使用ChangeNotifierProvider,那么使用StatelessWidget 是否安全? 使用StatelessWidgetStatefullWidget 相比有什么性能提升吗?

【问题讨论】:

【参考方案1】:

“安全”不适用,因为setStateState 类上的一个方法,并且因为StatelessWidget 没有这些方法,所以这甚至不会出现。并且没有关于性能的广泛而全面的规则。试试看,看看。

【讨论】:

感谢您的回答,我更新了问题,您完全正确,我的错,我匆忙创建问题而不考虑我的上下文,我使用Provider,它显示了一个小部件经过一些更改后重建自身,它根本不使用setState 现在您更新了问题 1,我的答案是肯定的。 StatelessWidget 中仍然没有保存任何状态,只是将传入数据转换为小部件的一种方式。【参考方案2】:

这有点令人困惑,但这种解释可能会有所帮助:

由于ChangeNotifierProvider 将处理状态,因此父级(您的小部件)不需要是Statefull,该责任由ChangeNotifierProvider 小部件承担。

【讨论】:

以上是关于当状态随 Provider 发生变化时,使用 StatelessWidget 是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

当兄弟姐妹随自动布局发生变化时,视图不会重绘

Flutter Provider:如何通知模型它包含的模型发生了变化?

当蓝牙连接状态发生变化时,防止onDestroy

当节点后端(MongoDB)中的状态发生变化时通知 Angular 前端

当提供者组件父状态发生变化时,为啥不能更新子组件中的值(带有反应上下文)?

当视图模型中的状态发生变化时,为啥路由的 Composable 会重新组合?