我在运行应用程序时遇到此异常:
类型"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.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();
}
}
}
},
);
}),
上面可能有拼写错误,但重要的是,这里的第一个stream
包含Firestore基于future: getCurrentUser()
的快照。