【发布时间】:2019-11-01 01:07:12
【问题描述】:
关于StreamBuilder 的每个示例都以StatelessWidget 开头,即使在flutter 示例中也是如此,但是如何取消StatelessWidget 小部件中的订阅?例如,我正在通过firestoreexample。
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);
});
}
}
【问题讨论】:
标签: firebase flutter google-cloud-firestore