我想把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?
发布于 2018-09-03 12:01:30
CustomScrollView
的子级必须是条,不能使用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(...);
}
)
}
)
发布于 2019-05-16 07:39:48
使用SliverFillRemaining
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
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
}
)
)]),
)
]
)
)
}
https://stackoverflow.com/questions/52146850
复制相似问题