【问题标题】:How do I print a list from a Firebase Database query using Flutter?如何使用 Flutter 从 Firebase 数据库查询中打印列表?
【发布时间】:2020-08-19 10:16:20
【问题描述】:

我正在尝试从我的 firebase 数据库中打印属性列表。数据库目前的结构如下:

我首先想将节目名称列表打印到控制台,以便我可以看到它可以工作,然后稍后将其添加到 ListView。任何帮助表示赞赏!

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

// This is the model class
class Mod {
  final String name;
  final String nextEpisode;
  final String prevEpisode;

  Mod(this.name, this.nextEpisode, this.prevEpisode);

  Mod.fromJson(Map<String, dynamic> json)
    : name = json['name'],
      nextEpisode = json['nextEpisode'],
      prevEpisode = json['prevEpisode'];
}


// This is the screen class
class FTest2 extends StatefulWidget {
  @override
  _FTest2State createState() => _FTest2State();
}

class _FTest2State extends State<FTest2> {

  List<Mod> list = List();

  MakeCall() {
    final mainReference = FirebaseDatabase.instance.reference();
    mainReference.child('-M5Uol7Xldnc8wvNXnNg').once().then((DataSnapshot dataSnapshot){
      this.setState(() {
        for(var value in dataSnapshot.value){
          list.add(Mod.fromJson(value));
        }
      });
    });
    print(list);
  }

  void getData() {
    MakeCall();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text('This is App Bar for the FB Test')),
        body: Column(
          children: <Widget>[
            RaisedButton(
              child: Text('Press for data'),
              onPressed: () {
                getData();
              },
            ),
          ],
        ));
  }
}

【问题讨论】:

  • 你分享的代码有什么问题?
  • 首先,我在数据库中缺少对“显示”的引用。修复后,我将返回一个空列表。理想情况下,我想返回所有不同节目名称的列表。有什么想法吗?

标签: firebase flutter dart firebase-realtime-database


【解决方案1】:

您正在循环某个特定节目的节点,这意味着您的value 实际上是该节目下的子属性之一:namenextEpisodeprevEpisode。您可能正在寻找的是收听所有节目的onChildAdded,然后为每个节目获取name 属性:

mainReference.child('shows')
  .onChildAdded
  .forEach((event) => {
    print(event.snapshot.key+": "+event.snapshot.value.toString());
    this.setState(() {
      list.add(Mod.fromJson(event.snapshot.value["name"]));
    });
  });

几周前也可以在这里查看我的答案:Flutter: Firebase Real-Time database orderByChild has no impact on query result

【讨论】:

    【解决方案2】:

    你的引用错误,你需要从顶部遍历数据库到你要检索的节点,所以使用如下:

    final mainReference = FirebaseDatabase.instance.reference("shows");
    mainReference.child('-M5Uol7Xldnc8wvNXnNg').once().then((DataSnapshot dataSnapshot){
    

    将参数shows 传递给reference() 方法。

    【讨论】:

    • 感谢您回复我。这会返回一个错误:``` final mainReference = FirebaseDatabase.instance.reference("shows"); ``` 这将返回一个空列表: ``` final mainReference = FirebaseDatabase.instance.reference().child('shows'); mainReference.once().then((DataSnapshot dataSnapshot){ ``` 这返回 '_InternalLinkedHashMap' 不是类型 'Iterable' 的子类型 ``` final mainReference = FirebaseDatabase.instance.reference( ).child('shows'); mainReference.child('-M5Uol7Xldnc8wvNXnNg').once().then((DataSnapshot dataSnapshot){ ```
    • @Stridermn 请使用单个反引号标记 cmets 中的代码。
    • 我睡着了,现在醒了,无论如何检查@FrankvanPuffelen 的答案
    猜你喜欢
    • 2020-08-01
    • 2020-12-11
    • 2020-08-23
    • 1970-01-01
    • 2020-01-21
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多