首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在FutureBuilder中使用SliverList

如何在FutureBuilder中使用SliverList
EN

Stack Overflow用户
提问于 2018-09-03 09:27:20
回答 2查看 13.6K关注 0票数 12

我想把ListView转换成CustomScrollView,所以我需要把FutureBuilder转换成SliverList

这里是我的代码:

代码语言:javascript
运行
复制
class LatestNewsList extends StatefulWidget {
  @override
  _LatestNewsListState createState() => _LatestNewsListState();
}

class _LatestNewsListState extends State<LatestNewsList> {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<Data>>(
      future: getQuake(),
      builder: (context, snapshot){
        if(snapshot.hasError) print(snapshot.error);

        return snapshot.hasData
            ? NewsList(latestNews: snapshot.data,)
            : Center(child: CircularProgressIndicator());
      },
    );
  }
}

class NewsList extends StatelessWidget {
  final List<Data> latestNews;

  NewsList({this.latestNews});

  @override
  Widget build(BuildContext context) {



    return new ListView.builder(
        itemCount: latestNews.length,
        itemBuilder: (context, index){
          return new GestureDetector(
            onTap: () {
              Navigator.push(
                  context,
                  MaterialPageRoute(
                      builder: (context) => Browser(url: latestNews[index].post_link,)
                  )
              );
            },
            child: new LatestNewsItem(
              post_title: latestNews[index].post_title,
              post_link: latestNews[index].post_link,
              img_src: latestNews[index].img_src,
            ),
          );
        }
    );
  }
}

如何将相同的FutureBuilder逻辑转换为SliverList?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-03 12:01:30

CustomScrollView的子级必须是条,不能使用FutureBuilder

相反,当未来完成时,重新构建CustomScrollView

代码语言:javascript
运行
复制
// build fixed items outside of the FutureBuilder for efficiency
final someOtherSliver = SliverToBoxAdapter(...);

return FutureBuilder<List<Data>>(
  future: getQuake(), // this is a code smell. Make sure that the future is NOT recreated when build is called. Create the future in initState instead.
  builder: (context, snapshot){
    Widget newsListSliver;
    if(snapshot.hasData) {
      newsListSliver = SliverList(delegate: SliverChildBuilderDelegate(...))
    } else {
      newsListSliver = SliverToBoxAdapter(child: CircularProgressIndicator(),);
    }

    return CustomScrollView(
      slivers: <Widget>[
        someOtherSliver,
        newsListSliver
      ],
    );
  },
);

如果您有多个依赖于Futures或Streams的条条,则可以链接构建器:

代码语言:javascript
运行
复制
return FutureBuilder<..>(
  ...
  builder: (context, snapshot1) {
    return FutureBuilder<..>(
      ...
      builder: (context, snapshot2) {
        return CustomScrollView(...);
      }
    )
  }
)
票数 32
EN

Stack Overflow用户

发布于 2019-05-16 07:39:48

使用SliverFillRemaining

代码语言:javascript
运行
复制
Widget build(BuildContext context) {
return new Scaffold(
  body: CustomScrollView(
    slivers: <Widget>[
      SliverFillRemaining(
        child: FutureBuilder(
          future: getData(),
          builder: (context, snapshot) {
            if (snapshot.data == null)
              return new Container(
                child: Center(child: new CircularProgressIndicator()),
              );
            else
              return Text(snapshot.data.name);
          },
        ),
      )
    ],
  )
);

或者使用SliverList

代码语言:javascript
运行
复制
Widget build(BuildContext context) {
return new Scaffold(
  body: CustomScrollView(
    slivers: <Widget>[
         SliverList(
        delegate: SliverChildListDelegate([Container(
            child: FutureBuilder(
             future : getData(),
             builder: (C,snap){
                //do whatever you want
              }
          )
          )]),
        )
      ]
    )
  )
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52146850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档