我试图添加匿名用户功能并将其保存到设备以供进一步使用,但每当我重新启动我的应用程序firebase时,不检测currentUser是否为匿名,并且它的工作就像3-5天前一样完美。
匿名登录码
signInAnonymously().then((value) async {
SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.setString(
'name',
FirebaseAuth.instance.currentUser.uid
);
preferences.setBool('anon', true);
});
主要代码
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
SharedPreferences prefs = await SharedPreferences.getInstance();
var name = prefs.getString('name');
FirebaseAuth auth = FirebaseAuth.instance;
Algolia algolia = Application.algolia;
print(auth.currentUser.isAnonymous); // Returns false even if i logged anonymously before
runApp(ThemeProvider(
saveThemesOnChange: true,
themes: [
AppTheme(
id: 'white',
data: constant.whiteTheme,
description: 'white theme'
),
AppTheme(
id: 'dark',
data: constant.darkTheme,
description: 'dark theme'
),
],
child: ThemeConsumer(
child: Builder(
builder: (themeContext) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: name == null
? OnBoardScreen(
algolia: algolia,
)
: WelcomeScreen(
isAnon: prefs.getBool('anon'),
algolia: algolia,
),
theme: ThemeProvider.themeOf(themeContext).data,
);
}),
),
)
);
}
主要代码
FirebaseAuth auth = FirebaseAuth.instance;
print(auth.currentUser.uid); //returns UID of anon user
print(auth.currentUser.isAnonymous);//returns false all the time
主代码日志
I/flutter (31830): ci90IxegpvMyq0vGqhtHxqcrrT52
I/flutter (31830): false
我可以打印匿名用户的UID但是isAnonymous状态仍然返回false
注意:我知道我可以用SharedPreferences处理用户情况,但是是什么原因导致的呢?我不能得到如果用户是匿名登录前重启应用程序与"FirebaseAuth"?
通过擦除数据和使用新的仿真器解决了问题。
当你重新启动应用程序时,Firebase必须检查用户是否仍然有访问权限(例如:你可能已经禁用了他们的帐户)。这是一个异步操作,因为它需要调用服务器,并且可能需要一些时间才能完成。
当你的代码访问FirebaseAuth.instance.currentUser
时,这个异步调用可能还没有完成——导致currentUser
仍然是null
。
要确保始终响应正确的身份验证状态,请使用验证状态侦听器,如身份验证状态文档所示:
FirebaseAuth.instance
.authStateChanges()
.listen((User user) {
if (user == null) {
print('User is currently signed out!');
} else {
print('User is signed in!');
}
});