数据更改后如何更新未来的构建器数据

时间:2020-03-16 10:32:29

标签: flutter future

我正在通过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;
  }
}

0 个答案:

没有答案