![](/img/trans.png)
[英]The getter 'docs' isn't defined for the type 'DocumentSnapshot<Map<String, dynamic>>
[英]error: The operator '[]' isn't defined for the type 'DocumentSnapshot'
代碼運行良好,但是當我更新我的依賴項時,我開始收到以下錯誤:
這是代碼:
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");
}
}
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']);
/// 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.