FlutterFirestoreで.data []を使用すると、「演算子 '[]'が定義されていません」というエラーが発生します

Aug 22 2020

私は、YouTubeでのNet Ninjaのチュートリアルに従って、フラッターでfirestoreを使用することを学んでいます。ユーザー認証が行われた後、この男は新しいユーザーが作成されるたびにデータベースにユーザーレコードを追加しました。これを行うために、「name」という名前の1つの文字列を渡して新しいモデルが追加されました。 .data ['name']は、モデルからその文字列を取得します(文字列はnameと呼ばれていました)。これを実行すると、エラーが発生しました。The operator '[]' isn't defined for the type 'Map<String, dynamic> Function()'なぜこのエラーが発生するのですか?

ユーザー名モデル

class Username {
  final String name;
  Username({ this.name });
}

databse.dartファイル(次のコードはDatabaseServiceというクラスにラップされています)

  List<Username> _usernameListFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.docs.map((doc){
      return Username(
        name: doc.data['name'] ?? '',
      );
    }).toList();
  }

auth.dart

  Future registerWithEmailAndPassword(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      User user = result.user;

      // create a new document for the user with uid
      await DatabaseService(uid: user.uid).updateUserData('user123');
      return _userFromFirebaseUser(user);
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

ご不明な点がある場合、またはコードをさらに表示する必要がある場合は、コメントでお知らせください

回答

35 PeterHaddad Aug 22 2020 at 03:27

これを変える:

name: doc.data['name'] ?? '' 

これに:

name: doc.data()['name'] ?? '' 

data()はメソッドであるため()、ソースコードからを追加する必要があります。

  Map<String, dynamic> data() {
    return _CodecUtility.replaceDelegatesWithValueInMap(
        _delegate.data(), _firestore);
  }

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/document_snapshot.dart#L38

4 AnisR. Sep 03 2020 at 19:01

Firestoreは以前はのdataプロパティでしたQueryDocumentSnapshotが、現在は関数ですdata()

そして、エラーメッセージが示すように、あなたが扱っているのは確かにMap<String, dynamic> Function()、つまりマップを返す関数です。

したがって、関数を呼び出すには、空の括弧を追加するだけですdata

doc.data()['name']