运行我的应用程序时出现此异常:
“ FirebaseUser”类型不是“字符串”类型的子类型
该应用正在运行。它进行电话身份验证,然后根据相同的给定条件移至下一页。但是当我按下“后退”按钮时,它也会在应用程序中引发异常,这是可见的。
这是我的代码。
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();
}
}
答案 0 :(得分:0)
在您的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
包含基于future: getCurrentUser()
的Firestore快照。