我尝试在 Dart 中创建一个函数列表,但无法为此使用 List add 方法。这是代码,它们都在同一个文件中。
// bin/filter.dart
import 'package:filter/filter.dart';
import 'package:filter/LogEntry.dart';
void main(List<String> arguments) {
LogEntry log = new LogEntry();
TripListFilter filter = new TripListFilter(true);
for (FilterFunction f in filter.filters) {
print('Filter: ${f(log)}');
}
}
// lib/LogEntry.dart
class LogEntry {
bool trailer = false;
}
// lib/filter.dart
import 'package:filter/LogEntry.dart';
typedef FilterFunction = bool Function(LogEntry a);
class TripListFilter {
TripListFilter(this.trailer);
bool? trailer;
bool _myFunction(LogEntry trip) {
if (trailer == true && trip.trailer) return true;
return false;
}
List<FilterFunction> filters = [];
filters.add(_myFunction);
}
运行这个给我错误
Building package executable...
Failed to build filter:filter:
lib/filter.dart:17:3: Error: The name of a constructor must match the name of the enclosing class.
filters.add(_myFunction);
在装有 Flutter 和 Dart 插件的 Android Studio 中,最后一行的变量上方出现了一条红线filters
。将鼠标悬停在红线上方时,我看到一条消息“构造函数的名称必须与封闭类的名称匹配”。
据我所知,“过滤器”列表的定义与_myFunction的签名相匹配。
为何无法将该功能添加到列表中?
3
最佳答案
2
问题是这一行
filters.add(_myFunction);
位于函数或构造函数主体之外,这使其成为声明。您可以将其添加到构造函数中,例如:
class TripListFilter {
TripListFilter(this.trailer){
filters.add(_myFunction);
}
bool? trailer;
bool _myFunction(LogEntry trip) {
if (trailer == true && trip.trailer) return true;
return false;
}
List<FilterFunction> filters = [];
}
_myFunction
或者按照 pskink 建议的那样使用已经在其中的过滤器初始化late
late List<FilterFunction> filters = [_myFunction];
使用late
使您能够在声明中使用其他类变量,因为它随后被延迟初始化,这意味着列表在您第一次访问它时被初始化。
|
接受的答案不仅仅回答了这个问题。但值得指出的是,以下类型的语法错误:
final a = Object();
class B{
a.hashCode(); // A statement starting with an identifier occurring
// in a class body.
}
导致错误:
The name of a constructor must match the name of the enclosing class.
在很多情况下可能会遇到,尤其是对于习惯使用 Python 但刚接触 Dart 和 Flutter 的程序员来说。
正如讨论的,有一个解决这个问题的规范问答可能会很有用,以便可以更有效地处理类似的问题。
|
List<FilterFunction> filters = []; filters.add(_myFunction);
为late List<FilterFunction> filters = [_myFunction];
–
_myFunction
可以通过简单地陈述来简化return trailer == true && trip.trailer
。任何形式的代码if X return true else return false
实际上都与return X
–
–
|