从这个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
方法调用时,来自builder
的StreamBuilder
函数也被称为。
我尝试了什么:
...
stream: Firestore.instance.collection('books').snapshots().distinct(),
...
前面提到的答案的建议都不适用于这种情况。
解决方案实际上是相同的:制作一个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
},
);
}
}