我想在我的颤振应用程序中从 firebase 数据库中获取当前用户数据

Posted

技术标签:

【中文标题】我想在我的颤振应用程序中从 firebase 数据库中获取当前用户数据【英文标题】:I want to fetch current user data from firebase database in my flutter application 【发布时间】:2020-08-01 10:11:41 【问题描述】:

我的问题是我只想获取当前用户的数据。但下面的代码正在获取我的数据库中存在的所有用户的数据。我怎样才能获取唯一且唯一的当前用户的数据。

    这是我从 firebase 获取数据的代码(我使用的是实时数据库)。 在这个“节点名称”中是存储我的数据的字段。
class ShowDataPage extends StatefulWidget 
  @override
  _ShowDataPageState createState() => _ShowDataPageState();


class _ShowDataPageState extends State<ShowDataPage> 
  List<myData> allData = [];

  @override
  void initState() 
    DatabaseReference ref = FirebaseDatabase.instance.reference();
    ref.child('node-name').once().then((DataSnapshot snap) 
      var keys = snap.value.keys;
      var data = snap.value;
      allData.clear();
      for (var key in keys) 
        myData d = new myData(
          data[key]['name'],
          data[key]['message'],
          data[key]['profession'],
        );
        allData.add(d);
      
      setState(() 
        print('Length : $allData.length');
      );
    );
  
    这是我以“节点名称”的名义将数据上传到 Firebase 的代码。此代码存储在另一个文件中,并且还有另一个必要字段,但这是将我的数据上传到 firebase 的字段。
_sendToServer() 
    if (_key.currentState.validate()) 
      _key.currentState.save();
      DatabaseReference ref = FirebaseDatabase.instance.reference();
      var data = 
        "name": name,
        "profession": profession,
        "message": message,
      ;
      ref.child('node-name').push().set(data).then((v) 
        _key.currentState.reset();
      );
     else 
      setState(() 
        _autovalidate = true;
      );
    
  
    我在 firebase 中的数据库如下所示。

【问题讨论】:

【参考方案1】:

使用用户 uid:

ref.child('node-name').child("M5CCSXQo3Upq5OC7y3lw").once()
.then((DataSnapshot snap) ...

如果您不知道 uid 并且没有使用它,则按名称执行查询。

@override
void initState() 
    FirebaseAuth.instance.currentUser().then((user)
      fetchUser(user);
    );


fetchUser(FirebaseUser user)

  DatabaseReference ref = FirebaseDatabase.instance.reference();
  ref.child('node-name').child(user.uid).once().then((DataSnapshot snap) 
      var keys = snap.value.keys;
      var data = snap.value;
      allData.clear();
      for (var key in keys) 
        myData d = new myData(
          data[key]['name'],
          data[key]['message'],
          data[key]['profession'],
        );
        allData.add(d);
      
      setState(() 
        print('Length : $allData.length');
      );
    );

【讨论】:

参数类型'future string'不能分配给参数类型'string'。当我尝试将当前用户 uid 放入其中时,会出现此错误。实际上,我也使用函数 getUserID() 从 firebase 获取 uid。 只需使用:await 作为 .currentUser() 调用的前缀。或使用:.currentUser().then((user) this.user = user ); 我添加了等待异步,但由于这一切都在 initState 中,所以我无法做到这一点。所以我将所有这些当前代码放在具有异步功能的小部件中,并添加了等待并从 initstate 中调用它。但我似乎没有返回任何东西。正在返回一个空白页。这可能是什么原因 只需在 initState 中使用 .then 版本,然后在 .then 中调用其中包含 FirebaseDatabase 调用的函数。 我更新了答案,应该是类似的。您现在应该能够看到它是如何工作的。还有许多其他方法可以解决这个问题。在这里很难解释。【参考方案2】:

你可以这样使用

...
ref.child('node-name').child('/** current_user_key **/').once()
...

【讨论】:

以上是关于我想在我的颤振应用程序中从 firebase 数据库中获取当前用户数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase数据填充listview

颤振不再接受 firebase 用户命令了吗? [复制]

当我的颤振应用关闭时,如何更新我的 Firebase 数据?

如何在flutter中从firebase实时数据库中获取数据?

如何在我的 firebase 和 flutter 应用上创建实时用户数?

颤振:FlutterFcmService - 致命:找不到回调