본문 바로가기
expert

Cloud Firestore를 업데이트한 후: '[]' 연산자가 '객체' 유형에 대해 정의되지 않았습니다. 연산자 '[]'를 정의해 보세요.

by RWriter 2023. 1. 28.
반응형

질문 제목:

Cloud Firestore를 업데이트한 후: '[]' 연산자가 '객체' 유형에 대해 정의되지 않았습니다. 연산자 '[]'를 정의해 보세요.

질문 내용:

모든 것이 잘 작동했지만 클라우드 Firestore 의존성을 업그레이드했을 때. "'Object' 유형에 대해 '[]' 연산자가 정의되지 않았습니다. "라는 오류가 발생하기 시작했습니다. 이 오류는 모든 4 userData.data()[""] 앞에 오고 있습니다.

class BaseProvider with ChangeNotifier {
  //instances of firebase

  final FirebaseAuth _auth = FirebaseAuth.instance;

  final CollectionReference postsCollection =
      FirebaseFirestore.instance.collection("posts");

  final CollectionReference userCollection =
      FirebaseFirestore.instance.collection("users");

  //Creating post

  Future addPost(
    
  ) async {
    DocumentSnapshot userData =
        await userCollection.doc(_auth.currentUser.uid).get();
    return await postsCollection.doc().set({
      "id": _auth.currentUser.uid,
      "sellername": userData.data()["name"],      //Error
      "sellercontact": userData.data()["phone"],  //Error
      "sellercity": userData.data()["city"],      //Error
      "sellerstate": userData.data()["state"],    //Error
      
    });
  }

해결 답변:

cloud_firestore버전 2.0.0 부터

클래스 DocumentSnapshot는 이제 일반 매개변수를 사용합니다. 선언:

abstract class DocumentSnapshot<T extends Object?> {

따라서 유형의 추상 메소드를 포함합니다 T.

  T? data();

따라서 다음을 수행해야 합니다.

    DocumentSnapshot<Map<String, dynamic>> userData =
        await userCollection.doc(_auth.currentUser.uid).get();
    return await postsCollection.doc().set({
      "id": _auth.currentUser.uid,
      "sellername": userData.data()["name"],      
      "sellercontact": userData.data()["phone"],  
      "sellercity": userData.data()["city"],      
      "sellerstate": userData.data()["state"], 
      
    });

이제 data()메소드가 유형이 되고 일반적으로 연산자 Map<String,dynamic>를 사용하여 데이터에 액세스할 수 있습니다 .[]


또 다른 예:

Query query = FirebaseFirestore.instance.collection("collectionPath");
final Stream<QuerySnapshot<Map<String,dynamic>>> snapshots = query.snapshots();

위의 오류가 발생합니다.

'Stream<QuerySnapshot<Object?>>' 유형의 값은 'Stream<QuerySnapshot<Map<String, dynamic>>>' 유형의 변수에 할당할 수 없습니다.

Query다음 선언 이 있기 때문에 이 오류가 발생 합니다.

abstract class Query<T extends Object?>

while snapshots()은 다음을 반환합니다.

Stream<QuerySnapshot<T>> snapshots({bool includeMetadataChanges = false});

Query이후에 유형이 지정되지 않았 T extends Object?으므로 코드 snapshots()에서 다음과 같은 반환 유형 Stream<QuerySnapshot<Object?>>을 가지며 위의 오류가 발생합니다. 따라서 이를 해결하려면 다음을 수행해야 합니다.

Query<Map<String,dynamic>> query = FirebaseFirestore.instance.collection("collectionPath");
final Stream<QuerySnapshot<Map<String,dynamic>>> snapshots = query.snapshots();

문서 에 따르면 :

BREAKING REFACTOR: DocumentReference, CollectionReference, Query, DocumentSnapshot, CollectionSnapshot, QuerySnapshot, QueryDocumentSnapshot, Transaction.get, Transaction.set 및 WriteBatch.set은 이제 추가 일반 매개변수를 사용합니다. (#6015).

따라서 위의 모든 클래스에 대해 구현해야 합니다.

반응형

댓글