Listview 我是否可以定义itemCount为';t最初宣布
标题一定很混乱。我真的不知道如何准确地描述它。但是,我将尽最大努力使用代码示例: 因此,我试图在扩展磁贴下显示一个卡列表。这些卡上显示的项目是动态的,不同的扩展磁贴会有所不同。为此,我使用了属性“OneExpansionChanged”。在这个属性上,我编写了以下代码:Listview 我是否可以定义itemCount为';t最初宣布,listview,flutter,dart,Listview,Flutter,Dart,标题一定很混乱。我真的不知道如何准确地描述它。但是,我将尽最大努力使用代码示例: 因此,我试图在扩展磁贴下显示一个卡列表。这些卡上显示的项目是动态的,不同的扩展磁贴会有所不同。为此,我使用了属性“OneExpansionChanged”。在这个属性上,我编写了以下代码: onExpansionChanged: (value) { if (rearrangedDays[index] == 'Saturday' || rearrangedDays[index] == 'Sunday') {
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);
}
}
在扩展文件的子属性中的ListView生成器下,我有:
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'),
),
],
),
),
),
);
},
),
ListView.builder(
收缩膜:对,
itemCount:rates.length,
itemBuilder:(上下文,索引){
回程卡(
子:容器(
对齐:对齐.center,
孩子:填充(
填充:常数边集全部(8.0),
子:列(
儿童:[
Text((hour++).toString()+':00'),
尺寸箱(高度:10.0),
正文(
“卢比”+汇率[指数],
样式:TextStyle(fontFamily:'silka'),
),
],
),
),
),
);
},
),
现在的问题是,如果我只声明一个数组,item count将显示一个错误,表示它返回null。如果我最初没有声明它,并且在扩展中做了更改,item count中的rates变量会给出一个错误,表明没有声明这样的变量。作为一种解决方法,我一直在将数组初始化为几个空元素
List<String> rates = ['', '', '', '', '', '', '', '', '','','','','',''];
List rates=['','','','','','','','','','','','','','','';
这样itemCount就不会为null,我在“OneExpansionChanged”中复制到数组中的元素会显示在卡片中。这看起来不太对劲。另外,如果我显示的元素数少于或多于我初始化到数组中的空元素数,它会给我一个范围错误
我知道这可能不清楚。我真的需要这个修复,所以我准备回答任何额外的细节,你可能需要帮助我调试这个
更新:
我添加了setState来进行更改,并在容器之前添加了一个条件运算符。它起作用了,但有一些副作用。现在ListView构建器继续构建无限扩展文件
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'),
),
],
),
),
),
);
},
),
]
);
返回扩展文件(
OneExpansionChanged:(值){
设置状态(){
rates=ratesData.ratesWeekend;
});
设置状态(){
费率=费率数据。费率为每一天;
});
},
儿童:[
ListView.builder(
收缩膜:对,
itemCount:rates.length,
itemBuilder:(上下文,索引){
回程卡(
子:容器(
对齐:对齐.center,
孩子:填充(
填充:常数边集全部(8.0),
子:列(
儿童:[
Text((hour++).toString()+':00'),
尺寸箱(高度:10.0),
正文(
“卢比”+汇率[指数],
样式:TextStyle(fontFamily:'silka'),
),
],
),
),
),
);
},
),
]
);
首先,在设置itemCount
值之前,检查rates
数组是否为空
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.builder之前不检查费率是否为空,或者如果为空,则返回Container()
否则ListView.builder
则始终正确显示容器?或者,一旦它获得我在OneExpansionChanged中设置的速率值,它会动态更新吗?假设您有一个名为rates
的列表,现在它是null
,因此视图将清空Container()
,当您得到rates
时,数据集的状态类似于setState(){//updaterates}
因此您的视图将被重新缩放并显示ListView.builder
。如果您想在expansionfile
中显示列表,请在expansionfile
中使用相同的大小写检查相同的空或空列表正常,但会产生更多问题。因此,现在每当我点击一个扩展磁贴来查看卡片时,它都会在下面不断构建新的扩展磁贴。所以现在我有4-5个相同扩展块的副本。我认为每次运行setState时都会调用Listview生成器。在仍然使用扩展磁贴的情况下,是否有任何方法可以停止此操作,或者我是否应该使用其他方法?您在ListView中的ExpansionChanged的ExpansionFile中调用setState(),如果有任何方法可以停止ListView扩展,那就太好了。或者我可以手动添加扩展文件,因为我只需要7个扩展文件。或者我可以创建一个函数并调用它7次。或者,如果这占用了太多的资源,我将使用其他更简单的实现。@KartabyaAryal您可以发布调用setState()的地方的代码吗?