如何在 Flutter 中获取嵌套 firebase 数据的所有子数据?

Posted

技术标签:

【中文标题】如何在 Flutter 中获取嵌套 firebase 数据的所有子数据?【英文标题】:How to get all child data on nested firebase data in Flutter? 【发布时间】:2019-07-01 00:46:00 【问题描述】:

我想根据来自 Firebase Auth 的用户 ID 显示所有(嵌套的)Firebase 实时数据库数据。我使用颤振安卓。

我的数据库是这样的:

而我的代码大概是这样的:

home.dart

class _HomePageState extends State<HomePage> 
  List<Todo> _dataList;

  final FirebaseDatabase _database = FirebaseDatabase.instance;

  StreamSubscription<Event> _onTodoAddedSubscription;
  Query _todoQuery;

  @override
  void initState() 
    super.initState();
    _dataList = List();
    _todoQuery = _database.reference().child(widget.userId);
    _onTodoAddedSubscription = _todoQuery.onChildAdded.listen(_onEntryAdded);
  

  @override
  void dispose() 
    _onTodoAddedSubscription.cancel();
    super.dispose();
  

  _onEntryAdded(Event event) 
    setState(() 
      _dataList.add(Todo.fromSnapshot(event.snapshot));
    );
  

  Widget _showTodoList() 
    if (_dataList.length > 0) 
      return ListView.builder(
          shrinkWrap: true,
          itemCount: _dataList.length,
          itemBuilder: (BuildContext context, int index) 
            String todoId = _dataList[index].key;
            bool status = _dataList[index].status;
            int datetime = _dataList[index].datetime;
            double current = _dataList[index].current;
            double voltage = _dataList[index].voltage;
          );
    
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: _showTodoList(),
    );
  

和我的模型类:

tod​​o.dart

class Todo 
  int datetime;
  double current;
  double voltage;
  String key;
  bool status;
  String userId;

  Todo(this.datetime, this.userId, this.status, this.current, this.voltage);

  Todo.fromSnapshot(DataSnapshot snapshot)
      : key = snapshot.key,
        status = snapshot.value["status"],
        datetime = snapshot.value["datetime"],
        current = snapshot.value["current"],
        voltage = snapshot.value["voltage"];

  toJson() 
    return 
      "status": status,
      "datetime": datetime,
      "current": current,
      "voltage": voltage,
    ;
  

我已经做到了。

但是,如果我将数据库更改为这样的内容(添加嵌套子项)怎么办:

如何从用户 id Firebase auth 获取所有子数据?

提前致谢

【问题讨论】:

还没有答案,有人知道吗? 你找到解决方案了吗? @Farhana 不,我只是更改了我的数据库结构,使其更简单。 【参考方案1】:

在构建数据库时,您需要考虑到它必须是扁平结构。如果您将结构更改为第二张图片,则可以执行以下操作:

final FirebaseDatabase _database = FirebaseDatabase.instance;
User currentUser = FirebaseAuth.instance.currentUser;

var ref = _database.reference().child(currentUser.uid);
ref.once().then((DataSnapshot snapshot)
   print(snapshot.value);
   print(snapshot.key);
    snapshot.value.forEach((key,values) 
         print(values);
   );
);

这里首先获取数据库实例并获取当前登录用户,然后使用once()可以获取数据,以便能够访问嵌套的字段然后您必须使用forEach()进行内部迭代datasnapshot

【讨论】:

以上是关于如何在 Flutter 中获取嵌套 firebase 数据的所有子数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中获取嵌套 firebase 数据的所有子数据?

如何在 Flutter 中嵌套 StreamBuilder?

我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]

从flutter中的多个嵌套json数组中获取值

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

Flutter,内部流构建器,如何根据未来获取流?