【问题标题】:How to use UID to acces database in Flutter?Flutter中如何使用UID访问数据库?
【发布时间】:2019-07-10 12:28:54
【问题描述】:

我正在使用以下函数来检索 UID:

  FirebaseAuth auth = FirebaseAuth.instance;

  getUID() async {
    final FirebaseUser user = await auth.currentUser();
    final uid = user.uid;
   return  uid;
  }

之后,我想使用 UID 来访问正确的数据库文档:

return new StreamBuilder(
        stream: Firestore.instance.collection('users').document(getUID()).snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return new Text("Loading");
          }
          var userDocument = snapshot.data;

但我得到了错误

Future<dynamic> is not a subtype of type "string"

正确的做法是什么?

完整代码

class Settings extends StatelessWidget{
  FirebaseAuth auth = FirebaseAuth.instance;

  getUID() async {
    final FirebaseUser user = await auth.currentUser();
    final uid = user.uid;
   return  uid;
  }

  static GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Indstillinger"),
      ),
      body: _buildSetting(context),
    );
  }

  Widget _buildSetting(BuildContext context) {
    return new StreamBuilder(
        stream: Firestore.instance.collection('users').document(getUID()).snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return new Text("Loading");
          }
          var userDocument = snapshot.data;

【问题讨论】:

    标签: dart flutter firebase-authentication


    【解决方案1】:

    你需要使用有状态的小部件,比如

    
    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:firebase_auth/firebase_auth.dart';
    import 'package:flutter/material.dart';
    
    class Settings extends StatefulWidget {
      @override
      _SettingsState createState() {
        return _SettingsState();
      }
    }
    
    class _SettingsState extends State<Settings> {
      FirebaseUser user;
      String error;
    
      void setUser(FirebaseUser user) {
        setState(() {
          this.user = user;
          this.error = null;
        });
      }
    
      void setError(e) {
        setState(() {
          this.user = null;
          this.error = e.toString();
        });
      }
    
      @override
      void initState() {
        super.initState();
        FirebaseAuth.instance.currentUser().then(setUser).catchError(setError);
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Indstillinger"),
          ),
          body: user != null ? _buildSetting(context) : Text("Error: $error"),
        );
      }
    
      Widget _buildSetting(BuildContext context) {
        return new StreamBuilder(
            stream: Firestore.instance.collection('users').document(user.uid).snapshots(),
            builder: (context, snapshot) {
              if (!snapshot.hasData) {
                return new Text("Loading");
              }
              var userDocument = snapshot.data;
              // User userDocument here ..........
              return new Text(userDocument.toString());
            });
      }
    }
    
    
    

    【讨论】:

    • 问题出在 uid 上,我不确定如何从 getUID() 获取到 StreamBuilder
    • user.uid 是用户 ID。只是做事方式不同
    • 哦,没看到,soory ;)
    【解决方案2】:

    您实际上是在没有 awaiting 的情况下传递函数以使其返回。您可以在调用 StreamBuilder 之前将返回值存储在变量中。

    final documentId = await getUID();
    return new StreamBuilder(    
                    stream: Firestore.instance.collection('users').document(documentId).snapshots(),
                    builder: (context, snapshot) {
                      if (!snapshot.hasData) {
                        return new Text("Loading");
                      }
                      var userDocument = snapshot.data;
    

    【讨论】:

    • 这给我留下了另一个问题。 StreamBuilder 位于 Widget 内部。我在“等待”下收到错误。是否可以异步运行小部件?
    猜你喜欢
    • 2020-10-10
    • 2021-02-09
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2017-06-08
    • 2020-10-22
    • 2021-04-22
    • 2020-08-13
    相关资源
    最近更新 更多