我正在尝试做一些基本的事情,比如使用递归函数在我的应用程序的主页中生成一个树视图。
在此,该进程概述如下:
{
tree: {
total:"3",
name:"A name",
children[
{
total:"4",
name:"Another name",
children:[
{},...
]
},
{
total:"5",
name:"Main name",
children:[
{},...
]
},
]
}
}Levels)。下面是代码片段(没有状态管理):class MainPage extends StatelessWidget {
const MainPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
//get doc from firestore!
stream: FirebaseFirestore.instance.collection('taxonomy_tree').doc("main_tree").snapshots(),
builder:(context, AsyncSnapshot<DocumentSnapshot<Map<String, dynamic>>>snapshot){
if(!snapshot.hasData) return Text("Loading");
else {
Map<String, dynamic>? tree = snapshot.data?.data();
if(tree != null){
return Levels(elements:tree["tree"] as Map<String,dynamic>,level:0.0);//call Levels Widget
} else return Text("No data");
}
}
);
}
}
class Levels extends StatefulWidget {
Levels({Key? key, required this.elements, required this.level}) : super(key: key);
final Map<String, dynamic> elements;
final double level;
@override
_LevelsState createState() => _LevelsState();
}
class _LevelsState extends State<Levels> {
@override
Widget build(BuildContext context) {
List<Map<String, dynamic>> el = widget.elements.containsKey("children") ? widget.elements["children"] as List<Map<String, dynamic>> :[];
return Padding(
padding: EdgeInsets.only(left:widget.level*10),
child: ListView(
children: [
Text(widget.elements["name"] ?? ""),
Text(widget.elements["total"]?.toString() ?? "0.0"),
//OUCH! el[i] seems to cause an ERROR
for (int i = 0; i< el.length;i++) Levels(elements:el[i], level: widget.level+1)
]
)
);
}
}当代码试图用参数Levels调用el[i]时,我得到以下erorr:
type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>' in type cast
我尝试显式地转换el[i] (el[i] as Map<String,dynamic>),但仍然得到了错误。
我遗漏了什么?
谢谢
发布于 2021-11-25 11:49:49
之所以发生这种情况,是因为当您创建类的另一个Level对象时,您的条件
List<Map<String, dynamic>> el = widget.elements.containsKey("children") ? widget.elements["children"] as List<Map<String, dynamic>> :[];在对象类中再次运行。
但是你的下一个children
children:[
{},...
]没有任何数据,这意味着它将返回
Map
要解决这个问题,只需在数据树的另一个children中填充一些数据,如下所示
{
"tree": {
"total": "3",
"name": "A name",
"children": [
{
"total": "4",
"name": "Another name",
"children": [
{"data": 121}
]
},
{
"total": "5",
"name": "Main name",
"children": [
{"data1": 4545}
]
},
]
}
}https://stackoverflow.com/questions/70109582
复制相似问题