Flutter 颤振识别由loop或listview.builder构建的小部件

Flutter 颤振识别由loop或listview.builder构建的小部件,flutter,dart,Flutter,Dart,我无法回避这个问题,如何选择由for loop或ListView.builder构建的小部件? 在我将发布的代码中,我有for循环构建的按钮, 我想在单击时更改按钮的背景色 我在我的项目中使用Provider,所以这个函数是通过Provider实现的。 在我的Provider类中,我创建了一个布尔值和一个函数来切换该布尔值,然后我将其分配给按钮,并使用三元运算符将其颜色设置为该布尔值 虽然这有些效果,但问题是。。。for循环生成的所有按钮都会受到影响, 意思我按下一个按钮,所有的颜色都变了。 我

我无法回避这个问题,如何选择由for loop或ListView.builder构建的小部件? 在我将发布的代码中,我有for循环构建的按钮, 我想在单击时更改按钮的背景色

我在我的项目中使用Provider,所以这个函数是通过Provider实现的。 在我的Provider类中,我创建了一个布尔值和一个函数来切换该布尔值,然后我将其分配给按钮,并使用三元运算符将其颜色设置为该布尔值

虽然这有些效果,但问题是。。。for循环生成的所有按钮都会受到影响, 意思我按下一个按钮,所有的颜色都变了。 我该如何解决这个问题

我的小部件,包括提到的按钮:

ListView(
     children: [
      for(int i = 0; i < recipeIngredients.length; i++)
       IngredientsTab(
          ingredientText: recipeIngredients[i],
          textColor: categoryAndSeeAllColor,
          width: width,
          **buttonColor: provider.isButtonPressed ? accentColor : Colors.grey[100],**
          buttonIcon: Icons.add,
          buttonText: 'Add to cart',
          buttonTextColor: accentColor,
          **buttonAction: provider.changeBackground,**
                    ),
                  ],
                ),
虽然我知道这是有明显原因的,但我将此isButtonPressed分配给所有按钮,因此当它为真时,它们都会更改。。。所以这是有道理的,我只是不知道如何解决它,我在另一个项目中也遇到了类似的问题,其中项目是用ListView.builder构建的


因此,如果有人能帮我做这件事,对我来说意义重大:

通常你会在供应商中列出一份配料清单。 每个成分都有一个ID和一个布尔选择变量。 buttonAction调用ID为的方法:

void changeBackground(int ingredientID) {
    ListOfIngredients.singleWhere((elem)=>elem.ID==ingredientID)).isButtonPressed = !isButtonPressed;
    notifyListeners();
  }

然后,使用成分列表构建ListView,并为每个成分检查isButtonPressed值。

确保小部件可以监听您所做的更改。。您的小部件可以监听您的操作吗?您可以创建一个列表isButtonPressed来存储每个按钮的值。然后在ListView构建器中,检查isButtonPressed[index]@CarlosSR,而不是检查一般的isButtonPressed,这是个好主意,但我该如何定义此列表的大小?我不知道我会有多少个按钮get@proversion可以吗?就像我说的,它会改变颜色。我怎么能在列表中有成分和ID。。也许你在想地图?喜欢的成分:我有,但我没有那样的。。。我把它作为字符串列表。。因此,这个解决方案无法使用映射列表[{name:cheese,id:1},{name:orange,id:2}]或更好的对象列表:类成分{final String name;final int id;Ingredientname,id;}
void changeBackground(int ingredientID) {
    ListOfIngredients.singleWhere((elem)=>elem.ID==ingredientID)).isButtonPressed = !isButtonPressed;
    notifyListeners();
  }