如何解决 'Future<dynamic>' 不是类型 'FirebaseUser' 错误的子类型
How to work around 'Future<dynamic>' is not a subtype of type 'FirebaseUser' error
我有一个 FirebaseActions class,它正在为我进行注册和登录。我在其中添加了一个 getCurrentUser 方法。我正在从我的 HomeScreen 小部件调用该函数。我需要将返回值 (type= FirebaseUser) 放入我的 HomeScreen 中的一个变量中以达到 loggedInUser.email。但是我得到了这个错误。我的问题;有没有办法将 FirebaseUser 类型的数据放入 Future 类型的变量中?当我在 HomeScreen 而不是 FirebasAction 中编写此函数时 class,它可以工作,但这是最佳实践吗?
FirebaseActions class
static getCurrentUser(context) async {
final user = await _auth.currentUser().catchError((error) {
Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
});
if (user != null) {
return user;
}
}
主屏幕小部件
class _HomeScreenState extends State<HomeScreen> {
FirebaseUser loggedInUser;
@override
void initState() {
super.initState();
loggedInUser = FirebaseActions.getCurrentUser(context);
print(loggedInUser.toString());
}
你没有指定return方法类型,而且方法是异步的,所以你必须在你调用的地方放置 await。
static Future<FirebaseUser> getCurrentUser(context) async {
另外,在你调用的地方添加 await。
loggedInUser = await FirebaseActions.getCurrentUser(context);
更新:
创建新函数并调用该函数。
callme() async{
loggedInUser = FirebaseActions.getCurrentUser(context);
print(loggedInUser.toString());
}
初始状态:
@override
void initState() {
super.initState();
callme();
}
您收到此错误是因为您没有在 getCurrentUser()
函数中指定 return 类型。
用下面的代码替换您的代码,一切都会正常工作。
要解决这个问题:
检查下面的代码:它工作得很好:
Firebase 操作 Class
// give your function a return type
static Future<FirebaseUser> getCurrentUser(context) async {
final user = await _auth.currentUser().catchError((error) {
Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
});
if (user != null) {
return user;
}
}
主屏幕小部件
class _HomeScreenState extends State<HomeScreen> {
FirebaseUser loggedInUser;
@override
void initState() {
super.initState();
call the function here
logInUser();
print(loggedInUser.toString());
}
希望对您有所帮助
更新
// create a new function to log in user
void logInUser() async {
// await the result because you are invoking a future method
loggedInUser = await FirebaseActions.getCurrentUser(context);
}
以下是我在 initstate 中处理异步函数的方式:
FirebaseActions.getCurrentUser(context).then((val){loggedInUser = val});
还要确保在异步函数中指定 return 类型。
Future<FirebaseUser> getCurrentUser(context) async {...
我有一个 FirebaseActions class,它正在为我进行注册和登录。我在其中添加了一个 getCurrentUser 方法。我正在从我的 HomeScreen 小部件调用该函数。我需要将返回值 (type= FirebaseUser) 放入我的 HomeScreen 中的一个变量中以达到 loggedInUser.email。但是我得到了这个错误。我的问题;有没有办法将 FirebaseUser 类型的数据放入 Future 类型的变量中?当我在 HomeScreen 而不是 FirebasAction 中编写此函数时 class,它可以工作,但这是最佳实践吗?
FirebaseActions class
static getCurrentUser(context) async {
final user = await _auth.currentUser().catchError((error) {
Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
});
if (user != null) {
return user;
}
}
主屏幕小部件
class _HomeScreenState extends State<HomeScreen> {
FirebaseUser loggedInUser;
@override
void initState() {
super.initState();
loggedInUser = FirebaseActions.getCurrentUser(context);
print(loggedInUser.toString());
}
你没有指定return方法类型,而且方法是异步的,所以你必须在你调用的地方放置 await。
static Future<FirebaseUser> getCurrentUser(context) async {
另外,在你调用的地方添加 await。
loggedInUser = await FirebaseActions.getCurrentUser(context);
更新:
创建新函数并调用该函数。
callme() async{
loggedInUser = FirebaseActions.getCurrentUser(context);
print(loggedInUser.toString());
}
初始状态:
@override
void initState() {
super.initState();
callme();
}
您收到此错误是因为您没有在 getCurrentUser()
函数中指定 return 类型。
用下面的代码替换您的代码,一切都会正常工作。
要解决这个问题: 检查下面的代码:它工作得很好:
Firebase 操作 Class
// give your function a return type
static Future<FirebaseUser> getCurrentUser(context) async {
final user = await _auth.currentUser().catchError((error) {
Scaffold.of(context).showSnackBar(AppSnackBar.appSnackBar(error.message));
});
if (user != null) {
return user;
}
}
主屏幕小部件
class _HomeScreenState extends State<HomeScreen> {
FirebaseUser loggedInUser;
@override
void initState() {
super.initState();
call the function here
logInUser();
print(loggedInUser.toString());
}
希望对您有所帮助
更新
// create a new function to log in user
void logInUser() async {
// await the result because you are invoking a future method
loggedInUser = await FirebaseActions.getCurrentUser(context);
}
以下是我在 initstate 中处理异步函数的方式:
FirebaseActions.getCurrentUser(context).then((val){loggedInUser = val});
还要确保在异步函数中指定 return 类型。
Future<FirebaseUser> getCurrentUser(context) async {...