Search code examples
fluttersqlitestatefulwidgetsqlbrite

Flutter SqlBrite not rebuilding streambuilder list


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.


Solution

  • 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...