flutter - 在无状态小部件中传递 BuildContext 的编码约定

标签 flutter

这是一个小问题,在编写 flutter 代码时一直困扰着我。

编写 StatelessWidget 时,必须手动将 context 传递给方法,这与 StatefulWidget 不同,后者可作为State 类上的实例变量。

我的疑问是 - 我是否应该将所有 StatelessWidget 转换为 StatefulWidget,这样我就不必将上下文传递给我所有 onPressed方法?


例如编写 flutter 代码的首选方式是什么?

  1. 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/

    相关文章:

    Flutter 图标动画

    Flutter Web Firebase 推送通知收到两次

    dart - 无法打开文件,路径 = 'file:///path'(操作系统错误 : No such file or directory, errno = 2)

    flutter - 运行 flutter run 时 flutter app 出现问题

    flutter - 是否可以在 flutter 应用程序上使用 agora sdk 录制语音通话?

    flutter - 在 Flutter 中按下/离开时,TextField 会重新加载 FutureBuilder

    flutter - 如何在Flutter中正确对齐文本?

    Flutter Getx - 更新子列表中的项目不是 react 性的

    c# - 是否可以从移动和桌面应用程序访问同一个 Firestore 集合?

    flutter - 如何增加 flutter 中的 slider 轨道宽度