class - 可选参数的默认值必须是常数颤振/飞镖
问题描述
我正在尝试在 Event 类中组织一些 Site 类数据,但我得到一个“可选参数的默认值必须是常量”,我已经为此苦苦挣扎了一段时间。
我发现了这一点:可选参数的默认值必须是常量,但我很难将该示例的细节与我的代码联系起来。
我的意图是使用 Site 类在 Site 构造函数中查找所有相关的站点数据(地址、电话等),然后将其存储在 Event 类中作为它自己的参数......但我不是确定最好的方法。
这是代码:
class Event {
// passed
final TimeOfDay earliestTime;
final DateTime startTime;
final String siteName;
Site siteInfo;
Event(
{
@required this.earliestTime,
@required this.startTime,
@required this.siteName,
this.siteInfo = Site(siteName)} //<-- "Site(siteName) is underlined in red with the
// non_constant_default_value error
) { }
}
class Site {
String siteName;
Site(String siteName) {
this.siteName = "Site 1"; //<-- my attempt at a default value
int index = sites.indexOf(siteName);
phone = phones[index];
addressStreet = addressStreets[index];
}
String addressStreet;
String phone;
}
List<String> sites = [ // <-- Site lookup table
"Site 1",
"Site 2",
];
List<String> phones = [ // <-- use index to get values
"(312)857-5309",
"(773)857-5310",
];
List<String> addressStreets = [
"123 Bear St.",
"234 Elk St.",
];
简而言之,错误是什么,我将如何使用 Site 类作为在 Event 类中保存所有站点数据的一种方式?
解决方案
Event({ @required this.earliestTime, @required this.startTime, @required this.siteName, this.siteInfo = Site(siteName) }) {}
您指定如果某些东西构造了一个Event
对象但省略了siteInfo
参数,则Event
构造函数应初始化siteInfo
为默认值Site(siteName)
. 但是,Dart 要求默认参数值是编译时常量,并且Site(siteName)
无法在编译时确定,因为它依赖于siteName
.
通常,您可以改为使用默认值null
并稍后通过初始化列表对其进行初始化:
Event({
@required this.earliestTime,
@required this.startTime,
@required this.siteName,
Site siteInfo
}) : siteInfo = siteInfo ?? Site(siteName) {}
或在构造函数体内。
也就是说,我不清楚你是否真的想要Event
同时拥有siteName
和siteInfo
参数。如果提供siteName
的与 不同,可以siteInfo.siteName
吗?如果不是,则Event
构造函数应要求仅提供一个以消除任何不一致的可能性,例如:
Event({
@required this.earliestTime,
@required this.startTime,
@required this.siteName,
}) : siteInfo = Site(siteName) {}
或者
Event({
@required this.earliestTime,
@required this.startTime,
@required this.siteInfo
}) {}
String get siteName => siteInfo.siteName;
推荐阅读
- apache-kafka - 您如何在 Apache Kafka 中使用 AVRO 序列化处理嵌套的源数据?
- c++ - 在 C++ 中将函数分配给变量
- java - 为什么服务未在 AWS ECS Fargate 中读取 AWS Secrets Manager
- ssl - 将 SSL 配置迁移到 Elytron
- html - 从主页中删除课程
- r - 如何自动计算具有或不具有行名的表的行数和列数
- powershell - 如何使用 Powershell 脚本在 SharePoint 现代页面中创建嵌入 Web 部件和按钮 Web 部件
- flutter - Flutter - 更新 CustomScrollView 的滚动控制器
- c# - 通过 MSIX 包安装的应用程序“忘记”虚拟 LocalAppData 路径
- javascript - 隐藏没有价值的图表线