我们开始使用Dart强力模式和我们的聚合物飞镖码,老实说它看起来很糟糕。看起来很糟糕,我需要就此事提出第二意见。它看起来很丑陋,老实说不能。
所以我们使用一些混合输入来创建一堆PolymerDart视图用于通用代码。这个通用代码在任何地方都可以重复使用,因此我们为什么要将它作为mixin。
我们的旧设计:
abstract class MyModel{ ... }
class SubModel extends MyModel with JsProxy{ ... }
@behavior
abstract class MyBehavior implements PolymerBase {
@Property(notify:true)
MyModel model = null;
// ....
}
@PolymerRegister("my-component")
class MyViewModel extends PolymerElement with MyBehavior {
@Property(notify:true)
SubModel model = null;
// ...
}
目的是使用通用模型来表示信息,并在行为中利用它。由于SubModel扩展了它,我们可以正常插入任何地方,行为也可以。我的同事说这是一个巨大的 NO ,我很困惑为什么。他说这是一个聚合物问题,所以当我们离开Polymer时,它将能够完成。
然后,他在代码库中推出了一个重构器,因此它可以工作。@PolymerRegister("my-component")
class MyViewModel extends PolymerElement with MyBehavior {
@Property(notify:true)
MyModel model = null; // <-- changed to parent type from Behavior
//example reference
void test(){
int id = (model as SubModel).id; // <-- using AS to explain what it really is.
}
}
现在他把这个放在了所有地方,用model.id
更新了(model as SubModel).id
的所有引用。我认为这很丑陋而且完全错了。 (当然,我对PolymerDart的所有内容都有这种感觉。)
在与Mixins打交道时,这真的是这样做的吗?由于mixin已经有了这个定义,我们也不应该在MyViewModel代码中使用它。
有人可以向我解释为什么根据强模式这是正确的吗?为什么必须发生这种变化?虽然我相信我的同事,但似乎有些东西似乎已经消失了,我希望有更深入的了解。我相信,他是正确的,也许是因为完全归功于Polymer Dart,但也许有办法绕过所有属性重命名,并在任何地方使用(.. as Whatever)
。
analysis_options.yaml:
analyzer:
strong-mode: true
编辑:原因在于,由于模型被定义为行为中的属性,因此它是不可变的。我们无法覆盖MyViewModel类中的类型。由于SubModel扩展了MyModel,因此应该允许存在。