【问题标题】: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”修饰符。

【问题讨论】:

    标签: flutter dart


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2020-09-11
      • 2022-01-23
      • 2020-05-22
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多