如何解决此错误 类型 'FirebaseUser' 不是类型为"字符串"的子类型?



我在运行应用程序时遇到此异常:

类型"FirebaseUser"不是类型"String"的子类型

应用程序正在运行。它进行手机身份验证,然后根据相同的给定条件移动到下一页。但当我按下后退按钮时,它也会在应用程序中抛出异常,这是可见的。

这是我的密码。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'AccountDetialsPage.dart';
import 'Homepage.dart';
import 'Phoneverification.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final Firestore firestore = Firestore.instance;
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FutureBuilder(
future: getCurrentUser(),
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Text("Loading...");
}
return StreamBuilder(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (BuildContext context, snapshot) {
if (snapshot.hasData){
return StreamBuilder(
stream: firestore
.collection('users')
.document(snapshot.data)
.snapshots(),
builder: (context, snapshot){
if (snapshot.hasData){
if (snapshot.data["verified"] == true){
return HomePage();
}
else{
return AccountDetialsPage();
}
}
else{
return Text('Loading StreamBuilder');
}                  
}
);
}
else{
return Phoneverification();
}
},
);
}),
);
}
Future<String> getCurrentUser() async {
final FirebaseAuth _auth = FirebaseAuth.instance;
final FirebaseUser user = await _auth.currentUser();
final uid = user.uid;
var number = user.phoneNumber;
return number.toString();
}
}

在此处输入图像描述

StreamBuilder中,您将未来设置为:

stream: FirebaseAuth.instance.onAuthStateChanged,

然后在构建器中使用它从Firestore获取数据:

stream: firestore
.collection('users')
.document(snapshot.data)
.snapshots(),

onAuthStateChanged侦听器是用FirebaseUser调用的,所以这里的snapshot.dataFirebaseUser。由于document(...)需要一个字符串,因此会出现错误。

最有可能的情况是,您希望使用用户的UID来查找文档,在这种情况下,您可以这样做:

stream: firestore
.collection('users')
.document(snapshot.data.uid)
.snapshots(),

一般来说,您的代码看起来很混乱:在FutureBuilder中,您有当前用户的未来,然后在流生成器中,您也为同一用户使用侦听器。

我的感觉是,实际上您正在尝试为用户使用FutureBuilder,然后为Firestore中的数据使用StreamBuilder。如果是这样的话,你可能正在寻找更像的东西

home: FutureBuilder(
future: getCurrentUser(),
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Text("Loading...");
}
return StreamBuilder(
stream: firestore
.collection('users')
.document(snapshot.data)
.snapshots(),
builder: (BuildContext context, snapshot) {
if (snapshot.hasData){
if (snapshot.data["verified"] == true){
return HomePage();
}
else{
return AccountDetialsPage();
}
}
}
},
);
}),

上面可能有拼写错误,但重要的是,这里的第一个stream包含Firestore基于future: getCurrentUser()的快照。

最新更新