来自此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(),
...
在这种情况下,前面提到的答案都无法提供建议。
答案 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
},
);
}
}