Как получать обновления в реальном времени из магазина и при этом сохранять метод сборки чистым? - PullRequest
0 голосов
/ 11 марта 2019

Из этого ответа :

Метод сборки разработан таким образом, что он должен быть чистым / без побочных эффектов.

и

Это означает, что метод сборки не должен запускать вызов http или изменять какое-либо состояние.

Но это противоречит плагину firestore пример использования (сокращенно для краткости):

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 Ответ

2 голосов
/ 11 марта 2019

Решение на самом деле то же самое: сделать 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
      },
    );
  }
}
...