我正在尝试创建一个映射<字符串,小工具>这样我就可以使用它来根据密钥动态地确定要使用哪个小部件。
场景:
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');