簡體   English   中英

錯誤:未為類型“DocumentSnapshot”定義運算符“[]”

[英]error: The operator '[]' isn't defined for the type 'DocumentSnapshot'

代碼運行良好,但是當我更新我的依賴項時,我開始收到以下錯誤:

  1. 錯誤:未為類型“DocumentSnapshot”定義運算符“[]”
  2. 錯誤:表達式不計算為函數,因此無法調用。 (invocation_of_non_function_expression 錯誤:未為類型“DocumentSnapshot”定義運算符“[]”。 錯誤:表達式不計算為函數,因此無法調用。 (invocation_of_non_function_expression

這是代碼:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:za/pages/signup.dart';
import 'home.dart';


class Login extends StatefulWidget {
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  final GoogleSignIn googleSignIn = new GoogleSignIn();
  final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  final _formKey = GlobalKey<FormState>();
  TextEditingController _emailTextController = TextEditingController();
  TextEditingController _passwordTextController = TextEditingController();
  SharedPreferences preferences;
  bool loading = false;
  bool islogedin = false;
  bool hidepass = true;

  @override
  void initState() {
    super.initState();
    isSignedIn();
  }

  void isSignedIn() async {
    setState(() {
      loading = true;
    });


    await firebaseAuth.currentUser().then((user){
      if (user!=null){
        setState(() => islogedin= true);
      }
    });
    if (islogedin == true) {
      Navigator.pushReplacement(
          context, MaterialPageRoute(builder: (context) => HomePage()));
    }
    setState(() {
      loading = false;
    });
  }

  Future handleSignIn() async {
    preferences = await SharedPreferences.getInstance();
    setState(() {
      loading = true;
    });

    final GoogleSignInAccount googleUser = await googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;

    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    User firebaseUser =
        (await firebaseAuth.signInWithCredential(credential)).user;

    if (firebaseUser != null) {
      final QuerySnapshot result = await Firestore.instance
          .collection("users")
          .where("id", isEqualTo: firebaseUser.uid)
          .get();
      final List<DocumentSnapshot> documents = result.docs;
      if (documents.length == 0) {
        // insert the user to our collection
        FirebaseFirestore.instance
            .collection("users")
            .doc(firebaseUser.uid)
            .set({
          "id": firebaseUser.uid,
          "username": firebaseUser.displayName,
          "profilePicture": firebaseUser.photoURL
        });
        await preferences.setString("id", firebaseUser.uid);
        await preferences.setString("username", firebaseUser.displayName);
        await preferences.setString("photoUrl", firebaseUser.displayName);
      } else {
        await preferences.setString("id", documents[0].data['id']);
        await preferences.setString("username", documents[0].data['username']);
        await preferences.setString("photoUrl", documents[0].data['photoUrl']);
      }
      Fluttertoast.showToast(msg: "Login was successful");
      setState(() {
        loading = false;
      });
    } else {

      Fluttertoast.showToast(msg: "Login failed");
    }
  }
  1. DocumentSnapshot沒有[]運算符,因為錯誤明確指出。 它有data字段,其中有。

替換此代碼:

    await preferences.setString("id", documents[0]['id']);
    await preferences.setString("username", documents[0]['username']);
    await preferences.setString("photoUrl", documents[0]['photoUrl']);

有了這個:

    await preferences.setString("id", documents[0].data['id']);
    await preferences.setString("username", documents[0].data['username']);
    await preferences.setString("photoUrl", documents[0].data['photoUrl']);
  1. 根據消息來源:
  /// Returns the current [User] if they are currently signed-in, or `null` if
  /// not.
  ///
  /// You should not use this getter to determine the users current state,
  /// instead use [authStateChanges], [idTokenChanges] or [userChanges] to
  /// subscribe to updates.
  User get currentUser {
    if (_delegate.currentUser != null) {
      return User._(this, _delegate.currentUser);
    }

    return null;
  }

試試await preferences.setString("username", documents[0].data()['username']);

順便說一句,你更新你的firebase包了嗎? 如果是,請點擊此鏈接檢查更新的更改https://firebase.flutter.dev/docs/migration/

固定 1,我改變了

await preferences.setString("id", documents[0]['id']);
await preferences.setString("username", documents[0]['username']);
await preferences.setString("photoUrl", documents[0]['photoUrl']);

await preferences.setString("id", documents[0].data()['id']);
await preferences.setString("username", documents[0].data()['username']);
await preferences.setString("photoUrl", documents[0].data()['photoUrl']);

顯然,通過數據獲取器獲取快照數據現在是通過data()方法完成的。

我只剩下錯誤

await firebaseAuth.currentUser().then((user){
      if (user!=null){
        setState(() => islogedin= true);
      } 

根據文檔( https://firebase.flutter.dev/docs/migration/ ),通過 currentUser() 訪問當前用戶現在通過 currentUser 獲取器同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM