标题一定很困惑。我实际上不知道如何准确地描述它。但是,我将尽最大努力使用代码示例:
因此,我试图在扩展图块下显示卡列表。这些卡上显示的项目是动态的,并且在扩展磁贴之间有所不同。为此,我使用了属性“onExpansionChanged”。在此属性上,我编写了以下代码:
onExpansionChanged: (value) {
if (rearrangedDays[index] == 'Saturday' || rearrangedDays[index] == 'Sunday') {
hour = ratesData.firstHourWeekend;
print(ratesData.ratesWeekend);
rates = ratesData.ratesWeekend;
print(rates);
} else {
hour = ratesData.firstHourWeekday;
print(ratesData.ratesWeekday);
rates = ratesData.ratesWeekday;
print(rates);
}
}
在ExpansionTile的child属性内的ListView Builder下,我有:
ListView.builder(
shrinkWrap: true,
itemCount: rates.length,
itemBuilder: (context, index) {
return Card(
child: Container(
alignment: Alignment.center,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Text((hour++).toString() + ':00'),
SizedBox(height: 10.0),
Text(
'Rs. ' + rates[index],
style: TextStyle(fontFamily:'silka'),
),
],
),
),
),
);
},
),
现在的问题是,如果我只声明一个数组,则项目计数将显示一条错误,指出它返回了null。如果我最初没有声明它,并且在扩展内部进行了更改,则item计数中的rates变量会产生错误,表明没有声明该变量。解决方法是将数组初始化为几个空元素。
List<String> rates = ['', '', '', '', '', '', '', '', '','','','','',''];
这样,itemCount不为null,并且在卡中显示了我在“onExpansionChanged”中复制到数组中的元素。这看起来不正确。另外,如果我要显示的元素少于或多于我初始化到数组中的空元素的数量,那么它会给我一个范围错误。
我知道这可能还不清楚。我确实需要修复此问题,因此我准备回答您可能需要帮助我进行调试的所有其他详细信息。
更新:
我添加了setState进行更改,并在Container之前添加了条件运算符。它有效,但有一些副作用。现在,ListView Builder继续构建无限的ExpansionTiles。
return ExpansionTile(
onExpansionChanged: (value) {
setState(() {
rates = ratesData.ratesWeekend;
});
setState(() {
rates = ratesData.ratesWeekday;
});
},
children:<widget>[
ListView.builder(
shrinkWrap: true,
itemCount: rates.length,
itemBuilder: (context, index) {
return Card(
child: Container(
alignment: Alignment.center,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Text((hour++).toString() + ':00'),
SizedBox(height: 10.0),
Text(
'Rs. ' + rates[index],
style: TextStyle(fontFamily:'silka'),
),
],
),
),
),
);
},
),
]
);
最佳答案
首先,在设置rates
值之前检查itemCount
数组是否为空
itemCount: rates == null ? 0 : rates.length,
这将在数组返回null时将
itemCount
设置为零,因此不会在屏幕上显示任何项目。这应该可以解决您的问题。[更新]
因此,实际上只是坚持使用原始的
onExpansionChanged
函数,然后将setState()
添加到每个条件中。我相信这应该有效。onExpansionChanged: (value) {
if (rearrangedDays[index] == 'Saturday' || rearrangedDays[index] == 'Sunday') {
hour = ratesData.firstHourWeekend;
print(ratesData.ratesWeekend);
setState(() { // add your setState() this way
rates = ratesData.ratesWeekend;
});
print(rates);
} else {
hour = ratesData.firstHourWeekday;
print(ratesData.ratesWeekday);
setState(() { // add your second setState() this way
rates = ratesData.ratesWeekday;
});
print(rates);
}
}
关于listview - 我可以使用最初未声明的itemCount定义ListView Builder吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59979680/