如何在没有飞镖的情况下指向飞镖场:镜子?

时间:2018-03-05 16:32:09

标签: dart flutter

我有模特

class Model {
  int counter;
}

现在我在运行时获得了一个Model对象,因此我将其标记为动态。

dynamic model = new Model();

int counter = 3;

有什么方法可以做相同的

 model['counter'] = counter;

有一件事要提到,模特的计数器会在应用程序的某个地方使用,因此树摇动不会将其删除。

我正在寻找任何解决方案。

class Model {
  int counter;

  var counterPath = "any way to reference counter field, so I can give the value to it";

}

对任何建议或黑客开放:)

2 个答案:

答案 0 :(得分:2)

一种方法是在字符串名称和实际字段之间实现映射,如

class Model {
  int counter;

  // reading: print(model['counter']);
  operator [](String name) {
    switch(name) {
      case 'counter':
        return counter;
      default: throw 'Field $name doesn't exist' in $runtimeType'; 
  }

  // writing: model['counter'] = counter;
  operator []=(String name, dynamic value) {
    switch(name) {
      case 'counter':
        counter = value;
        break;
      default: throw 'Field $name doesn't exist' in $runtimeType'; 
  }
}

答案 1 :(得分:1)

我不建议这样做,因为使用model['string']会让您在可维护性方面失去很多。 但是如果你真的需要它,那么实现这一目标的最好方法就是使用代码生成。

在您的情况下,json_serializable可能是个好主意。因为它将生成toJson方法和MyClass.fromJson构造函数;无需以任何方式更改模型。

最后你还有

@JsonSerializable()
class Model extends Object with _$ModelSerializerMixin {
  int couter;
  Model();

  factory Model.fromJson(Map<String, dynamic> json) => _$ModelFromJson(json);
}

允许您运行以下内容:

final model = new Model()
  ..counter = 42;
final modelJson = model.toJson();
modelJson['counter'] = 43;

final result = new Model.fromJson(modelJson); // counter = 43

这可能不是表现最佳的。但它不太可能有错误或需要不断编辑。

这是为了简单的解决方案。

但那很难看;请不要这样做。 如果你有一个真正的用例,你需要反思,而不是失去所有类型检查;创建自定义代码生成器。

dart中的代码生成器有一些很棒的工具。

从较低层source_gen开始,后跟build,仅举几例。 Dart团队为代码生成创建了许多工具;去看看!