vwdewaal
vwdewaal

Reputation: 1005

Flutter Dart - Class has no Instance getter. Return on FutureBuilder

Can you help me out with this one? I'm trying to return a FutureBuilder from data stored in sqflite, return it and build a list of widgets with it, but I'm having a slight issue where I can't figure out how to return the list in the right way:

The error I'm getting is:

The following NoSuchMethodError was thrown building FutureBuilder<List>(dirty, state: _FutureBuilderState<List>#7e2ff): Class 'List' has no instance getter 'messageToJson'. Receiver: Instance(length:8) of '_GrowableList' Tried calling: messageToJson

Here is my message class:

import "dart:convert";

List<Message> messageFromJson(String str) =>
    List<Message>.from(json.decode(str).map((x) => Message.fromJson(x)));

String messageToJson(List<Message> data) =>
    json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Message {
  String message;
  String sender;
  String date;
  String contactID;
  Message({this.sender, this.message, this.date, this.contactID});

  factory Message.fromJson(Map<String, dynamic> json) => Message(
      message: json['message'],
      sender: json['sender'],
      date: json['date'],
      contactID: json['contactID'],
  );

  Map<String, dynamic> toJson() => {
    "message": message,
    "sender" : sender,
    "date" : date,
    "contactID" : contactID
  }; 
}

here is how I'm calling it. My problem lies where I'm calling and trying to use the snapshot data. I then instantiate the BeautifulBubble class which I think will be ok.

body: new FutureBuilder(
    future: dbHelper.getMessages(0),
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return Center(
          child: CircularProgressIndicator(
            backgroundColor: Colors.lightBlueAccent,
          ),
        );
      }
    //Todo: Figure out how to call this:
      final messages = snapshot.data.messageToJson;
      List<BeautifulChatBubble> messageBubs = [];
      for (var message in messages.toJson().values) {
        final senderText = message.data['sender'];
        final messageText = message.data['message'];
        final dateText = message.data['date'];
        final contactIDText = message.data['contactID'];

        final messagebubble = BeautifulChatBubble(
          sender: senderText,
          text: messageText,
          date: dateText,
          isMe: false,
        );
        messageBubs.add(messagebubble);
      }
      return Expanded(
        child: ListView(
          reverse: true,
          padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
          children: messageBubs,
        ),
      );
    }

  )

Adding dbhelper.getmessages as well

  Future<List<Message>> getMessages(int chatid) async {
    final db = await database;
    final res = await db.query(messagetable, where: '$columnChatID = ?', whereArgs: [chatid]);
    List<Message> messagelist =
        res.isNotEmpty? res.map((c) => Message.fromJson(c)).toList() : [] ;

    return messagelist;
  }

Upvotes: 0

Views: 1037

Answers (1)

fartem
fartem

Reputation: 2541

getMessages() method return a list of entities, not single entity. In your case database parsed data to Message class and you should operate a data from FutureBuilder as Message class instances.

final messages = snapshot.data;
List<BeautifulChatBubble> messageBubs = [];
for (var message in messages) {
  final senderText = message.sender;
  final messageText = message.message;
  final dateText = message.date;
  final contactIDText = message.contactID;

  final messagebubble = BeautifulChatBubble(
    sender: senderText,
    text: messageText,
    date: dateText,
    isMe: false,
  );
  messageBubs.add(messagebubble);
}

Upvotes: 1

Related Questions