简体   繁体   English

Sliver 中的 Listview.builder

[英]Listview.builder inside Sliver

I had a List of dynamic List of ListTile widgets and I wanted to load it lazily, ie ListTile will be built only when the user scrolls to that position.我有一个ListTile小部件的动态列表列表,我想懒惰地加载它,即只有当用户滚动到ListTile时才会构建 ListTile。 And I achieved it using ListView.builder() , and it was working fine for me.我使用ListView.builder()实现了它,它对我来说工作得很好。

But, when I wrapped that ListView.builder() in SliverList using SliverChildListDelegate , the lazy loading property of Listview.builder() is not working any more, now the whole Listview is built during initialization only, instead of being built lazily.但是,当我使用SliverChildListDelegateListView.builder()包装在SliverList中时, Listview.builder()的延迟加载属性不再起作用,现在整个 Listview 仅在初始化期间构建,而不是延迟构建。

I want lazy loading in Listview.builder() even after wrapping it with SliverList .我想在Listview.builder()中延迟加载,即使在用SliverList包装它之后也是如此。 How can I achieve that?我怎样才能做到这一点?

The code before wrapping into SliverList:-包装成 SliverList 之前的代码:-

      ListView.builder(
        itemCount: items.length,
        physics: NeverScrollableScrollPhysics(),
        shrinkWrap: true,
        itemBuilder: (BuildContext context, int index) {
          if (index == 0) return userLocationWidget;
          return ListTile(items[index]);
        },
      ),

The code after warping it into SliverList:-将其变形为 SliverList 后的代码:-

          SliverList(
            delegate: SliverChildListDelegate(
              [
                ListView.builder(
                  itemCount: items.length + 1,
                  physics: NeverScrollableScrollPhysics(),
                  shrinkWrap: true,
                  padding: const EdgeInsets.all(0.0),
                  itemBuilder: (BuildContext context, int index) {
                    if (index == 0) return userLocationWidget;
                    return makeCard(items[index - 1]);
                  },
                ),
              ],
            ),
          ),

You can used following code:您可以使用以下代码:

   SliverList(delegate: SliverChildBuilderDelegate(
          [
           SingleChildScrollView(
              child: Container(
                child:ListView.builder(
                  itemCount: items.length + 1,
                  physics: NeverScrollableScrollPhysics(),
                  shrinkWrap: true,
                  padding: const EdgeInsets.all(0.0),
                  itemBuilder: (BuildContext context, int index) {
                    if (index == 0) return userLocationWidget;
                    return makeCard(items[index - 1]);
                  },
                ),),
            )                   
       ],
    ),
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM