大括号在Dart构造函数中有什么作用?

时间:2019-02-20 12:52:57

标签: dart flutter

我从演示中复制了此代码的基本结构,并根据自己的需要进行了调整(并针对此问题进行了简化)。

但是我对两件事感到困惑。也许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类包含两个成员变量riskNamepolicyNumber

我的问题是:-

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

但是我的主要问题是:-为什么Policy类构造函数变量放在花括号{}中?如果我删除它们,Policy类仍然可以编译,但是现在allPolicies变量不能编译(错误消息是“期望2个必需参数,但找到0个”)

2 个答案:

答案 0 :(得分:2)

  

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

在Dart中,允许其具有顶级变量和顶级功能。不需要将它们放在课堂上。

  

为什么将Policy类的构造函数变量括在大括号{}中?

大括号内的参数为optional named parameters

答案 1 :(得分:1)

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

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

但是我的主要问题是:-为什么将Policy类的构造函数变量包装在大括号{}中?如果我删除它们,Policy类仍然可以编译,但是现在allPolicies变量不能编译(错误消息是“期望2个必需的参数,但找到0个”)

  • 命名参数。当您创建xClass的实例时,像这样输入xClass({String myParamName})这样的参数时,您将通过参数名传递参数值,例如地图              //键值
    xClass(myParamName:“ myParamValue”)

这很酷,因为避免参数排序和不匹配。 更多详细信息here

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

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} ){ ... }