Reflectable:myAnnotation.annotatedClasses不同的结果CmdApp<> Client

时间:2016-06-09 21:08:26

标签: dart dart-mirrors

假设我有以下注释和2个类:

class AppModel extends Reflectable {
  final String name;
  const AppModel([this.name])
      : super(newInstanceCapability, metadataCapability);
}

const appModel = const AppModel();

@appModel
class ImGonnaBePickedUp {

}

@AppModel(' :( ')
class AndImNotPickedUpOnServer_IDoOnWebClient {

}

main() {
  appModel.annotatedClasses // that's what I mean by "Picked Up".
}

在CmdApp端(服务器):AndImNotPickedUpOnServer_IDoOnWebClient中仅提供appModel.annotatedClasses

在网络方面,两个类都给出了。

长话短说,我如何检索使用直接const constructor调用注释的类,如上例@AppModel(' :( ')(对于CmdApp和Web)?

1 个答案:

答案 0 :(得分:2)

因为版本0.5.4可反映的类不支持带参数的构造函数

这出现在reflectable documentation

  

脚注:1。目前,唯一支持的设置是元数据对象是类[Reflectable]的直接子类的实例,比如说MyReflectable,并且该子类定义了一个带零参数的const构造函数。这确保了用作元数据的Reflectable的每个子类都是单例类,这意味着可以通过在类中生成代码来表达实例的行为。如果引人注目的用例出现,将来可能会支持此设置的概括。

一种可能的解决方案是使用第二个注释来处理名称,例如:

import 'package:reflectable/reflectable.dart';
import 'package:drails_commons/drails_commons.dart';

class AppModel extends Reflectable {
  const AppModel()
      : super(newInstanceCapability, metadataCapability);
}

const appModel = const AppModel();

class TableName {

  final String name;

  const TableName(this.name);

}

@appModel
class ImGonnaBePickedUp {

}

@appModel
@TableName(' :( ')
class AndImNotPickedUpOnServer_WorksOnWebClient {

}

main() {
  print(appModel.annotatedClasses); // that's what I mean by "Picked Up".

  print(new GetValueOfAnnotation<TableName>()
      .fromDeclaration(appModel.reflectType(AndImNotPickedUpOnServer_WorksOnWebClient)).name);
}

注意:我也在使用drails_common package