【问题标题】:Flutter The argument type 'StreamTransformer<dynamic, dynamic>' can't be assigned to the parameter type StreamTransformer<QuerySnapshot List<Message>>Flutter 参数类型 'StreamTransformer<dynamic, dynamic>' 无法赋值给参数类型 StreamTransformer<QuerySnapshot List<Message>>
【发布时间】:2021-09-12 20:16:03
【问题描述】:

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

错误由以下行触发:

.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 }) .....
  • @Patrick Waweru 嗨,我尝试添加 snapshots.map((e){ // add logo }) 它不起作用,您能否详细说明并将其添加到我的代码中以便更好地理解?
  • 你可以试试casting
  • @ The Anonymous Koder 我怎么能做到这一点?你能用我的代码做一个例子吗?
  • @AlMamun 然后像此消息一样分享您的模型,以便可以查看您的模型并使用地图而不是变换分享示例

标签: firebase flutter firebase-realtime-database google-cloud-firestore flutter-web


【解决方案1】:

所以对于遇到此问题的任何人,请将您的依赖版本更改为此

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

它对我有用,它的依赖问题

【讨论】:

    【解决方案2】:

    这里的问题是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);
        },
      );
    

    【讨论】:

      【解决方案3】:

      添加 QuerySnapshot&lt;Map&lt;String, dynamic&gt;&gt; 作为您的返回类型。为我工作。

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

      【讨论】:

        猜你喜欢
        • 2022-11-22
        • 2019-06-26
        • 2023-02-06
        • 2021-09-15
        • 2021-10-18
        • 2021-07-06
        • 2022-11-17
        • 2022-11-27
        • 2021-12-30
        相关资源
        最近更新 更多