【问题标题】:Flutter Dart - Class has no Instance getter. Return on FutureBuilderFlutter Dart - 类没有实例获取器。 FutureBuilder 的回归
【发布时间】:2021-05-01 10:21:26
【问题描述】:

你能帮我解决这个问题吗?我正在尝试从存储在 sqflite 中的数据返回 FutureBuilder,返回它并用它构建一个小部件列表,但我遇到了一个小问题,我无法弄清楚如何以正确的方式返回列表:

我得到的错误是:

以下 NoSuchMethodError 被抛出构建 FutureBuilder(脏,状态: _FutureBuilderState#7e2ff):类 'List' 没有实例 getter 'messageToJson'。接收方:实例(长度:8) '_GrowableList' 尝试调用:messageToJson

这是我的消息类:

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
  }; 
}

我是这样称呼它的。我的问题在于我正在调用并尝试使用快照数据。然后我实例化我认为没问题的 BeautifulBubble 类。

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,
        ),
      );
    }

  )

同时添加 dbhelper.getmessages

  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;
  }

【问题讨论】:

  • 你可以在问题中添加dbHelper.getMessages()方法吗?
  • @fartem,刚刚做了。谢谢!

标签: flutter dart sqflite


【解决方案1】:

getMessages() 方法返回实体列表,而不是单个实体。在您的案例中,数据库将数据解析为 Message 类,您应该将来自 FutureBuilder 的数据作为 Message 类实例进行操作。

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);
}

【讨论】:

  • 太棒了!这样就整理好了。非常感谢!
猜你喜欢
  • 2021-06-22
  • 2020-10-21
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多