关于 StreamBuilder
的每个示例都以 StatelessWidget
开头,即使在 flutter
示例中也是如此,但是如何在 StatelessWidget< 中取消订阅
小部件?例如,我正在浏览 firestore
example .
class MessageList extends StatelessWidget {
MessageList({this.firestore});
final Firestore firestore;
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: firestore.collection('messages').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (!snapshot.hasData) return const Text('Loading...');
final int messageCount = snapshot.data.documents.length;
return ListView.builder(
itemCount: messageCount,
itemBuilder: (_, int index) {
final DocumentSnapshot document = snapshot.data.documents[index];
return ListTile(
title: Text(document['message'] ?? '<No message retrieved>'),
subtitle: Text('Message ${index + 1} of $messageCount'),
);
},
);
},
);
}
}
现在如何取消监听 firestore.collection('messages').snapshots()
流?
我在我的应用程序中使用实时数据库,我就是这样做的
class MessgaeView extends StatefulWidget {
final String _chatId;
MessgaeView(this._chatId);
@override
_MessgaeViewState createState() => _MessgaeViewState();
}
class _MessgaeViewState extends State<MessgaeView> {
Stream<Event> _messageStream;
@override
void initState() {
_messageStream = _database
.reference()
.child("message/${widget._chatId}")
.limitToLast(1)
.onChildAdded;
super.initState();
}
@override
void dispose() {
_messageStream.drain();
super.dispose();
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: _messageStream,
builder: (context, snapshot) {
if (!snapshot.hasData) return CupertinoActivityIndicator();
final message =
(snapshot.data.snapshot as DataSnapshot).value['message'];
return Text(message);
});
}
}
最佳答案
只需将之前的流实例替换为null
即可。
这将需要类似于以下某处的代码:
setState(() {
_messageStream = null;
});
这样做将停止收听流。但是 StreamBuilder
仍将保留之前的值。
关于firebase - flutter Firebase : How to remove firebase listener when using stream builder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56648240/