當我讓用戶注冊時,我似乎無法讓我的顫振應用程式更新我的 firebase 集合。我沒有收到任何錯誤訊息或任何警告,我唯一能想到的是,如果某些內容為空,因此沒有更新,但我看不到我的身份驗證是如何作業的,而且我可以在 firebase 身份驗證選項卡中看到用戶。
我檢查了我的規則,看起來沒問題:

我的代碼如下:
///sign up function
Future<String?> signUp(
{required String email, required String password}) async {
try {
await _firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
var currentUser = FirebaseAuth.instance.currentUser;
FirebaseFirestore.instance.collection('USER_TABLE').doc().update({
'email': currentUser!.email,
'firstName': 'Joe',
'lastName': 'bloggs',
'userID': currentUser.uid,
});
return "Signed up";
} on FirebaseAuthException catch (e) {
return e.message;
}
我的資料庫如下所示:

Main.dart 代碼
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
Provider<AuthenticationService>(
create: (_) => AuthenticationService(FirebaseAuth.instance),
),
StreamProvider(
create: (context) =>
context.read<AuthenticationService>().authStateChanges,
initialData: null,
)
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: AuthenticationWrapper(),
),
);
}
}
class AuthenticationWrapper extends StatelessWidget {
const AuthenticationWrapper({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final firebaseUser = context.watch<User>();
if (firebaseUser == null) {
print('User is NOT signed in!');
return const WelcomeScreen();
}
print('User is signed in!');
return const MainScreen();
}
}
uj5u.com熱心網友回復:
我看到問題“更新方法需要一個 ID”只有“添加方法不需要”
FirebaseFirestore.instance.collection('USER_TABLE').doc(currentUser.uid).update({
'email': currentUser!.email,
'firstName': 'Joe',
'lastName': 'bloggs',
'userID': currentUser.uid,
});
或者
FirebaseFirestore.instance.collection('USER_TABLE').add({
'email': currentUser!.email,
'firstName': 'Joe',
'lastName': 'bloggs',
'userID': currentUser.uid,
});
uj5u.com熱心網友回復:
這不起作用:
FirebaseFirestore.instance.collection('USER_TABLE').doc().update({
'email': currentUser!.email,
'firstName': 'Joe',
'lastName': 'bloggs',
'userID': currentUser.uid,
});
從參考檔案doc():
如果未提供路徑,則使用自動生成的 ID。
因此,您的doc()呼叫(沒有 ID)會生成一個新的唯一 ID,并將 a 回傳DocumentReference到該新的、不存在的檔案。之后的問題是update()只能更新現有檔案,它永遠不會創建檔案。
由于您似乎不知道該用戶的檔案是否存在,您應該:
doc()在@THEODORE 回答時傳遞 UIDFirebaseFirestore.instance.collection('USER_TABLE') .doc(currentUser.uid)呼叫
set而不是更新。FirebaseFirestore.instance.collection('USER_TABLE') .doc(currentUser.uid) .set({...})如果檔案可能已經存在,并且您希望將新值與任何現有值合并,則可以傳遞
SetOptions給set。FirebaseFirestore.instance.collection('USER_TABLE') .doc(currentUser.uid) .set({...}, SetOptions(merge : true))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420635.html
標籤:
