从ListView构建的按钮.builder似乎对从ListView构建的所有按钮调用相同的函数 &



基本上,我有两个嵌套的ListView。第三个ListView建造者内部的建造者。两个嵌套的listview构建器构建两行自定义按钮;第二行按钮的内容取决于这两行中选择的按钮。第一行完全按预期工作,但第二行出现问题。

无论何时按下第二行中的一个按钮,它都会影响所有其他按钮(以及构建这些列表的数据)的状态,就好像对列表中的所有元素调用相同的函数一样。然而,最奇怪的是,它似乎只调用了函数的一部分:

void toggleSubcategoryPanelButton(int panelNum, int subCategoryIndex) {
App()
.panelNames[panelNum]
.panelSettings
.categories[
App().panelNames[panelNum].panelSettings.activeCategoryIndex]
.activeSubcategory =
App()
.panelNames[panelNum]
.panelSettings
.categories[
App().panelNames[panelNum].panelSettings.activeCategoryIndex]
.subcategories[subCategoryIndex];
rerollName(panelNum);
saveSettingstoPrefs();
notifyListeners();
}

App()是一个单例,它保存了这个轻量级应用程序的几乎所有数据。这个函数的目的是为activeSubcategory设置一个新的索引,仅用于调用该函数的"面板"(通过panelNum给出)。相反,该函数将所有activeSubcategory设置为相同的索引panelNames的元素在当前activeCategoryIndexcategories中的位置

那么,rerollName()似乎只对提供的panelNum调用。

问题可以在这里看到。

[![不同功能][1]][1]

您可以(希望)在这个gif中看到应用程序正确识别panelNum,因为它显示在终端中(索引为1)。

有问题的ListView:

SizedBox(
height: 30.0,
child: ListView.builder(
shrinkWrap: true,
scrollDirection: Axis.horizontal,
physics:
const NeverScrollableScrollPhysics(),
itemCount: widget
.panelSettings
.categories[widget.panelSettings
.activeCategoryIndex]
.subcategories
.length,
itemBuilder: ((context, index) {
return Consumer(
builder: (context, value, child) {
return PanelButtonToggleable(
icon: widget
.panelSettings
.categories[widget
.panelSettings
.activeCategoryIndex]
.subcategories[index]
.icon,
tooltip: widget
.panelSettings
.categories[widget
.panelSettings
.activeCategoryIndex]
.subcategories[index]
.getName(),
buttonBehavior: () =>
_onToggleSubcategoryClick(
index),
toggled: widget
.panelSettings
.categories[widget
.panelSettings
.activeCategoryIndex]
.subcategories[index]
.getName() ==
widget
.panelSettings
.categories[widget
.panelSettings
.activeCategoryIndex]
.activeSubcategory
.getName(),
);
},
);
}),
),
),
https://github.com/trevclaridge/Name-Generator-Extension

[1]: https://i.stack.imgur.com/Z2tg8.gif

我发现我的问题实际上与ListView无关。相反,widget.panelSettings.categories指向的对象实际上是List的同一个实例。因此,为activeSubcategory赋值就是为所有指向categories列表的对象赋值。

在您自己的项目中使用Dart的identical方法确认这一点。链接在这里。

为了解决这个问题,我创建了一个新类Categories,它带有一个空构造函数来保存列表,因此列表的每次初始化都来自一个新对象。

最新更新