这主要是一个概念性问题,因为我是Dart的新手,我想我并不理解这里语言的语义。
在IndexedWidgetBuilder中,
Widget IndexedWidgetBuilder (
BuildContext context,
int index
)
究竟是谁给索引一个值?
当这个"事情"用于,例如:
itemBuilder: (context, i) {
blablabla
},
"上下文"和"我"永远不会被初始化,他们神奇地拥有一个价值。谁在定义这个价值在哪里?
答案 0 :(得分:1)
IndexedWidgetBuilder
是一个typedef
,它定义了一个带BuildContext
和int
的函数,并返回Widget
。
/// Signature for a function that creates a widget for a given index, e.g., in a
/// list.
///
/// Used by [ListView.builder] and other APIs that use lazily-generated widgets.
typedef Widget IndexedWidgetBuilder(BuildContext context, int index);
因此,在定义itemBuilder
时,您正在为Widget提供一个可以调用的函数,当它想要构建一个项目时。当Widget构建自己时,它会多次调用此函数来构建它的每个子节点。简单地说,它可以用i = 0,然后是1,然后是2等来调用这个函数。
如果你的Widget只有3个孩子,那么将它作为List传递会更容易,但是如果你的Widget有一千个孩子,这将是效率低下的 - 这就是构建器的用武之地.Widget会尝试只调用它实际需要的子窗口小部件的itemBuilder函数,而不是屏幕顶部或底部的任何部分。
所以,为了回答你的问题,Widget会在调用它时(通常多次)传递上下文和我的itemBuilder函数来构建其部分或全部子节点。 i
表示i
个孩子,因此您的构建器函数知道要求构建哪个孩子。
修改强>
IndexedWidgetBuilder
的dartdoc表示它被ListView.builder
使用。
ListView.builder
的dartdoc说
提供非null itemCount提高了[ListView]的能力 估计最大滚动范围。 itemBuilder回调会 仅在索引大于或等于零且更小的情况下调用 比itemCount 。 itemBuilder实际上应该创建小部件 调用时的实例。
ListView.builder
命名构造函数构造SliverChildBuilderDelegate
,将itemBuilder作为构建器传递。
它在SliverChildBuilderDelegate
的构建方法中使用,此处:
@override
Widget build(BuildContext context, int index) {
assert(builder != null);
if (index < 0 || (childCount != null && index >= childCount))
return null;
Widget child = builder(context, index); // <- your callback is called
if (child == null)
return null;
if (addRepaintBoundaries)
child = new RepaintBoundary.wrap(child, index);
if (addAutomaticKeepAlives)
child = new AutomaticKeepAlive(child: child);
return child;
}
因此,index
来自SliverChildBuilderDelegate
的构建方法。你可以继续往后走,看看是谁叫的。