',flutter,dart,google-cloud-firestore"/>

首页 > 解决方案 > Flutter:NoSuchMethodError:参数不匹配的闭包调用:函数'Global.models。'

问题描述

在fireship.io的 Flutter Firebase 课程的帮助下,我正在构建自己的 Flutter 应用程序。课程资料库在这里

但是,由于放弃了多个流 - 在开始课程之前我自己尝试过 - 支持具有匿名类型的类,因此我收到以下错误消息并且无法理解原因。

目标: 我想要一个包含来自任何 Firestore 集合的所有文档的 Stream,在本例中为“hochschulen”。集合存在并充满数据。所有字段都是字符串。

预期: 没有错误消息

实际结果:

flutter: The following assertion was thrown:
flutter: An exception was throw by _MapStream<QuerySnapshot, List<University>> listened by
flutter: StreamProvider<List<University>>, but no `catchError` was provided.
flutter:
flutter: Exception:
flutter: NoSuchMethodError: Closure call with mismatched arguments: function 'Global.models.<anonymous
flutter: closure>'
flutter: Receiver: Closure: (dynamic, String) => University
flutter: Tried calling: Global.models.<anonymous closure>(data: _LinkedHashMap len:10)
flutter: Found: Global.models.<anonymous closure>(dynamic, String) => University
flutter:
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

我努力了:

这是我要加载一些数据的小部件:

class LegalScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<List<University>>.value(
      value: Global.universityRef.streamData(),
      child: LegalScreenContent(),
    );
  }
}

这是我的全球课程:

class Global {
  static final FirebaseAnalytics analytics = FirebaseAnalytics();
  static final Map models = {
    // Dish: (data, id) => Dish.fromMap(data, id),
    // Event: (data, id) => Event.fromMap(data, id),
    // News: (data, id) => News.fromMap(data, id),
    // Subject: (data, id) => Subject.fromMap(data, id),
    University: ({Map data}) => University.fromMap(data: data),
    // UserModel: (data, id) => UserModel.fromMap(data, id),
  };
  static final UserData<UserModel> userModelRef =
      UserData<UserModel>(collection: 'users');
  static final Collection<University> universityRef =
      Collection<University>(path: 'hochschulen');
}

这是大学的模型:

class University {
  String city;
  String domain;
  String mail;
  String name;
  String shortName;
  String street;
  String phone;
  String website;
  String zip;
  University(
      {this.city,
      this.domain,
      this.mail,
      this.name,
      this.shortName,
      this.street,
      this.phone,
      this.website,
      this.zip});
  University.fromMap({Map data}) {
    city = data['city'] ?? '';
    domain = data['domain'] ?? '';
    mail = data['mail'] ?? '';
    name = data['name'] ?? '';
    shortName = data['short_name'] ?? '';
    street = data['street'] ?? '';
    phone = data['tel'] ?? '';
    website = data['website'] ?? '';
    zip = data['zip'] ?? '';
  }
}

这是我的收藏类:

class Collection<T> {
  final FirebaseFirestore _db = FirebaseFirestore.instance;
  final String path;
  CollectionReference ref;
  Collection({this.path}) {
    ref = _db.collection(path);
  }
  Future<List<T>> getData() async {
    var snapshots = await ref.get();
    return snapshots.docs
        .map((doc) => Global.models[T](doc.data, doc.id) as T)
        .toList();
  }
  Stream<List<T>> streamData() {
    return ref.snapshots().map((snapshot) => snapshot.docs
        .map((doc) => Global.models[T](data: doc.data()) as T)
        .toList());
  }
}

标签: flutterdartgoogle-cloud-firestore

解决方案


推荐阅读