首页 > 解决方案 > 在 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 的原因如下...

  1. 我需要访问上下文吗?
  2. 我是否关心它不会通过热重载来重建?(或者我会记得)
  3. 我需要将我的小部件与键关联吗?
  4. 这个 Widget 会不会是一个常数?
  5. 这个小部件是否需要重建?

总是使用无状态作为一个相当标准的规则感觉很有吸引力,但是函数式风格要简洁得多,尤其是当你有几个参数的时候。我觉得功能组件会提高我的代码的可读性。那么我应该总是使用无状态类,还是在某些情况下使用 React 调用的功能组件可以?

标签: flutter

解决方案


来自https://github.com/flutter/flutter/issues/19269#issuecomment-404667287

是的,主要区别在于它如何链接到元素树(因为函数不会获取对元素本身的引用,也不会被触发以通过元素树重建自身)。

其他一些例子:

  • 如果您的子树依赖于 InheritedWidget,则 StatelessWidget 将通过手术标记为重建自身。如果您使用了一个函数,则为该函数提供 BuildContext 的小部件将被重建。
    • 在热重载期间不会调用函数本身来重建。其他人将不得不随身携带。如果您只是将一个函数传递给应用程序根目录的 runApp,那么在热重载期间将不会重建任何内容。

有关完整的讨论,请参阅https://github.com/flutter/flutter/issues/19269


推荐阅读