我有模特
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";
}
对任何建议或黑客开放:)
答案 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团队为代码生成创建了许多工具;去看看!