目标是使用父类的属性来调用方法并扩展该类的内容。
下面的代码被设计为基于父类的属性调用方法。它返回一个类型错误。
它是这样被调用的:
MyToolbar(data: [
{
'MySecondClass': ['red','green','purple']
}
])
这个是类:
class MyToolbar extends StatelessWidget {
MyToolbar({required this.data})
final List data;
ToolbarContent(type, data) {
if (type == 'MySecondClass') {
return MySecondClass(toggles: data);
}
@override
Widget build(BuildContext context) {
return Stack(children:[
for (List childData in data)
ToolbarContent('mySecondClass', childData),
])}
首先,它返回以下类型错误:
_TypeError (type '_InternalLinkedHashMap<String, List<String>>' is not a subtype of type 'List<dynamic>')
其次,列表需要找到属性数据的键,以便为函数'ToolbarContent'设置正确的函数名。
这里有几个问题。首先,正如temp_所提到的,您需要为data
设置List类型,在本例中为List<Map<String,List<String>>
第二种情况是for (List childData in data)
实际上需要是for (Map<String,List<String>> childData in data)
第三个是一个假设,但我认为在你的for
循环中,mySecondClass
应该是MySecondClass
(或其他方式)
正确的代码如下:
class MyToolbar extends StatelessWidget {
final List<Map<String, List<String>>> data;
MyToolbar({required this.data});
@override
Widget build(BuildContext context) {
var children = <Widget>[];
data.forEach((childData) {
childData.forEach((key, stringList) {
//I'm assuming Toolbar content takes the key of the map i.e. MySecondClass
//as the first param and the List for the key as the second param
children.add(ToolbarContent(key, stringList));
});
});
return Stack(
children: children,
);
}
}
注意:我也假设ToolbarContent
是另一个类,但请让我知道,如果不是这样。
默认情况下Dart将任何List设置为List<dynamic>
。这就是误差的含义。你需要转换你的列表,试试这个代替final List<Map<String, List<String>> data;