Function或StatelessWidget哪个最好?

时间:2019-07-24 04:01:39

标签: flutter dart

我想使代码更简洁。 哪一个更好? 使用StatelessWidget是否会影响性能?

如果只有一个地方可以使用此小部件,请使用哪个地方?

class WebViewPopupMenu extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return PopupMenuButton(
      itemBuilder: (context) => <PopupMenuItem<int>>[
        _buildItem(0, 'Refresh', Icons.refresh),
        WebViewPopupMenuItem(1, 'Favourite', Icons.favorite_border)
      ],
    );
  }
  /// 1 used Function
  _buildItem(value, text, iconData) {
    return PopupMenuItem<int>(
      value: value,
      child: Row(
        children: <Widget>[
          Icon(
            iconData,
            size: 20,
          ),
          Text(text)
        ],
      ),
    );
  }
}
/// 2 used StatelessWidget
class WebViewPopupMenuItem<T> extends StatelessWidget {
  final T value;
  final IconData iconData;
  final String text;
  WebViewPopupMenuItem(this.value, this.iconData, this.text);

  @override
  Widget build(BuildContext context) {
    return PopupMenuItem<T>(
      value: value,
      child: Row(
        children: <Widget>[
          Icon(iconData,size: 20),
          Text(text)
        ],
      ),
    );
  }
}

这是代码

1 个答案:

答案 0 :(得分:0)

如果可以,请始终将无状态或有状态小部件与返回小部件的函数一起使用。

我将使用无状态窗口小部件创建一个新文件。然后,在原始文件中导入无状态窗口小部件,并正常使用它。这是使用您显示的代码的示例:

父窗口小部件(WebViewPopupMenu.dart):

import './WebViewPopupMenuItem.dart';

class WebViewPopupMenu extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return PopupMenuButton(
      itemBuilder: (context) => <PopupMenuItem<int>>[
        _buildItem(0, 'Refresh', Icons.refresh),
        WebViewPopupMenuItem(1, 'Favourite', Icons.favorite_border)
      ],
    );
  }
  /// 1 used Function
  _buildItem(value, text, iconData) {
    return PopupMenuItem<int>(
      value: value,
      child: Row(
        children: <Widget>[
          Icon(
            iconData,
            size: 20,
          ),
          Text(text)
        ],
      ),
    );
  }
}

子窗口小部件(WebViewPopupMenuItem.dart):

class WebViewPopupMenuItem<T> extends StatelessWidget {
  final T value;
  final IconData iconData;
  final String text;
  WebViewPopupMenuItem(this.value, this.iconData, this.text);

  @override
  Widget build(BuildContext context) {
    return PopupMenuItem<T>(
      value: value,
      child: Row(
        children: <Widget>[
          Icon(iconData,size: 20),
          Text(text)
        ],
      ),
    );
  }
}

导入文件后,您只需正常使用小部件即可。

希望这对您有所帮助。真的很容易做,并使所有内容简洁明了。