Flutter:参数类型'StreamTransformer<dynamic,dynamic>'无法赋值给参数类型StreamTransformer<QuerySnapshot List<Message>>。

4

我正在尝试使用Flutter和Firebase构建聊天应用程序,我从Github上获取了以下代码并在我的项目中使用。在早期版本的Flutter上,它可以正常工作,在2.0上会显示以下错误:The argument type 'StreamTransformer<dynamic, dynamic>' can't be assigned to the parameter type 'StreamTransformer<QuerySnapshot, List<Message>>'

该错误由以下行触发:

.transform(Utils.transformer(User.fromJson));

完整代码:

class FirebaseApi {
  static Stream<List<User>> getUsers() => FirebaseFirestore.instance
      .collection('users')
      // .collection('ch ats')
      .orderBy(UserField.timestamp, descending: true)
      .snapshots()
      .transform(Utils.transformer(User.fromJson));

  static Future uploadMessage(String idUser, String message) async {
    final refMessages =
        FirebaseFirestore.instance.collection('chats/$idUser/messages');

    final newMessage = Message(
      // idUser: myId,
      idUser: Globals.auth.currentUser!.uid,
      // urlAvatar: myUrlAvatar,
      urlAvatar: ChatPageState.photoUrl.toString(),
      // username: myUsername,
      username: ChatPageState.displayName.toString(),
      message: message,
      createdAt: DateTime.now(),
    );
    await refMessages.add(newMessage.toJson());

    final refUsers = FirebaseFirestore.instance.collection('users');

    await refUsers.doc(idUser).update({UserField.timestamp: DateTime.now()});
  }

  static Stream<List<Message>> getMessages(String idUser) {
    return FirebaseFirestore.instance
        .collection('chats/$idUser/messages')
        .orderBy(MessageField.createdAt, descending: true)
        .snapshots()
        .transform(Utils.transformer(Message.fromJson));
  }

}

class Utils {
  static StreamTransformer transformer<T>(
          T Function(Map<String, dynamic> json) fromJson) =>
      StreamTransformer<QuerySnapshot, List<T>>.fromHandlers(
        handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
          final snaps = data.docs.map((doc) => doc.data()).toList();
          final users = snaps.map((json) => fromJson(json)).toList();

          sink.add(users);
        },
      );

  static DateTime toDateTime(Timestamp value) {
    // if (value == null);

    return value.toDate();
  }

  static dynamic fromDateTimeToJson(DateTime date) {
    if (date == null) return null;

    return date.toUtc();
  }
}

你可以尝试使用snapshots.map((e){ // add logo })代替transform... - Patrick Waweru
@Patrick Waweru 你好,我尝试添加 snapshots.map((e){ // add logo }) 但它并没有起作用,你能否详细解释并将其添加到我的代码中以增进理解? - Al Mamun
你可以尝试类型转换 - The Anonymous Koder
@匿名程序员,我该怎么做呢?你能否用我的代码给一个例子。 - Al Mamun
@AlMamun,请像这条消息一样分享您的模型,以便我们可以查看您的模型,并分享一个使用map而不是transform的示例。 - Patrick Waweru
@Patrick Waweru,对不起!你在谈论哪个模型? - Al Mamun
3个回答

6
QuerySnapshot<Map<String, dynamic>> 作为你的返回类型。对我有用。
static StreamTransformer<QuerySnapshot<Map<String, dynamic>>, List<T>> transformer<T>(
      T Function(Map<String, dynamic> json) fromJson) =>
  StreamTransformer<QuerySnapshot<Map<String, dynamic>>, List<T>>.fromHandlers(
    handleData: (QuerySnapshot<Map<String, dynamic>> data, EventSink<List<T>> sink) {
      final snaps = data.docs.map((doc) => doc.data()).toList();
      final users = snaps.map((json) => fromJson(json)).toList();

      sink.add(users);
    },
  );

非常详细解释。非常感谢! - Mahmoud Eidarous

1
这里的问题在于transformer函数的返回类型是dynamic,而.transform函数需要特定的返回类型。解决方法是添加返回类型,如下所示:
static StreamTransformer<QuerySnapshot, List<T>> transformer<T>(
      T Function(Map<String, dynamic> json) fromJson) =>
  StreamTransformer<QuerySnapshot, List<T>>.fromHandlers(
    handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
      final snaps = data.docs.map((doc) => doc.data()).toList();
      final users = snaps.map((json) => fromJson(json)).toList();

      sink.add(users);
    },
  );

0

所以对于任何遇到这个问题的人,请将您的依赖版本更改为以下内容:

firebase_core: ^0.5.0+1
cloud_firestore: ^0.14.1+3

这对我有用,这是一个依赖性的问题
image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接