如何通过StreamProvider

时间:2020-10-20 15:58:57

标签: flutter dart google-cloud-firestore flutter-provider

我有一个Firestore数据的产品列表的StreamProvider

 StreamProvider<List<Product>>.value(
        value: DatabaseService().products,
      ),

现在我有此产品列表的详细信息页面 如果我单击详细信息页面的列表,则将一个对象带入详细信息页面

DetailsPage(courseData: product)

我需要在此详细信息页面中创建一个upvote按钮,以便它也可以更改Firestore数据

  if (voted) {
        FirebaseFirestore.instance
            .collection('products')
            .doc('${widget.courseData.id}')
            .update({"voteCount": widget.courseData.voteCount - 1});
      } else {
        FirebaseFirestore.instance
            .collection('products')
            .doc('${widget.courseData.id}')
            .update({"voteCount": widget.courseData.voteCount + 1});
      }
      isVoted = !isVoted;
    } catch (e) {
      print(e.message);
    }

如果单击upvote按钮,则CourseData不会更改,因为其值不是来自streamProvider而是来自

DetailsPage(courseData:产品)

我应该如何解决这个问题

1 个答案:

答案 0 :(得分:0)

我建议您使用increment()操作来实现相同目的,而不是传递您不知道的新值。

if (voted) {
    FirebaseFirestore.instance
        .collection('products')
        .doc('${widget.courseData.id}')
        .update({"voteCount": firebase.firestore.FieldValue.increment(-1) });
} else {
    FirebaseFirestore.instance
        .collection('products')
        .doc('${widget.courseData.id}')
        .update({"voteCount": firebase.firestore.FieldValue.increment(1) });
    }
    isVoted = !isVoted;
} catch (e) {
  print(e.message);
}

除了不需要知道当前值(我认为这是您的问题)之外,它在离线和多用户方案中也能更好地工作。