我想遍历非常相似的按钮列表,但是我不确定最好的方法是什么,因为每个按钮都需要一个传递单个参数的onPressed函数。
b
因此,我在将不同的 Column(
children: buttons
.map(
(item) => Row(
children: <Widget>[
myButton(item[0], item[2]),
myButton(item[1], item[2]),
],
),
)
.toList(),
),
class MyButton extends StatelessWidget {
MyButton(this.abool, this.onPressed);
final bool abool;
final Function onPressed;
@override
Widget build(BuildContext context) {
return RawMaterialButton(
child:
Image.asset('images/button.png'),
onPressed: onPressed,
);
函数存储在onPressed
数组中时当然遇到了问题。遍历列中的类似按钮列表的最佳方法是什么?
答案 0 :(得分:0)
自Dart 2.3起,您就可以使用列表理解功能(也称为UI-as-code)来直接在列表内部生成按钮。
List<String> labels = ['apple', 'banana', 'pineapple', 'kiwi'];
List<VoidCallback> actions = [_buyApple, _doSomething, _downloadData, () => print('Hi')];
...
Column(
children: [
for (int i = 0; i < labels.length; i++)
RaisedButton(
label: Text(labels[i]),
onPressed: actions[i],
),
],
)
答案 1 :(得分:0)
如果Button不具有相似的行为,则不必创建Mybutton类。 您不能为“注册”按钮和“登录”按钮设置一个类,每个类的职责和行为都不同。
例如,当您拥有数据模型(shopItem)时,应使用此类(从代码中,我认为是这种情况),例如,您需要(添加到购物车)功能,在这种情况下,制作addToCartButton并变成这样:
class AddToCartButton extends StatefulWidget {
final ShoptItem item;
AddToCartButton({Key key, this.item}) : super(key: key);
@override
_AddToCartButtonState createState() => _AddToCartButtonState();
}
class _AddToCartButtonState extends State<AddToCartButton> {
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text('Add to Cart'),
onPressed: () {
setState(() {
cartList.add(item);
});
},
);
}
}
请注意,如果按钮本身有任何状态,例如
,我就使用有状态的小部件(不是必需的)Text(inCart? 'already in cart':'add to cart'),'
除非您使用状态管理器(例如provider,bloc等)
这里的第二个通知(最重要)是我使用了cartList,它基本上是ShopItem的列表。
现在所有按钮都具有相似的功能(向购物车中添加商品),但是每个按钮都应添加不同的商品,可以在您正在使用的列或我喜欢的ListView构建器中完成此操作
列方法:
Column(
children: <Widget>[
for( item in itemsList)
AddToCartButton(item : item);
],
ListViewBuilder方法:
ListView.builder(
itemCount: itemsList.length,
itemBuilder: (context,index){
return AddToCartButton(item : itemsList[index]);
},
)
我希望能对您有所帮助