Function 或 StatelessWidget 哪个最好? [复制]

Posted

技术标签:

【中文标题】Function 或 StatelessWidget 哪个最好? [复制]【英文标题】:Function or StatelessWidget Which one is best? [duplicate] 【发布时间】:2019-12-02 03:26:54 【问题描述】:

我想让代码更简洁一些。 哪一个更好? 使用 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】:

如果可以,请始终使用无状态或有状态的小部件,而不是返回小部件的函数。

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

父窗口小部件(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)
        ],
      ),
    );
  

导入文件后就可以正常使用小部件了。

希望对您有所帮助。真的很容易做,并保持一切简洁/干净。

【讨论】:

以上是关于Function 或 StatelessWidget 哪个最好? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Function 或 StatelessWidget 哪个最好? [复制]

求解密(function()function Aa(a,b,c)开头JS及解密工具或代码

在'header.php'或'function.php'文件中插入Bootstrap目录更好吗?

PHP 中的闭包或 create_function

测试一些东西:选择器需要是 typeof `string` 或 `function`

替换(或重新实现?)std::function 进行一些统计和测试