Reputation: 1005
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
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