как обновить флаттер UI в соответствии с firebase - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть этот список постов, где пользователь может лайкать, комментировать и делиться.

Widget build(BuildContext context) {
    return Container(
      child: FutureBuilder(
          future: _data,
          builder: (_, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            } else {
              return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (_, index) {
                    return Card(
                      elevation: 4,
                      child: Padding(
                        padding: EdgeInsets.only(left: 10.0, top: 10),
                        child: InkWell(
                          onTap: () => navigateToDetail(
                            snapshot.data[index],
                            snapshot.data[index].data["Userid"],
                          ),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            mainAxisSize: MainAxisSize.min,
                            children: <Widget>[
                              new Row(
                                children: <Widget>[
                                  Container(
                                    width: 45,
                                    height: 45,
                                    decoration: BoxDecoration(
                                      image: DecorationImage(
                                        image: NetworkImage(snapshot
                                            .data[index].data["User Pic"]),
                                        fit: BoxFit.cover,
                                      ),
                                      borderRadius: BorderRadius.all(
                                          Radius.circular(50.5)),
                                    ),
                                  ),
                                  Padding(
                                    padding: EdgeInsets.only(left: 15),
                                    child: Text(
                                      snapshot.data[index].data["Name"],
                                      style: TextStyle(
                                          fontWeight: FontWeight.w600,
                                          fontSize: 18),
                                    ),
                                  ),
                                ],
                              ),
                              Padding(
                                padding: EdgeInsets.only(left: 60, bottom: 10),
                                child: Text(
                                  DateFormat.yMMMd().add_jm().format(
                                      DateTime.parse(snapshot
                                          .data[index].data["Creation Time"]
                                          .toDate()
                                          .toString())),
                                  style: TextStyle(
                                      color: Colors.black38, fontSize: 12),
                                ),
                              ),
                              Flexible(
                                child: Padding(
                                  padding: EdgeInsets.only(left: 75, right: 15),
                                  child: Text(
                                    snapshot.data[index].data["Description"],
                                    style: TextStyle(fontSize: 16),
                                  ),
                                ),
                              ),
                              Padding(
                                padding: EdgeInsets.only(
                                    left: 75, top: 15, bottom: 8),
                                child: Text(
                                  snapshot.data.length.toString() +
                                      "Files uploaded",
                                  style: TextStyle(
                                      color: Colors.blueAccent,
                                      fontSize: 14,
                                      fontStyle: FontStyle.italic),
                                ),
                              ),
                              Divider(),
                              new Row(
                                children: <Widget>[
                                  Expanded(
                                    child: Row(
                                      children: <Widget>[
                                        IconButton(
                                            onPressed: () {
                                              Firestore.instance.runTransaction((transaction) async{
                                                DocumentSnapshot freshData = await transaction.get(snapshot.data[index].reference);
                                                await transaction.update(freshData.reference, {
                                                  'Likes':freshData['Likes']+1,
                                                });
                                              });

                                            },
                                            icon: Icon(Icons.favorite_border,
                                                color: Colors.redAccent,
                                                size: 23.0),
                                        ),
                                        Text(snapshot.data[index].data["Likes"].toString())
                                      ],
                                    ),
                                  ),
                                  Expanded(
                                    child: IconButton(
                                      onPressed: () {},
                                      icon: Icon(
                                        Icons.chat_bubble_outline,
                                        color: Colors.blue,
                                        size: 23.0,
                                      ),
                                    ),
                                  ),
                                  Expanded(
                                    child: IconButton(
                                      onPressed: () {},
                                      icon: Icon(
                                        Icons.near_me,
                                        color: Colors.blue,
                                        size: 23.0,
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            ],
                          ),
                        ),
                      ),
                    );
                  });
            }
          }),
    );
  }

и имеет Firestore, как это: enter image description here

хранение лайки в коллекции постов.

Мне нужно:

, когда пользователь нажимает на иконку лайка, он обновляет firestore, а также подсчитывает в пользовательском интерфейсе флаттера.

что я сделал до сих пор:

он будет только обновлять firestore, и для обновления в пользовательском интерфейсе флаттера мне нужно обновить sh экран.

Спасибо.

Обновление:

@override
  void initState() {
    super.initState();
    _data = UserManagement().getPosts();
  }

от UserManagement:

getPosts() async {
    QuerySnapshot Qn = await Firestore.instance.collection("Posts").orderBy(
        "Creation Time", descending: true).getDocuments();
    return Qn.documents;
  }

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Просто замените ваш FutureBuilder на StreamBuilder, чтобы получать поток, когда в вашей коллекции будет обновление

Widget build(BuildContext context) {
    return Container(
      child: StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection("Posts").orderBy(
           "Creation Time", descending: true).snapshots(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return Center(
                child: CircularProgressIndicator(),
              );
            } else {
              return ListView.builder(
                  itemCount: snapshot.data.length,
                  itemBuilder: (_, index) {
                    return Card(
                      elevation: 4,
                      child: Padding(
                        padding: EdgeInsets.only(left: 10.0, top: 10),
                        child: InkWell(
                          onTap: () => navigateToDetail(
                            snapshot.data[index],
                            snapshot.data[index].data["Userid"],
                          ),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            mainAxisSize: MainAxisSize.min,
                            children: <Widget>[
                              new Row(
                                children: <Widget>[
                                  Container(
                                    width: 45,
                                    height: 45,
                                    decoration: BoxDecoration(
                                      image: DecorationImage(
                                        image: NetworkImage(snapshot
                                            .data[index].data["User Pic"]),
                                        fit: BoxFit.cover,
                                      ),
                                      borderRadius: BorderRadius.all(
                                          Radius.circular(50.5)),
                                    ),
                                  ),
                                  Padding(
                                    padding: EdgeInsets.only(left: 15),
                                    child: Text(
                                      snapshot.data[index].data["Name"],
                                      style: TextStyle(
                                          fontWeight: FontWeight.w600,
                                          fontSize: 18),
                                    ),
                                  ),
                                ],
                              ),
                              Padding(
                                padding: EdgeInsets.only(left: 60, bottom: 10),
                                child: Text(
                                  DateFormat.yMMMd().add_jm().format(
                                      DateTime.parse(snapshot
                                          .data[index].data["Creation Time"]
                                          .toDate()
                                          .toString())),
                                  style: TextStyle(
                                      color: Colors.black38, fontSize: 12),
                                ),
                              ),
                              Flexible(
                                child: Padding(
                                  padding: EdgeInsets.only(left: 75, right: 15),
                                  child: Text(
                                    snapshot.data[index].data["Description"],
                                    style: TextStyle(fontSize: 16),
                                  ),
                                ),
                              ),
                              Padding(
                                padding: EdgeInsets.only(
                                    left: 75, top: 15, bottom: 8),
                                child: Text(
                                  snapshot.data.length.toString() +
                                      "Files uploaded",
                                  style: TextStyle(
                                      color: Colors.blueAccent,
                                      fontSize: 14,
                                      fontStyle: FontStyle.italic),
                                ),
                              ),
                              Divider(),
                              new Row(
                                children: <Widget>[
                                  Expanded(
                                    child: Row(
                                      children: <Widget>[
                                        IconButton(
                                            onPressed: () {
                                              Firestore.instance.runTransaction((transaction) async{
                                                DocumentSnapshot freshData = await transaction.get(snapshot.data[index].reference);
                                                await transaction.update(freshData.reference, {
                                                  'Likes':freshData['Likes']+1,
                                                });
                                              });

                                            },
                                            icon: Icon(Icons.favorite_border,
                                                color: Colors.redAccent,
                                                size: 23.0),
                                        ),
                                        Text(snapshot.data[index].data["Likes"].toString())
                                      ],
                                    ),
                                  ),
                                  Expanded(
                                    child: IconButton(
                                      onPressed: () {},
                                      icon: Icon(
                                        Icons.chat_bubble_outline,
                                        color: Colors.blue,
                                        size: 23.0,
                                      ),
                                    ),
                                  ),
                                  Expanded(
                                    child: IconButton(
                                      onPressed: () {},
                                      icon: Icon(
                                        Icons.near_me,
                                        color: Colors.blue,
                                        size: 23.0,
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            ],
                          ),
                        ),
                      ),
                    );
                  });
            }
          }),
    );
  }
1 голос
/ 07 апреля 2020

Полагаю, вам следует использовать StreamBuilder вместо FutureBuilder. StreamBuilders похожи на FutureBuilders, которые постоянно обновляются в зависимости от их потока.

Вы также должны подписаться на поток коллекции Firestore, а не получать его только один раз.

Вместо getPosts может быть используйте это:

Stream<QuerySnapshot> getPostsStream() {
  return Firestore.instance.collection("Posts").orderBy(
      "Creation Time", descending: true).snapshots();
}

И измените ваш FutureBuilder на StreamBuilder:

StreamBuilder<QuerySnapshot>(
  stream: getPostsStream(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) {
        return Center(
          child: CircularProgressIndicator(),
        );
    } else {
      final List<DocumentSnapshot> documents = snapshot.data.documents;
      // use as documents[index].
      // ....
    }
  },
),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...