listview - 我可以使用最初未声明的itemCount定义ListView Builder吗

标签 listview flutter dart

标题一定很困惑。我实际上不知道如何准确地描述它。但是,我将尽最大努力使用代码示例:

因此,我试图在扩展图块下显示卡列表。这些卡上显示的项目是动态的,并且在扩展磁贴之间有所不同。为此,我使用了属性“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/

相关文章:

android - 在 flutter 中,如何将 tflite 添加为 pubspec.yaml 文件中的依赖项?

flutter - 什么是 future ,我将如何使用它?

android - 如何在预加载的数据库中填充 ListView

java - 尝试从 Android 数据库中删除但获得空对象引用

asp.net - LINQ 和使用 ListView 分页

java - 如何在 ListView 中为每个列表项添加三点菜单?

flutter - 如何在 map 中添加特定变量的值

dart - 监听 StreamingController 并更新列表

dart - paper 下拉菜单选择的属性问题

flutter - json.decode不会转换Map <String,Map <String,dynamic >>