如何创建小部件引用的映射



我正在尝试创建一个映射<字符串,小工具>这样我就可以使用它来根据密钥动态地确定要使用哪个小部件。

场景:

class WidgetA extends StatelessWidget {...}
class WidgetB extends StatelessWidget {...}
class WidgetC extends StatelessWidget {...}
class WidgetD extends StatelessWidget {...}

我想创建一个类似的地图:

const Map<String, Widget> map_to_widget = {
   'widgetA': WidgetA,
   'widgetB': WidgetB,
   ...
}

这将允许我根据需要渲染的小部件列表动态创建小部件。上面所有的小部件都会接受相同的参数,所以我打算像这样使用它(仍然需要弄清楚如何传递参数(:

return Container(
   child: map_to_widget('widgetA')
)

当我尝试创建映射时,我不断得到The element type 'Type' can't be assigned to the map value type 'Widget'.dartmap_value_type_not_assignable错误。

因此,特定错误来自以下内容:

'widgetA': WidgetA,

上面,WidgetA不是一个小部件,它是一个类型,类似于1是int,但int是类型。

要解决这个问题,你会想做这样的事情:

'widgetA': WidgetA(),

以便实际创建小部件。

正如您所说,当您想将参数传递给这些小部件时,问题就来了。如果无论发生什么情况,参数总是相同的,那么您可以直接传递它们:

'widgetA': WidgetA(title: 'this is widget A'),

但是,如果参数可能会随着你使用小部件而改变,那么你就不能为此使用小部件映射,我建议使用一个函数映射:

Map<String, Widget Function(String)> widgets {
  'widgetA': (title) => WidgetA(title: title),
  ...
}

这样,当获得小部件时:

widgets['widgetA']('this is my title');

最新更新