我有大约8个小部件,它们全部接受一个X类型的参数并以不同的方式显示X类型的内容。我试图创建的是一个定义此类小部件结构的抽象层。除了结构之外,抽象层还将定义一种工厂方法,以根据ID决定使用哪种实现。不同的实现都是扩展Stateless-或StatefulWidget的小部件。
抽象层如下所示:
abstract class AbstractWidget {
final X content;
factory AbstractWidget({@required int id, @required X content}) {
switch (id) {
case 1:
return Implementation1(content);
break;
default: return Implementation2(content);
}
}
}
一个实现如下所示:
class Implementation1 extends StatelessWidget implements AbstractWidget {
final X content;
Implementation1(this.content);
@override
Widget build(BuildContext context) {
// Display content in some type of way
}
}
所以我要实现的目标如下:
var widgetList = new List<Widget>();
for (var item in items) {
X content = fetchContentFromAPI();
widgetList.add(AbstractWidget(content: content, id: item.id));
}
return Column(children: widgetList);
这是行不通的,因为AbstractWidget从技术上讲不是Widget类型,即使它只能返回Stateless-或StatefulWidgets的实例。如果有人知道实现我的结构的更好方法,那对我会有很大帮助!
答案 0 :(得分:0)
使您的Visualizer
扩展或实现AbstractWidget
。但是,我必须同意Rémi Rousselet。抽象类应该对子类一无所知(无论如何,这就是为什么它是抽象类)。我会改为:
Widget
我只想补充一下您说的话:
仅仅是开关盒与我所教过的设计模式和原理背道而驰。
这里的想法是始终寻找抽象而不是重复条件结构。请注意重复强调。如果多次使用条件结构,则抽象通常是一个更好的选择。如果不是这种情况,则可能是通过创建抽象来解决问题。
再次,请注意重复强调。当您具有许多条件结构时,您往往需要一个抽象,但是最后我将最终使用 ONE 条件。换句话说,您无法摆脱条件结构,只会减少使用它。
在此问题的上下文中,似乎您遵循了所有规则。对我来说,这看起来像是干净的代码。