1
votes

Comment commander les documents de Firebase?

Je souhaite créer une application de chat, j'ai également utilisé Firebase mais je ne peux pas commander de documents où, lorsque vous envoyez un message, il ne soit pas dans l'ordre de la liste, il se trouve dans un endroit aléatoire.

Je pense que cela est lié au type de documents dans la console Firebase, le cas échéant. Je veux de l'aide sur la façon de trier cela lorsqu'un nouveau message arrive, il sera en bas de la liste et vice versa.

I J'ai essayé listview et listview.builder et j'ai utilisé la propriété reverse mais cela n'a pas fonctionné avec moi.

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import '../constants.dart';

final _firestore = Firestore.instance;
FirebaseUser loggedInUser;

class ChatScreen extends StatefulWidget {
  static String routeName = 'chat_screen';

  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final messageTextController = TextEditingController();
  final _auth = FirebaseAuth.instance;
  String message;

  void getCurrentUser() async {
    try {
      final user = await _auth.currentUser();

      if (user != null) {
        loggedInUser = user;
      }
    } catch (e) {
      print(e);
    }
  }

  void getMessages() async {
    final messages = await _firestore.collection('message').getDocuments();
    for (var message in messages.documents) {
      print(message.data);
    }
  }

  void messagesStream() async {
    await for (var snapshot in _firestore.collection('messages').snapshots()) {
      for (var message in snapshot.documents) {
        print(message.data);
      }
    }
  }

  @override
  void initState() {
    super.initState();

    getCurrentUser();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: null,
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                _auth.signOut();
                Navigator.pop(context);
              }),
        ],
        title: Text('⚡️Chat'),
        backgroundColor: Colors.lightBlueAccent,
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            MessagesStream(),
            Container(
              decoration: kMessageContainerDecoration,
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    child: TextField(
                      controller: messageTextController,
                      onChanged: (value) {
                        message = value;
                      },
                      decoration: kMessageTextFieldDecoration,
                    ),
                  ),
                  FlatButton(
                    onPressed: () {
                      messageTextController.clear();
                      _firestore
                          .collection('messages')
                          .add({'text': message, 'sender': loggedInUser.email});
                    },
                    child: Text(
                      'Send',
                      style: kSendButtonTextStyle,
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class MessagesStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: _firestore.collection('messages').snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(
              backgroundColor: Colors.lightBlueAccent,
            ),
          );
        }
        final messages = snapshot.data.documents;

        List<MessageBubble> messageBubbles = [];
        for (var message in messages) {
          final messageText = message.data['text'];
          final messageSender = message.data['sender'];
          final currentUser = loggedInUser.email;

          final messageBubble = MessageBubble(
              sender: messageSender,
              text: messageText,
              isMe: currentUser == messageSender);

          messageBubbles.add(messageBubble);
        }

        return Flexible(
          child: ListView.builder(
            itemCount: messages.length,
            itemBuilder: (context , index){
            return MessageBubble(
              isMe: loggedInUser.email == messages[index].data['sender'],
              text: messages[index].data['text'],
              sender: messages[index].data['sender'],
            );
          },),
        );
      },
    );
  }
}

class MessageBubble extends StatelessWidget {
  MessageBubble({this.sender, this.text, this.isMe});

  final bool isMe;
  final String sender;
  final String text;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(10.0),
      child: Column(
        crossAxisAlignment:
            isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
        children: <Widget>[
          Text(sender, style: TextStyle(fontSize: 12, color: Colors.black54)),
          Material(
              elevation: 5.0,
              borderRadius: isMe
                  ? BorderRadius.only(
                      topLeft: Radius.circular(30),
                      bottomLeft: Radius.circular(30),
                      topRight: Radius.circular(30),
                    )
                  : BorderRadius.only(
                      bottomLeft: Radius.circular(30),
                      topRight: Radius.circular(30),
                      bottomRight: Radius.circular(30)),
              color: isMe ? Colors.lightBlueAccent : Colors.white,
              child: Padding(
                padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20),
                child: Text(
                  text,
                  style: TextStyle(
                      color: isMe ? Colors.white : Colors.black54,
                      fontSize: 15),
                ),
              )),
        ],
      ),
    );
  }
}




0 commentaires

3 Réponses :


2
votes

Ajouter une commande avant le

void getMessages() async {
    final messages = await _firestore.collection('message').orderBy("created_at", descending: true).getDocuments();
    for (var message in messages.documents) {
      print(message.data);
    }
  }

  void messagesStream() async {
    await for (var snapshot in _firestore.collection('messages').orderBy("created_at", descending: true).snapshots()) {
      for (var message in snapshot.documents) {
        print(message.data);
      }
    }
  }


0 commentaires

2
votes

Il n'y a pas de classement implicite des documents dans Cloud Firestore.

Si vous souhaitez afficher les résultats dans un ordre spécifique, vous devrez vous assurer que chaque document comprend les informations nécessaires pour déterminer son ordre. En règle générale, cela signifie que vous incluez un champ avec l'horodatage de la création du document.

Avec un tel champ en place, vous pouvez ensuite utiliser orderBy () pour récupérer les documents dans un ordre spécifique:

await _firestore.collection('message').orderBy('timestamp').getDocuments()


0 commentaires

1
votes

Vérifiez ceci, qui fonctionne parfaitement pour une application de chat en groupe (si vous souhaitez obtenir des données de Firebase).

 class MessageStream extends StatelessWidget {


 @override

 Widget build(BuildContext context) {
 return StreamBuilder<QuerySnapshot>(

  stream: _firestore.collection("messages").orderBy("time").snapshots(),

  builder: (context, snapshot) {

    if (!snapshot.hasData) {

      return Center(
        child: CircularProgressIndicator(

          backgroundColor: Colors.amber,

        ),
      );
    }
    final messages = snapshot.data.documents.reversed;


    List<MessageBubble> messageBubbles = [];



    for (var message in messages) {

      final messageText = message.data["text"];

      final messageSender = message.data["sender"];

      final messageTime = message.data["time"];

      final currentUser = loggedInUser.email;


      final messageBubble = MessageBubble(

        sender: messageSender,

        text: messageText,

        isMe: currentUser == messageSender,

        time: messageTime,
      );
      messageBubbles.add(messageBubble);
    }
    return Expanded(

      child: ListView(

        reverse: true,
        padding: EdgeInsets.all(10),

        children: messageBubbles,
      ),
    );
  },
 );
 }
}


0 commentaires