【问题标题】:cannot fetch data from Firebase database无法从 Firebase 数据库中获取数据
【发布时间】:2021-10-25 11:53:08
【问题描述】:

我已经这样做了,但它告诉我 class bool has no instance methood [] reciver null 试过 调用[]确定

class Test7 extends StatefulWidget {
  @override
  _Test7State createState() => _Test7State();
}

class _Test7State extends State<Test7> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.deepPurple,
      appBar: AppBar(),
      body:  SingleChildScrollView(
        child: Flexible(
          child: FirebaseAnimatedList(
            shrinkWrap: true,
            query: FirebaseDatabase.instance.reference().child(currentUser.uid), // when i remove child(currentUser.uid)it is work !
            itemBuilder: (BuildContext context, DataSnapshot snapshot,Animation<double> animation,  int index) {
              return ListTile(
                leading: IconButton(
                  onPressed: () {  },
                  icon: Icon(Icons.ac_unit),
                ),
                title: Text(snapshot.value["ok"]),
              );
            },),
        ),
      ),
    );
  }
}

我在 Firebase 数据库中有这个实时

    NUuhYzfVS9YPYDIox3X6ozhzFiT2
activity: true
ok: "ok"

【问题讨论】:

    标签: flutter dart firebase-realtime-database zip


    【解决方案1】:

    FirebaseAnimatedList 显示您在query 中指定的数据库路径下的子节点列表。如果您在该路径中指定 UID,您最终会得到以下两个子节点:

    activity: true
    ok: "ok"
    

    所以你的itemBuilder 被调用了两次:一次是activity: true,一次是ok: "ok"。然后,当您在该 snapshot 上调用 snapshot.value["ok"] 时,不再有这样的 child 属性。

    底线:FirebaseAnimatedList 仅在您显示用户列表时才有意义。当您显示特定用户时,您不能在 FirebaseAnimatedList 中显示它,您通常希望在 Text 小部件中显示它,使用(例如)FutureBuilder

    FutureBuilder(
      future: FirebaseDatabase.instance.reference().child(currentUser.uid).get(),
      builder:
          (BuildContext context, AsyncSnapshot snapshot) {
    
        if (snapshot.hasError) {
          return Text("Something went wrong");
        }
    
        if (snapshot.hasData && !snapshot.data!.exists) {
          return Text("Document does not exist");
        }
    
        if (snapshot.connectionState == ConnectionState.done) {
          return Text(snapshot.data.value["ok"]);
        }
    
        return Text("loading");
      },
    

    【讨论】:

    • 非常感谢这个很棒的答案,我也可以使用 Database into stream.builder 代替未来吗?
    • 我只是忘了标记答案,对不起,我尝试了这个流:FirebaseDatabase.instance.reference().child("uid).snapshot(),但如果你给我小,它会给出错误在最后一个答案中如何将其变为流而不是未来的示例将不胜感激,我只是 Firebase 的新手,我知道您回答了如何使用流,但是通过示例我可以了解更多
    • 没有snapshot方法,但是有on...属性暴露了Streams,比如onValue。见pub.dev/documentation/firebase_database/latest/…,可能还有一些:google.com/search?q=flutter+firebase+onvalue,甚至google.com/search?q=flutter+firebase+onvalue+streambuilder
    • 非常感谢 Mr.puf,我真的很感激
    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多