需要作为义务 - 颤振

Posted

技术标签:

【中文标题】需要作为义务 - 颤振【英文标题】:Required as an obligation -flutter 【发布时间】:2021-09-16 04:59:56 【问题描述】:

伙计们,为什么在创建命名构造函数时必须使用“必需”关键字? 如何创建命名构造函数而不需要考虑?

  class IconPage extends StatelessWidget 
  
  IconPage(required this.icon,required this.label);
  final String label;
  final IconData icon;

  @override
  Widget build(BuildContext context) 
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Icon(
          icon,
          color: Colors.white,
          size: 70,
        ),
        SizedBox(height: 10),
        Text(
          label,
          style: kStandartFontSize,
        ),
      ],
    );
  
 

以下是当我尝试在没有 required 关键字的情况下创建命名构造函数时出现的错误消息:

参数'label'不能有'null'的值,因为它的类型,但是隐含的 默认值为“空”。 尝试添加显式的非“null”默认值或“required”修饰符。

【问题讨论】:

【参考方案1】:

required 关键字表示该参数是强制性的。如果您不想使用required,则必须使用? 将变量更改为nullable。但是,您必须确保处理可以为空的参数。

 class IconPage extends StatelessWidget 
  
  IconPage(this.icon, this.label);
  final String? label;
  final IconData? icon;

  ...
 

【讨论】:

谢谢@quoci【参考方案2】:

作为对另一个答案的补充:

您使用named parameters 创建了您的构造函数。它们被称为命名参数,因为当你调用你的函数时,你会这样调用它:

function (namedParameter1: "abc", namedParameter2: "123");

所以你可以改变参数的顺序或者根本不调用一个参数。

“不使用 required 关键字”的一种方法是不使用命名参数,而是使用常规的“位置参数”:

IconPage(this.icon, this.label);

在这种情况下,您传递的参数的顺序很重要,默认情况下所有这些参数都是必需的。

所以应该这样调用:

IconPage(IconData(...), "abc"),

虽然这在编写自定义小部件时并不常见(我也不推荐它),但可以使用更简单的功能而不会影响可读性。你可以阅读更多关于位置参数和命名参数的区别here。

【讨论】:

以上是关于需要作为义务 - 颤振的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要取消 Stream<QuerySnapshot> (颤振)

邮递员上的授权类型不记名令牌和来自 API 的请求数据,这需要带有颤振的令牌不记名

颤振蜂巢盒不可听

第二十三篇 责任与义务

在颤振中存储来自表单的信息

使用 vs 代码从 github 克隆一个颤振项目