Flutter Firebase: Как удалить firebase слушатель при использовании потокового компоновщика? - PullRequest
0 голосов
/ 18 июня 2019

Каждый пример о StreamBuilder начинается с StatelessWidget даже в примере flutter, но как отменить подписку в виджете StatelessWidget? Например, я просматривал firestore пример .

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);
    });
 }
}

1 Ответ

2 голосов
/ 18 июня 2019

Просто замените предыдущий экземпляр потока на null.

Для этого потребуется код, подобный следующему:

setState(() {
  _messageStream = null;
});

Это остановит прослушивание потока. Но StreamBuilder все равно будет содержать предыдущее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...