如何解决此错误类型';FirebaseUser';不是类型为';字符串';?
我在运行我的应用程序时遇到此异常: 类型“FirebaseUser”不是类型“String”的子类型 应用程序正在运行。它进行电话身份验证,然后根据相同的给定条件转到下一页。但当我点击后退按钮时,它抛出异常,在应用程序中也是可见的 这是我的密码如何解决此错误类型';FirebaseUser';不是类型为';字符串';?,firebase,flutter,dart,firebase-authentication,Firebase,Flutter,Dart,Firebase Authentication,我在运行我的应用程序时遇到此异常: 类型“FirebaseUser”不是类型“String”的子类型 应用程序正在运行。它进行电话身份验证,然后根据相同的给定条件转到下一页。但当我点击后退按钮时,它抛出异常,在应用程序中也是可见的 这是我的密码 import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutt
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();
}
}
import'包:cloud_firestore/cloud_firestore.dart';
导入“包:firebase_auth/firebase_auth.dart”;
进口“包装:颤振/材料.省道”;
导入“AccountDetialsPage.dart”;
导入“Homepage.dart”;
导入“Phoneverification.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
最终Firestore Firestore=Firestore.instance;
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:未来建设者(
future:getCurrentUser(),
生成器:(上下文,快照){
if(snapshot.connectionState!=connectionState.done){
返回文本(“加载…”);
}
返回流生成器(
流:FirebaseAuth.instance.onAuthStateChanged,
生成器:(BuildContext上下文,快照){
if(snapshot.hasData){
返回流生成器(
溪流:消防商店
.collection('用户')
.文档(快照.数据)
.snapshots(),
生成器:(上下文,快照){
if(snapshot.hasData){
if(snapshot.data[“verified”]==true){
返回主页();
}
否则{
返回AccountDetialsPage();
}
}
否则{
返回文本(“正在加载StreamBuilder”);
}
}
);
}
否则{
返回Phoneverification();
}
},
);
}),
);
}
未来getCurrentUser()异步{
final FirebaseAuth _auth=FirebaseAuth.instance;
最终FirebaseUser用户=等待_auth.currentUser();
最终uid=user.uid;
var number=user.phoneNumber;
返回编号.toString();
}
}
在您的
StreamBuilder
中,您将未来设置为:
stream: FirebaseAuth.instance.onAuthStateChanged,
然后在构建器中使用它从Firestore获取数据,包括:
stream: firestore
.collection('users')
.document(snapshot.data)
.snapshots(),
使用FirebaseUser
调用onAuthStateChanged
侦听器,因此这里的snapshot.data
是FirebaseUser
。因为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();
}
}
}
},
);
}),
上面可能有输入错误,但重要的是这里的第一个
流包含来自Firestore的快照,这些快照基于未来:getCurrentUser()
嗨,弗兰克,感谢您的快速响应。。。但我的要求是首先检查是否有任何用户登录,如果登录,请执行您编写的操作,否则它将执行电话身份验证功能。。。你能帮我一下吗。我的答案的第一部分就是这样做的,并且简单地修复了你得到的错误。是的,但是它会删除我的身份验证。。。我不能用那个密码。。。我不能同时拥有这两件东西吗?第一部分没有删除任何身份验证。它只是纠正了你犯的错误。请再试一次。如果你不能让它工作,编辑你的问题,以显示更新的代码,你在我的答案的第一部分应用了更改。先生,我真的很困惑。。。如果你看我的问题,有一个叫做PhoneVerificationPage的页面,它可以进行电话验证。。请让我知道我将把它放在哪里