如何从firestore获取实时更新,同时保持构建方法纯粹?

问题描述 投票:0回答:1

从这个answer

构建方法的设计应该是纯粹的/没有副作用的。

这意味着构建方法不应触发http调用或修改任何状态。

但这与firestore plugin用法示例(为了简洁而浓缩)相矛盾:

class BookList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: Firestore.instance.collection('books').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
      //  do something with books
      },
    );
  }
}

任何时候当build方法调用时,来自builderStreamBuilder函数也被称为。

我尝试了什么:

...
stream: Firestore.instance.collection('books').snapshots().distinct(),
...

前面提到的答案的建议都不适用于这种情况。

flutter stream google-cloud-firestore
1个回答
2
投票

解决方案实际上是相同的:制作一个StatefulWidget

class Foo extends StatefulWidget {
  @override
  _FooState createState() => _FooState();
}

class _FooState extends State<Foo> {
  Stream<QuerySnapshot> stream;

  @override
  void initState() {
    super.initState();
    stream = Firestore.instance.collection('books').snapshots();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: stream,
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        //  do something with books
      },
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.