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

问题描述 投票:2回答:2

我有模特儿

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

}

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

dart flutter
2个回答
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
投票

我不推荐这个,因为使用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团队为代码生成创建了许多工具;去看看吧!

© www.soinside.com 2019 - 2024. All rights reserved.