flutter - 如何在 SliverList 中使用 FutureBuilder
问题描述
我想隐蔽ListView
,CustomScrollView
所以我需要将我的转换FutureBuilder
为SliverList
.
这是我的代码:
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?
解决方案
a 的子CustomScrollView
节点必须是 slivers,不能使用 a FutureBuilder
。
CustomScrollView
相反,在未来完成时重建:
// 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
],
);
},
);
如果您有多个依赖于Future
s 或Stream
s 的条子,则可以链接构建器:
return FutureBuilder<..>(
...
builder: (context, snapshot1) {
return FutureBuilder<..>(
...
builder: (context, snapshot2) {
return CustomScrollView(...);
}
)
}
)
推荐阅读
- java - 扩展 BaseActivity 的 AsyncTask 类中的非法前向引用
- php - 用于在派生表中搜索匹配项的 SQL 查询
- mysql - 生成带有月份和年份前缀的自动增量唯一 ID
- javascript - 504(网关超时)问题
- javascript - 通过 XMLHttpRequest 登录系统所需的安全要求
- contao - contao主题安装问题。它显示找不到模板
- javascript - 如何从 Firebase 实时数据库获取随机数据到 Highcharts?
- javascript - 编写一个 React 钩子来处理鼠标单击时的多个 div 可见性
- c++ - 顺序文件处理:将数据应用于数据库会导致唯一密钥违规
- xcode - 使图像可点击以展开