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

如何解决此错误类型';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

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

类型“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();

  }
}
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的页面,它可以进行电话验证。。请让我知道我将把它放在哪里