Dart 如何在没有省道的情况下用省道指向场地:镜子?

Dart 如何在没有省道的情况下用省道指向场地:镜子?,dart,flutter,Dart,Flutter,我有一个模型 class Model { int counter; } 现在我在运行时得到一个模型对象,所以我将其标记为动态 dynamic model = new Model(); int counter = 3; 可能的方法是什么 model['counter'] = counter; 值得一提的是,应用程序中的某个地方使用了来自模型的计数器,所以摇树不会将其删除 我正在寻找任何解决办法 class Model { int counter; var counterPa

我有一个模型

class Model {
  int counter;
}
现在我在运行时得到一个模型对象,所以我将其标记为动态

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";

}

接受任何建议或攻击:

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

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'; 
  }
}

我不推荐这样做,因为使用model['string']会使您在可维护性方面失去很多。 但是,如果您确实需要它,实现这一点的最佳方法是使用代码生成

对你来说,这可能是个好主意。因为它将生成一个toJson方法和一个MyClass.fromJson构造函数;无需以任何方式更改您的模型

最后你会

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

  factory Model.fromJson(Map<String, dynamic> json) => _$ModelFromJson(json);
}
就性能而言,这可能不是最理想的。但它不太可能有bug或需要不断编辑

这是一个简单的解决方案

class Model {
  int counter;

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

}
但那是丑陋的;请不要那样做。 如果您有一个需要反射的实际用例,那么不要放松所有类型检查;创建自定义代码生成器

dart中有一些非常棒的代码生成器工具

从较低的层开始,然后是一些。
Dart团队创建了许多代码生成工具;去看看

谢谢,这是一个很好的解决办法。如果有人提出了其他的解决方案,我会等待,然后我会将其标记为正确。当然,这是完全正确的。您也可以在以后的任何时候更改已接受的答案。无需思考,这是最好的解决方案。让它变得更好的唯一方法是使用一些代码生成工具,以避免手动编写和维护switch语句。我没有定义运算符,而是强制实现了具有相同功能的接口。谢谢您的解决方案。我试图避免在我正在编写的dependecy注入包中生成代码。因此,我正在寻找这个黑客实现。颤振飞镖一般包含代码生成。DI是一个完美的用例。有一些包可以生成DI所需的所有东西;不丢失类型检查/自动完成。是的,我知道,但我想让DI在不生成代码的情况下工作。然后,如果您愿意,您可以生成代码,它也可以工作,从而删除样板文件。