Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
颤振IndexedWidgetBuilder与ListView.builder是否具有动态项数?_Listview_Flutter_Builder - Fatal编程技术网

颤振IndexedWidgetBuilder与ListView.builder是否具有动态项数?

颤振IndexedWidgetBuilder与ListView.builder是否具有动态项数?,listview,flutter,builder,Listview,Flutter,Builder,假设我从API中检索到一些数据,并将它们放在ListView.builder中。我想做延迟加载,因为在任何时候,只有三个项目将显示在屏幕上。假设数据看起来像这样,我们不能保证得到所有的标题,我们不知道内容中有多少项 header: HeaderOne contents: [ItemOne, ItemTwo, ItemThree] header: HeaderTwo contents: [ItemOne] header: HeaderThree // don't display this be

假设我从API中检索到一些数据,并将它们放在ListView.builder中。我想做延迟加载,因为在任何时候,只有三个项目将显示在屏幕上。假设数据看起来像这样,我们不能保证得到所有的标题,我们不知道
内容中有多少项

header: HeaderOne
contents: [ItemOne, ItemTwo, ItemThree]

header: HeaderTwo
contents: [ItemOne]

header: HeaderThree // don't display this because contents is empty
contents: [] // don't display this because contents is empty

header: HeaderFour
contents: [ItemOne, ItemTwo]
如果滚动浏览,UI中的ListView将如下所示:

HeaderOne
ItemOne
ItemTwo
ItemThree
HeaderTwo
ItemOne
HeaderFour
ItemOne
ItemTwo
ListView.builder()中我的
itemBuilder
属性变得可怕。下面是一些伪代码:

itemBuilder: (BuildContext context, index i) {
  if (i == 0 && data.hasHeaderOne) { return _buildHeaderOne(); }
  else if (i == 0 && !data.hasHeaderOne) { return _buildHeaderTwo(); }
  else if (i == 1 && data.hasHeaderOne { return _buildContents(headerOneContents[0]); }
  else if (i == (1 + data.headerOneContents.length) && data.hasHeaderOne && data.hasHeaderTwo) { return _buildContents(headerTwoContents[i+someNumberIHaveToCalculate]); }
  ...
}
绝对有更好的方法!我考虑过嵌套ListView.builder(),但不确定这会如何影响性能或滚动


目标是在我不知道每个项目的索引时使用生成器。我可以计算项目的总数(在本例中为9),但如果不编写复杂的if-else代码,我看不出这有什么帮助。

我最终这样做的方式是创建一个小部件生成器列表,而不是小部件。 例如,类似于:

typedef WidgetBuilder Widget Function();

...

final itemBuilder = <WidgetBuilder>[
if (data.hasHeaderOne) () => _buildHeaderOne(),
for (item in data.headerOneContents) () => _buildContents(item),
...
];

return ListView.builder(
  itemCount: itemBuilder.length, 
  itemBuilder: (_, item) => itemBuilder[item](),
);
typedef WidgetBuilder小部件函数();
...
最终项目生成器=[
如果(data.hashHeaderone)(=>_buildHeaderOne(),
对于(data.headerContents中的项)(=>_buildContents(项),
...
];
返回ListView.builder(
itemCount:itemBuilder.length,
itemBuilder:(_,item)=>itemBuilder[item](),
);

我最终的做法是创建一个小部件构建器列表,而不是小部件。 例如,类似于:

typedef WidgetBuilder Widget Function();

...

final itemBuilder = <WidgetBuilder>[
if (data.hasHeaderOne) () => _buildHeaderOne(),
for (item in data.headerOneContents) () => _buildContents(item),
...
];

return ListView.builder(
  itemCount: itemBuilder.length, 
  itemBuilder: (_, item) => itemBuilder[item](),
);
typedef WidgetBuilder小部件函数();
...
最终项目生成器=[
如果(data.hashHeaderone)(=>_buildHeaderOne(),
对于(data.headerContents中的项)(=>_buildContents(项),
...
];
返回ListView.builder(
itemCount:itemBuilder.length,
itemBuilder:(_,item)=>itemBuilder[item](),
);