firebase - flutter Firebase : How to remove firebase listener when using stream builder?

标签 firebase flutter google-cloud-firestore

关于 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/

相关文章:

android - Flutter Firestore使用setDate批量写入并合并

dart - 处理来自 TextField 的数据

flutter - D/输入连接适配器(3218) : The input method toggled cursor monitoring on

flutter - 异常:-RenderBox was not laid out despite removing the expanded widgets

ios - gRPC-Core 1.14.0 和 1.14.1 的 pod 更新问题

javascript - Firebase 函数 : sync with Algolia doesn't work

javascript - Firebase 函数环境变量无法读取未定义的属性

firebase - Flutter:构建失败并出现异常

ios - Xcode UI 未使用最新的 Firebase 值进行更新

firebase - 查询在 Firestore 中具有类型引用的文档