这是一个小问题,在编写 flutter 代码时一直困扰着我。
编写 StatelessWidget
时,必须手动将 context
传递给方法,这与 StatefulWidget
不同,后者可作为State
类上的实例变量。
我的疑问是 - 我是否应该将所有 StatelessWidget
转换为 StatefulWidget
,这样我就不必将上下文传递给我所有 onPressed
方法?
例如编写 flutter 代码的首选方式是什么?
StatelessWidget
,以context
作为函数参数
class PopButton extends StatelessWidget {
const PopButton({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialButton(onPressed: () => onPressed(context));
}
void onPressed(BuildContext context) {
Navigator.of(context).pop();
}
}
StatefulWidget
,它并不真正托管任何状态,但具有更好的onPressed
方法调用
class PopButton extends StatefulWidget {
const PopButton({Key? key}) : super(key: key);
@override
State<PopButton> createState() => _PopButtonState();
}
class _PopButtonState extends State<PopButton> {
@override
Widget build(BuildContext context) {
return MaterialButton(onPressed: onPressed);
}
void onPressed() {
Navigator.of(context).pop();
}
}
最佳答案
在小部件的方法中传递 BuildContext 是完全可以的。您唯一不应该做的就是创建具有“Widget”返回类型的方法,因为它会影响性能。此外,您还需要考虑优先使用无状态而不是有状态,因为:
- 无状态 widget 没有 Flutter 应该存储的单独 State 对象(更好的性能)
- 在可修改的 ListView 和类似的小部件(如果您不使用 Keys)中使用有状态小部件时,它们会产生与附加正确的 State 实例相关的问题
因此,在我看来,回答您的问题第一个选项更准确。
关于flutter - 在无状态小部件中传递 BuildContext 的编码约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72485267/