如何将任何可迭代分配给小部件?
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 传递给小部件
我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类