如何将任何可迭代分配给小部件?

Posted

技术标签:

【中文标题】如何将任何可迭代分配给小部件?【英文标题】:How can I assign any iterable to a widget? 【发布时间】:2021-02-26 17:51:32 【问题描述】:

错误:无法将元素类型“List”分配给列表类型“Widget”。

我正在学习制作颤振应用程序,并且在该视频中教我的其他人说明了相同的代码,并且运行良好。可能是版本问题。

return Card(
      margin: EdgeInsets.all(10),
      child: Column(
        children: [
          ListTile(
            title: Text('₹$widget.order.amount'),
            subtitle: Text(DateFormat('dd/MM/yyyy hh:mm').format(widget.order.dateTime)),
            trailing: IconButton(icon: Icon(_expanded ? Icons.expand_less :Icons.expand_more),
                onPressed: ()
              setState(() 
                _expanded = !_expanded;
              );
                ),
          ),
          if(_expanded)
            Container(
              height: min(widget.order.products.length * 20.0 + 10, 100),
              child: ListView(
                children: [
                  widget.order.products.map((prod) => Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Text(prod.title,
                        style: TextStyle(
                            fontSize: 18,
                            fontWeight: FontWeight.bold
                        ),
                      ),
                      Text('₹$prod.quantityx ₹$prod.price',
                        style: TextStyle(
                            fontSize: 18,
                            color: Colors.grey
                        ),
                      )
                    ],
                  ),).toList()
                ],
              ),
            )
        ],
      ),
    );

【问题讨论】:

请添加有关您的问题的更多详细信息。是编译、构建还是运行时问题? 【参考方案1】:

你应该在映射时删除[ ],检查下面

ListView(
    children: widget.order.products.map((prod) => Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
            Text(
               prod.title,
               style: TextStyle(
                 fontSize: 18,
                 fontWeight: FontWeight.bold
               ),
            ),
            Text(
               '₹$prod.quantityx ₹$prod.price',
                style: TextStyle(
                   fontSize: 18,
                   color: Colors.grey
                ),
            )
                    ],
        ),).toList(),
),

【讨论】:

【参考方案2】:

只需删除ListView 的孩子的[]

你的代码应该如下:

return Card(
      margin: EdgeInsets.all(10),
      child: Column(
        children: [
          ListTile(
            title: Text('₹$widget.order.amount'),
            subtitle: Text(DateFormat('dd/MM/yyyy hh:mm').format(widget.order.dateTime)),
            trailing: IconButton(icon: Icon(_expanded ? Icons.expand_less :Icons.expand_more),
                onPressed: ()
              setState(() 
                _expanded = !_expanded;
              );
                ),
          ),
          if(_expanded)
            Container(
              height: min(widget.order.products.length * 20.0 + 10, 100),
              child: ListView(
                children: 
                  widget.order.products.map((prod) => Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Text(prod.title,
                        style: TextStyle(
                            fontSize: 18,
                            fontWeight: FontWeight.bold
                        ),
                      ),
                      Text('₹$prod.quantityx ₹$prod.price',
                        style: TextStyle(
                            fontSize: 18,
                            color: Colors.grey
                        ),
                      )
                    ],
                  ),).toList()
                ,
              ),
            )
        ],
      ),
    );

由于您已经在.toList() 中创建了小部件列表,因此它不应被 [] 包围

【讨论】:

【参考方案3】:

ListView 小部件需要“小部件列表”,但是,您在使用地图时为其提供了嵌套的小部件列表,并在将它们转换为列表时返回“行”。因此,简而言之,ListView 在另一个列表中呈现行列表。 您可以使用“Spread Operator”来解决问题。它将每个 Row 小部件放入嵌套列表中,并将其作为“ListView”的直接子级。 在映射产品之前使用三个点“...”将解决错误。像这样; "...widget.order.products.map((prod) => Row(" 要么 只需删除 ListView 的子项的 []。它会做同样的事情。

【讨论】:

以上是关于如何将任何可迭代分配给小部件?的主要内容,如果未能解决你的问题,请参考以下文章

Shopware - 将 $sUserLoggedIn-Variable 传递给小部件

小部件未在 pyqt5 中显示标签

我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类

如何在 Qt 中制作可展开/可折叠的部分小部件

Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?

如何将 ref 作为组件对象中的道具传递?