无法在通用函数中使用通用函数

时间:2019-07-30 06:56:33

标签: flutter dart

我的代码中有以下课程

abstract class DatabaseKey<T> implements Built<DatabaseKey<T>, DatabaseKeyBuilder<T>> {
  DatabaseKey._();
  factory DatabaseKey([void Function(DatabaseKeyBuilder<T>) updates]) = _$DatabaseKey<T>;

  String get name;
}

然后,我定义以下通用的typedef函数:

typedef ObserveDatabaseEntity = Observable<DatabaseEntity<T>> Function<T>(DatabaseKey<T> key);

但是,当我尝试按以下方式使用它时,代码有错误。

  static ObserveConfigurationValue observe(
      GetConfigurationState getState,
      ObserveDatabaseEntity observeDatabaseEntity,
  ) {
    assert(getState != null);
    assert(observeDatabaseEntity != null);

    return <KT>(ConfigKey<KT> key) {
      return Observable.just(getState())
          .flatMap((state) {
            final dbKey = _databaseKeyFromConfig<KT>(key);

            return observeDatabaseEntity(dbKey)
              .map(_configValueFromDatabaseEntity);
          });
    }
  }
DatabaseKey<T> _databaseKeyFromConfig<T>(ConfigKey<T> key) {
  return DatabaseKey((build) => build
    ..name = key.value,
  );
}

我得到的错误是:

  

不能将参数类型DatabaseKey分配给参数DatabaseKey。

我看不到这段代码有什么问题,或者为什么它不起作用,但是也许我对可以用Dart编写的内容的理解是错误的。如果可能的话,写这个的正确方法是什么?

EDIT#1:

注意:

typedef ObserveDatabaseEntity在一个文件中 static ObserveConfigurationValue observe(GetConfigurationState getState, ObserveDatabaseEntity observeDatabaseEntity)是另一个文件

从玩法来看,似乎将它们放在一个文件中,错误消失了。

仍然,我相信这也应该在单独的文件中起作用,

1 个答案:

答案 0 :(得分:1)

此错误看起来像是导入不匹配。

在dart中,您可以通过相对路径或包导入文件。

merge(a, b, by=c("month", "site"))

merge(a, b, by=c("month", "site"), all=TRUE)

unique(a) %>%
merge(b, by=c("month", "site"), all =TRUE)

left_join(a, b, by=c("month", "site"))

right_join(a, b, by=c("month", "site"))

确实没有更好的方法,但是一旦选择了一种方法,就必须坚持下去。如果不这样做(这意味着您已经使用包导入方式导入了文件,并且使用相对路径在其他位置导入了相同文件),Dart会将它们放在两个不同的名称空间中,并认为它们是两个不同的类。