IndexedWidgetBuilder,它如何知道索引?

时间:2018-05-21 18:16:50

标签: dart flutter

这主要是一个概念性问题,因为我是Dart的新手,我想我并不理解这里语言的语义。

在IndexedWidgetBuilder中,

Widget IndexedWidgetBuilder (
BuildContext context,
int index
)

究竟是谁给索引一个值?

当这个"事情"用于,例如:

itemBuilder: (context, i) {
    blablabla
},

"上下文"和"我"永远不会被初始化,他们神奇地拥有一个价值。谁在定义这个价值在哪里?

1 个答案:

答案 0 :(得分:1)

IndexedWidgetBuilder是一个typedef,它定义了一个带BuildContextint的函数,并返回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的构建方法。你可以继续往后走,看看是谁叫的。