如何解决此错误类型“ FirebaseUser”不是类型“ String”的子类型?

时间:2020-08-08 16:22:50

标签: firebase flutter dart firebase-authentication

运行我的应用程序时出现此异常:

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

  }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

在您的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包含基于future: getCurrentUser()的Firestore快照。