首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振型“List<dynamic>”中的递归Widget不是类型类型“List<Map<String,dynamic>>”的子类型

颤振型“List<dynamic>”中的递归Widget不是类型类型“List<Map<String,dynamic>>”的子类型
EN

Stack Overflow用户
提问于 2021-11-25 10:35:42
回答 1查看 318关注 0票数 0

我正在尝试做一些基本的事情,比如使用递归函数在我的应用程序的主页中生成一个树视图。

在此,该进程概述如下:

  1. 将整个树结构从防火墙中检索为单个文档。文档的结构如下(伪文档):

代码语言:javascript
复制
{
   tree: {
       total:"3",
       name:"A name",
       children[
           {
               total:"4",
               name:"Another name",
               children:[
                   {},...
               ]
           },
           {
               total:"5",
               name:"Main name",
               children:[
                   {},...
               ]
           },
       ]

   }
}

  1. 使用Widget解析检索到的文档的结构,然后显示树。由于我想管理每个级别内的一些状态(例如,打开/关闭,ecc),所以我选择了一个states (Levels)。下面是代码片段(没有状态管理):

代码语言:javascript
复制
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>),但仍然得到了错误。

我遗漏了什么?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-11-25 11:49:49

之所以发生这种情况,是因为当您创建类的另一个Level对象时,您的条件

代码语言:javascript
复制
List<Map<String, dynamic>> el = widget.elements.containsKey("children") ? widget.elements["children"] as List<Map<String, dynamic>> :[];

在对象类中再次运行。

但是你的下一个children

代码语言:javascript
复制
     children:[
                   {},...
               ]

没有任何数据,这意味着它将返回

Map

要解决这个问题,只需在数据树的另一个children中填充一些数据,如下所示

代码语言:javascript
复制
{
  "tree": {
    "total": "3",
    "name": "A name",
    "children": [
      {
        "total": "4",
        "name": "Another name",
        "children": [
          {"data": 121}
        ]
      },
      {
        "total": "5",
        "name": "Main name",
        "children": [
          {"data1": 4545}
        ]
      },
    ]
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70109582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档