基本上,我有两个嵌套的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
的元素在当前activeCategoryIndex
的categories
中的位置
那么,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
,它带有一个空构造函数来保存列表,因此列表的每次初始化都来自一个新对象。