Flutter是否可以对抽象部件使用具有抽象层的多态性?

时间:2019-05-16 12:27:43

标签: design-patterns dart flutter

我有大约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的实例。如果有人知道实现我的结构的更好方法,那对我会有很大帮助!

1 个答案:

答案 0 :(得分:0)

使您的Visualizer扩展或实现AbstractWidget。但是,我必须同意Rémi Rousselet。抽象类应该对子类一无所知(无论如何,这就是为什么它是抽象类)。我会改为:

Widget

我只想补充一下您说的话:

  

仅仅是开关盒与我所教过的设计模式和原理背道而驰。

这里的想法是始终寻找抽象而不是重复条件结构。请注意重复强调。如果多次使用条件结构,则抽象通常是一个更好的选择。如果不是这种情况,则可能是通过创建抽象来解决问题。

再次,请注意重复强调。当您具有许多条件结构时,您往往需要一个抽象,但是最后我将最终使用 ONE 条件。换句话说,您无法摆脱条件结构,只会减少使用它。

在此问题的上下文中,似乎您遵循了所有规则。对我来说,这看起来像是干净的代码。