登录时在 null 上调用的方法 '[]'



**你好!当登录时,我得到错误";尝试调用:";我已经上传了代码,下面的错误已经好几天了,突然开始显示这个错误,请检查并帮助我是新来的应用程序开发人员。我请求你详细解释,或者如果可能的话,请更正并重写代码。我将感谢你。

用户模式

import 'package:cloud_firestore/cloud_firestore.dart';
import 'cart_modal.dart';
class UserModel {
static const ID = "uid";
static const NAME = "name";
static const EMAIL = "email";
static const STRIPE_ID = "stripeId";
static const CART = "cart";
static const FAVOURITES = "myfavourites";
String _name;
String _email;
String _id;
String _stripeId;
//  getters
String get name => _name;
String get email => _email;
String get id => _id;
String get stripeId => _stripeId;
// public variables
List<CartItemModel> cart;
List<CartItemModel> favourites;
UserModel.fromDocument(DocumentSnapshot doc) {
_name = doc.data()[NAME];
_email = doc.data()[EMAIL];
_id = doc.data()[ID];
cart = _convertCartItems(doc.data()[CART] ?? []);
favourites = _convertFavouritesItems(doc.data()[FAVOURITES] ?? []);
_stripeId = doc.data()[STRIPE_ID] ?? '';
}
List<CartItemModel> _convertCartItems(List cart) {
List<CartItemModel> convertedCart = [];
for (Map cartItem in cart) {
convertedCart.add(CartItemModel.fromMap(cartItem));
}
return convertedCart;
}
List<CartItemModel> _convertFavouritesItems(List favourites) {
List<CartItemModel> convertedFavourites = [];
for (Map favouritesItem in favourites) {
convertedFavourites.add(CartItemModel.fromMap(favouritesItem));
}
return convertedFavourites;
}
}

用户服务

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:vanfly/modals/cart_modal.dart';
import 'package:vanfly/modals/user_modal.dart';
class UserServices {
FirebaseFirestore _firestore = FirebaseFirestore.instance;
String collection = "users";
createUser(Map<String,dynamic> data) async {
_firestore.collection(collection).doc(data["uid"]).set(data);
}
Future<UserModel> getUserById(String id) async =>
await _firestore.collection(collection).doc(id).get().then((doc) {
return UserModel.fromDocument(doc);
});
void addToCart({String userId, CartItemModel cartItem}) {
_firestore.collection(collection).doc(userId).update({
"cart": FieldValue.arrayUnion([cartItem.toMap()])
});
}
void removeFromCart({String userId, CartItemModel cartItem}) {
_firestore.collection(collection).doc(userId).update({
"cart": FieldValue.arrayRemove([cartItem.toMap()])
});
}
void addToFavourites({String userId, CartItemModel favouritesItem}) {
_firestore.collection(collection).doc(userId).update({
"favourites": FieldValue.arrayUnion([favouritesItem.toMap()])
});
}
void removeFromFavourites({String userId, CartItemModel favouritesItem}) {
_firestore.collection(collection).doc(userId).update({
"favourites": FieldValue.arrayRemove([favouritesItem.toMap()])
});
}
}

错误

E/flutter ( 8296): [ERROR:flutter/lib/ui/ui_dart_state.cc(213)] Unhandled Exception: NoSuchMethodError: The method '[]' was called on null.
E/flutter ( 8296): Receiver: null
E/flutter ( 8296): Tried calling: []("name")
E/flutter ( 8296): #0      Object.noSuchMethod (dart:core-patch/object_patch.dart:63:5)
E/flutter ( 8296): #1      new UserModel.fromDocument (package:vanfly/modals/user_modal.dart:32:23)
E/flutter ( 8296): #2      UserServices.getUserById.<anonymous closure> (package:vanfly/services/user_services.dart:15:26)
E/flutter ( 8296): #3      _rootRunUnary (dart:async/zone.dart:1436:47)
E/flutter ( 8296): #4      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter ( 8296): <asynchronous suspension>
E/flutter ( 8296): #5      UserServices.getUserById (package:vanfly/services/user_services.dart:14:7)
E/flutter ( 8296): <asynchronous suspension>
E/flutter ( 8296): #6      UserProvider._onStateChanged (package:vanfly/providers/user_provider.dart:79:20)
E/flutter ( 8296): <asynchronous suspension>
E/flutter ( 8296): 

看起来_firestore.collection(collection).doc(id)不存在,因此doc.data()返回null,这导致_name = doc.data()[NAME];上出现错误消息。

当用户文档不存在时,您必须决定要在getUserById中执行什么操作。


更新:所以您必须更改此代码:

Future<UserModel> getUserById(String id) async =>
await _firestore.collection(collection).doc(id).get().then((doc) {
return UserModel.fromDocument(doc);
});

当文档未退出时,您需要决定在此处执行什么操作。例如:

Future<UserModel> getUserById(String id) async =>
await _firestore.collection(collection).doc(id).get().then((doc) {
if (doc.exists) { // 👈 check if the document exists
return UserModel.fromDocument(doc);
}
else {
return null; // 👈 return something that your calling code can handle
}
});

最新更新