Listview 我是否可以定义itemCount为';t最初宣布

Listview 我是否可以定义itemCount为';t最初宣布,listview,flutter,dart,Listview,Flutter,Dart,标题一定很混乱。我真的不知道如何准确地描述它。但是,我将尽最大努力使用代码示例: 因此,我试图在扩展磁贴下显示一个卡列表。这些卡上显示的项目是动态的,不同的扩展磁贴会有所不同。为此,我使用了属性“OneExpansionChanged”。在这个属性上,我编写了以下代码: onExpansionChanged: (value) { if (rearrangedDays[index] == 'Saturday' || rearrangedDays[index] == 'Sunday') {

标题一定很混乱。我真的不知道如何准确地描述它。但是,我将尽最大努力使用代码示例:

因此,我试图在扩展磁贴下显示一个卡列表。这些卡上显示的项目是动态的,不同的扩展磁贴会有所不同。为此,我使用了属性“OneExpansionChanged”。在这个属性上,我编写了以下代码:

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()的地方的代码吗?