flutter - 在 Statelss 类上使用函数定义小部件组合的场景是合理的?
问题描述
这个讨论在 github
https://github.com/flutter/flutter/issues/19269
讨论了应该在函数组件上使用无状态类定义来定义 Widget 组合的原因。
Widget functionWidgetComposition() => Text('hello');
class MyWidgetComposition extends StatelessWidget {
Widget build(BuildContext context) => Text('hello');
}
如果我理解正确的话,使用 Stateless 的原因如下...
- 我需要访问上下文吗?
- 我是否关心它不会通过热重载来重建?(或者我会记得)
- 我需要将我的小部件与键关联吗?
- 这个 Widget 会不会是一个常数?
- 这个小部件是否需要重建?
总是使用无状态作为一个相当标准的规则感觉很有吸引力,但是函数式风格要简洁得多,尤其是当你有几个参数的时候。我觉得功能组件会提高我的代码的可读性。那么我应该总是使用无状态类,还是在某些情况下使用 React 调用的功能组件可以?
解决方案
来自https://github.com/flutter/flutter/issues/19269#issuecomment-404667287
是的,主要区别在于它如何链接到元素树(因为函数不会获取对元素本身的引用,也不会被触发以通过元素树重建自身)。
其他一些例子:
- 如果您的子树依赖于 InheritedWidget,则 StatelessWidget 将通过手术标记为重建自身。如果您使用了一个函数,则为该函数提供 BuildContext 的小部件将被重建。
- 在热重载期间不会调用函数本身来重建。其他人将不得不随身携带。如果您只是将一个函数传递给应用程序根目录的 runApp,那么在热重载期间将不会重建任何内容。
推荐阅读
- java - 取消处于等待状态的计划作业
- python - PyTorch - RuntimeError:具有多个值的张量的布尔值不明确
- excel - 取消过滤数据透视表中的所有行数据,然后过滤特定值
- excel - 由于编译错误,VBA Excel 无法运行:类型不匹配
- java - 为什么 JRE 10 过时而 JRE 8 是最新的?
- flutter - 如何在 Flutter 中实现底部导航抽屉
- powershell - 在 VisualStudio Code 中启动集成终端时如何附加到 PATH?
- reactjs - 在这种情况下,我将如何创建一个 React 可重用组件?
- c# - 单独使用 raycast 的激光束
- mongodb - MongoDB 文档中的集合