我尝试在 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

  • 替换List<FilterFunction> filters = []; filters.add(_myFunction);late List<FilterFunction> filters = [_myFunction];


    – 


  • 1
    与您的问题无关的小建议:_myFunction可以通过简单地陈述来简化return trailer == true && trip.trailer。任何形式的代码if X return true else return false实际上都与return X


    – 


  • 这篇文章已链接到


    – 


最佳答案
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 的程序员来说。

正如讨论的,有一个解决这个问题的规范问答可能会很有用,以便可以更有效地处理类似的问题。