Flutter SqlBrite not rebuilding streambuilder list

131

If you are facing this problem use the moor library sqlbrite won't work but this is a link to help.... https://resocoder.com/2019/06/26/moor-room-for-flutter-tables-queries-fluent-sqlite-database/

Matt Rešetár explains in detail so it will be easy to implement...

Share:
131
Admin
Author by

Admin

Updated on December 01, 2022

Comments

  • Admin
    Admin 12 months

    I am trying to build a chat storage system with firebase, sqlite and sqlBrite. The aim of this is to stream the newmessages without having to rebuild the page. The stream from sqlBrite is only rebuilding on setstate eg.when the keyboard is drawn back.

    How can i get the stream to automatically update on save.

    The db document

    ///INSERT INTO DB
        Future<int> insertNewMessage(String id, int result, BriteDatabase briteDb,
              Map<String, dynamic> row) async {
            messageList.add(id);
        
            await ifexists(id, messageId, briteDb)
                ? print('message already In')
                : result = await briteDb.insert(messageTable, row);
            return result;
          }
    
    ////STREAM MESSAGES
        Stream<List<Map<String, dynamic>>> getMessageMapListbyId(
              {String sendId, String receiveId, database}) async* {
            try {
              BriteDatabase briteDb = await database;
            yield* briteDb.createQuery(messageTable,
                      distinct: false,
                      where:
                          ' $senderId=? $receiverId = ? ',
                      whereArgs: [
                          sendId,
                          receiverId,
                        ])});
    

    provider document

    ///ADD MESSAGES
        addMessageTodb(message) async {
            await ldbH
                .msg_insertMessage(
                    message.id, modelFuncs.messageMaping(message, msgFuncs))
                .then((value) async {
             
              await getMessageYieldBase(message.senderId, message.receiverId);
            });}
    
        ///STREAM NEW DATA
    getMessageYieldBase(senderId, receiverId) async* {
            yield* ldbH.msg_getAllMessagesbyId(senderId, receiverId);}
    

    The ui side

    StreamBuilder(
                stream: messageStream.getMessageYieldBase(
                    widget._currentUserId, widget.receiver.uid),
                builder: (context, AsyncSnapshot<dynamic> snapshot) {
                  var d = snapshot.data;
                  var newList = snapshot.hasData ? d.reversed.toList() : [];
                  return
                     
                      ListView.builder(
                          reverse: true,
                          padding: EdgeInsets.all(10),
                          controller: widget._listScrollController,
                          itemCount: newList.length,
                          itemBuilder: (BuildContext context, int index) {
                            
    
                            return DisplayMessage(
                              currentUserId: widget._currentUserId,
                              receiver: widget.receiver,
                              message: newList[index],
                            );
                          });
                })
    

    So the new texts keep coming only when the page rebuilds in some sort of way. Any help rendered is appreciated.