颤抖地遍历带有地图的按钮列表

时间:2019-08-04 06:48:58

标签: flutter dart

我想遍历非常相似的按钮列表,但是我不确定最好的方法是什么,因为每个按钮都需要一个传递单个参数的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数组中时当然遇到了问题。遍历列中的类似按钮列表的最佳方法是什么?

2 个答案:

答案 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]);
  },
)

我希望能对您有所帮助