我正在通过FutureBuilder渲染api响应数据。我有一个API,可为我提供标题,内容以及缩略图链接的另一个终点。在我的代码中,我的listview需要缩略图和标题。所以我在做的是,第一次调用api,并将标题和内容以及空链接插入到我的User构造函数中,当第一个api调用填充了UserData时,它在没有缩略图的情况下将标题显示在列表中。然后我在init函数中调用“ whencomplete”语句来调用第二个api以获得缩略图链接。第二个api调用获取获取图像,然后更新User类的用户对象,该对象是全局对象。但是Future Builder不会通知数据更改,因此我使用SetState通知用户数据已更改的状态。但是在将来的投标者列表中会填充重复项。为什么它使成双重?更改数据后如何使用Futurebuidler处理此问题?
return Scaffold(
body: Container(
child: FutureBuilder<List<User>>(
future: userData,
initialData: null,
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
break;
case ConnectionState.done:
if (!snapshot.hasData) {
return Center(
child: ListTile(
title: Text("Loading ...",
style:
TextStyle(fontSize: 20, color: Colors.red))),
);
} else {
return ListView.separated(
itemCount: snapshot.data.length,
separatorBuilder: (BuildContext context, int index) =>
Divider(),
itemBuilder: (BuildContext context, index) {
return Card(
child: ListTile(
title: Text(snapshot.data[index].title.toString()),
onTap: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) =>
DetailPage(snapshot.data[index])));
},
leading:
snapshot.data[index].links.toString().isEmpty
? CircularProgressIndicator()
: Image.network(snapshot.data[index].links),
trailing: Icon(Icons.keyboard_arrow_right),
));
});
}
break;
default:
return Container();
}
}),
),
);
这是初始化函数
@override
void initState() {
userData = getUsers().whenComplete(() {
getImages();
});
super.initState();
}
这是我的第一个APi通话
Future<List<User>> getUsers() async {
var data =
await http.get("https://primest.tv/wp-json/wp/v2/posts?per_page=1");
var jsonDataText = json.decode(data.body);
linksArray.clear();
int o=0;
for (var u in jsonDataText) {
String title = u["title"]['rendered'];
String content = u["content"]['rendered'];
String maper = u["_links"]['wp:featuredmedia'][0]["href"];
linksArray.add(maper);
User userr = User(title, content, '');
user.add(userr);
o++;
}
return user;
}
这是我的第二个拇指钉Api cal
Future<List<User>> getImages() async {
int i = 0;
for (var userDataItem in linksArray) {
var data2 = await http.get(userDataItem);
var jsonData2 = json.decode(data2.body);
String imageLink = jsonData2["link"];
user.insert(i, User(user[i].title, user[i].content, imageLink));
i++;
}
//使用setState更新将来的构建器中的数据 setState((){ 用户=用户; }); 返回用户; }
这是用户类
class User {
String title, content, links;
User(this.title, this.content, this.links);
User.from(String link) {
this.links = link;
}
}