为什么更新显示名称时没有调用Firebase Auth userChanges()-Flutter



我的应用程序有一个AuthGate(),根据当前用户数据将用户发送到SignInScreen()UpdatesNeededScreen()FloatingTabBarView()。如果电子邮件、pictureURL或displayName为空,则会显示UpdatesNeededScreen(),并且屏幕中有一个ListView,显示需要添加的信息。当用户添加他们的电子邮件或姓名时,我也会在这些功能的末尾使用user.reload(),只是为了确保AuthGate()重新加载用户数据,如果缺少更多信息,则会将用户发送回UpdatesNeededScreen(),如果最不需要的话,则会发回FloatingTabBarView()。这与电子邮件非常配合,但当添加名称时,AuthGate()永远不会更新。如果我在那之后关闭应用程序并重新打开它,新的显示名称就在那里,但当它真正更新时,它不会被识别。有人知道为什么吗?

AuthGate():

class AuthGate extends StatelessWidget {
const AuthGate({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return StreamBuilder<User?>(stream: FirebaseAuth.instance.userChanges(), initialData: FirebaseAuth.instance.currentUser, builder: (context, snapshot) {
// User is not signed in
if (!snapshot.hasData) {
if (kDebugMode) {
print('sign in');
}
return const SignInScreen();
}
final User user = snapshot.data!;
if (user.email == null || user.photoURL == null || user.displayName == null) {
// Show edit profile screen
if (kDebugMode) {
print('edit profile');
}
List infoNeeded = [];
if (user.email == null) {
infoNeeded.add('email');
}
if (user.photoURL == null) {
infoNeeded.add('photoURL');
}
if (user.displayName == null) {
infoNeeded.add('displayName');
}
return UpdatesNeededScreen(infoNeeded: infoNeeded);
}
// All good
if (kDebugMode) {
print('signed in AND all info given');
}
return const FloatingTabBarView();
},
);
}
}

保存显示名称的功能:

void saveChanges() {
if (_nameFormKey.currentState!.validate()) {
_nameFormKey.currentState!.save();
setState(() {
_isLoading = true;
});
User user = FirebaseAuth.instance.currentUser!;
try {
user.updateDisplayName(_nameController.text).then((value) {
FirebaseFirestore.instance.collection('users').doc(user.uid).set(
{'displayName': _nameController.text},
SetOptions(merge: true)).then((nn) {
setState(() {
_isLoading = false;
});
user.reload();
});
});
} on FirebaseAuthException catch (e) {
if (kDebugMode) {
print(e.message);
}
}
}
}

我发现了这个问题。如果我滑回UpdatesNeededScreen(),它是正确的,并且不再询问名称。The StreamBuilder()正在更新,但由于我推送不同的屏幕来更新信息,我需要将Navigator.of(context).pop()放在函数的末尾。

相关内容

  • 没有找到相关文章

最新更新