如何从Firestore获取实时更新并保持构建方法纯净?

时间:2019-03-11 20:15:46

标签: flutter stream google-cloud-firestore

来自此answer

  

构建方法的设计方式应使其纯净/无副作用。

  

这意味着build方法不应触发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方法时,也会调用builder中的StreamBuilder函数。

我尝试过的事情:

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

在这种情况下,前面提到的答案都无法提供建议。

1 个答案:

答案 0 :(得分: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
      },
    );
  }
}