【问题标题】:What do the curly brackets do in a Dart constructor? [duplicate]Dart 构造函数中的大括号有什么作用? [复制]
【发布时间】:2019-07-14 04:08:48
【问题描述】:

我从一个演示中复制了这段代码的基本结构,并根据自己的需要对其进行了调整(并为这个问题减少了它)。

但我对一些事情感到困惑。也许 Dart 专家可以启发我......

import 'package:flutter/material.dart';

// Show policy widget - shows 
class ShowPolicy extends StatelessWidget {
  final Policy policy;

  ShowPolicy(this.policy);

  @override
  Widget build(BuildContext context) {
    return Text('Test text ' + policy.riskName + ' ' + policy.policyNumber);
  }
}

// Policy class
class Policy {
  final String riskName;
  final String policyNumber;

  Policy( { this.riskName, this.policyNumber } );
}

// what is this variable doing here?. Shouldn't it be an a class?
List<Policy> allPolicies = [
  Policy(riskName: 'Lilly', policyNumber: 'PY123456-4'),
  Policy(riskName: 'Lilly', policyNumber: 'PY123456-3'),
  Policy(riskName: 'Lilly', policyNumber: 'PY123456-2'),
  Policy(riskName: 'Farnesbarnes', policyNumber: 'PY123647-1')
];

所以基本上ShowPolicy 返回一个文本小部件。它有一个接受Policy 对象的构造函数。 Policy 类包含 2 个成员变量,riskNamepolicyNumber

我的问题是:-

什么拥有最后声明的allPolicies 变量?为什么在这里允许,为什么不必在类中声明?

但我的主要问题是:- 为什么 Policy 类构造函数变量包含在花括号 {} 中?如果我删除它们,Policy 类仍然可以编译,但现在allPolicies 变量没有(错误消息是'2 required arguments expected but 0 found')

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    什么拥有最后声明的 allPolicies 变量?为什么这里允许,为什么不必在类中声明?

    在 Dart 中,允许有顶级变量和顶级函数。不需要将它们放在一个类中。

    为什么 Policy 类构造函数变量用大括号 {} 括起来?

    大括号内的参数是optional named parameters

    【讨论】:

    • 感谢您的回复。我读过“A Tour Of The Dart Language”,发现它是一个非常有用的参考。我一定只是错过了可选名称参数 {} 位
    【解决方案2】:

    什么拥有最后声明的 allPolicies 变量?为什么这里允许,为什么不必在类中声明

    • allPolicies 归 dart 文件所有。在这种情况下,allPolicies 是一个全局变量,可以在此文件的任何位置访问,在这种情况下,也可以由包含定义 allPolicies 的文件的文件访问。这是因为 allPolicies 被定义为公共变量。

    但我的主要问题是:- 为什么 Policy 类构造函数变量包含在花括号 {} 中?如果我删除它们,Policy 类仍然可以编译,但现在 allPolicies 变量不能编译(错误消息是 '2 required arguments expected but 0 found')

    • 命名参数。当您将这样的参数设置为 xClass( {String myParamName } ) 时,当您将创建 xClass 的实例时,您将通过他的名称传递参数值,如地图 //键值
      xClass(myParamName: "myParamValue" )

    这很酷,因为可以避免参数顺序和不匹配。 更多详情here

    错误消息是“预期 2 个必需参数,但找到 0 个” - 在这种情况下是因为命名参数是必需的。需要命名参数有两种方法。您已经看到的第一种方法是使用 final 类成员作为命名参数的构造函数,例如:

    class Policy {
      final String riskName; //final class member
      final String policyNumber; // final class member
      Policy( { this.riskName, this.policyNumber } ); // class members as named parameters
    

    }

    其他方式是使用@required 注释。这将如下所示:

    MyConstructor( {@required String param1, @required int param2} ){ ... }
    

    【讨论】:

    • 感谢您的回复。我读过“A Tour Of The Dart Language”,发现它是一个非常有用的参考。我一定只是错过了可选名称参数 {} 位
    猜你喜欢
    • 2020-05-17
    • 2020-03-27
    • 2016-10-13
    • 2021-04-07
    • 2013-03-02
    • 2020-04-03
    • 2010-11-19
    • 2015-06-29
    • 2013-10-16
    相关资源
    最近更新 更多