【问题标题】:Firebase RealTime database Flutter stream never returns problemFirebase RealTime 数据库 Flutter 流从不返回问题
【发布时间】:2022-01-05 17:39:05
【问题描述】:

我正在尝试从 Firebase 中的实时数据库中读取对象列表,但到目前为止没有成功。

我在以下链接上关注 Firecasts 的官方教程: https://www.youtube.com/watch?v=sXBJZD0fBa4

数据库如下所示:

这是我写的代码:

以下是我为将从数据库中读取的对象创建的类:

class TestData {
  final String name;
  final String surname;
  final String age;

  TestData({
    required this.name,
    required this.surname,
    required this.age,
  });

  factory TestData.fromRTDB(Map<dynamic, dynamic> data) {
    return TestData(
      name: data["Name"],
      surname: data["Surname"],
      age: data["Age"],
    );
  }
}

这是我尝试从数据库中读取它的方法:

class TestDataGetter {
  final _db = FirebaseDatabase.instance.ref();

  Stream<List<TestData>> getTestDataStream() {
    final csPostprocessedStream = _db.child("test_data/").onValue;
    var streamToPublish = csPostprocessedStream.map((event) {
      final testDataMap = Map<dynamic, dynamic>.from(
          event.snapshot.value as Map<dynamic, dynamic>);

      final testDataList = testDataMap.entries.map((element) {
        return TestData.fromRTDB(Map<dynamic, dynamic>.from(element.value));
      }).toList();
      return testDataList;
    });
    return streamToPublish;
  }
}

这是我要显示数据的屏幕:

class TestDataScreen extends StatelessWidget {
  const TestDataScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          StreamBuilder(
              stream: TestDataGetter().getTestDataStream(),
              builder: (context, snapshot) {
                if (!snapshot.hasData) {
                  print("Waiting");
                  return const CircularProgressIndicator(color: Colors.white);
                } else if (snapshot.hasError) {
                  print("Error occured...");
                  return const CircularProgressIndicator(color: Colors.white);
                } else {
                  final testDataList = snapshot.data as List<TestData>;
                  return Text(
                      testDataList[0].name + " / " + testDataList[1].name,
                      style: Theme.of(context).textTheme.headline3,
                      textAlign: TextAlign.center);
                }
              }),
        ],
      ),
    );
  }
}

但我永远看不到屏幕上的数据。纺车是我唯一看到的东西,在控制台上我看到打印输出为“等待”(因为我在上面的代码中打印出这个文本)。

卡在if (!snapshot.hasData)

花了几个小时后我一无所知。

【问题讨论】:

    标签: firebase flutter dart firebase-realtime-database stream-builder


    【解决方案1】:

    试试下面的

    !snapshot.hasData || snapshot.data.documents.isEmpty
    

    这里的问题是,当查询没有返回文档时,snapshots() 也会返回一个 QuerySnapshot。因此,您可以像这样扩展您的条件:

    这是我应该帮助你的东西

    if (snapshot.hasError) {
                //TODO: we need to make sure we caputer this error message snapshot.error
                return const PlaceHolder(
                  url: 'assets/animations/404-error.json',
                  message: ErrorMessages.getDogsError,
                );
              } else if (snapshot.data == null || snapshot.data!.isEmpty) {
                return const PlaceHolder(
                  url: 'assets/animations/no-dog-animation.json',
                  message: AppMessages.noDogMessage,
                );
              } else if (!snapshot.hasData) {
    }
    

    【讨论】:

    • 实时数据库中有“文档”。文档属于 Firestore 的世界。或者,我对您的答案的解释有误吗?
    • 检查文档可能是数据,我停止使用实时数据库,因为它并没有真正得到处理。但我认为您只需要检查返回的快照是否正在返回但为空
    • 现在检查我添加我的代码作为示例可能会对您有所帮助
    • 谢谢。在检查是否有任何数据之前,您需要检查是否有任何错误。我刚刚离开了几天,现在通过首先检查错误消息返回并再次运行它并且它起作用了。我不知道这次是什么让它起作用了,bcz 只是先检查错误消息不应该让它起作用,但它恰好是这种情况。
    【解决方案2】:

    你的问题是你很可能有一个错误。
    问题是,您的错误处理实际上从未达到,因为如果出现错误,!hasData 仍然是正确的

    您可能希望在 之前 !hasData 执行hasError 条件:

    if (snapshot.hasError) {
      return Text('error');
    } else if (!snapshot.hasData) {
      return Text('loading');
    } else {
      return Text('data');
    }
    

    【讨论】:

    • 谢谢。在检查是否有任何数据之前,您需要检查是否有任何错误。我刚刚离开了几天,现在通过首先检查错误消息返回并再次运行它并且它起作用了。我不知道这次是什么让它起作用了,bcz 只是先检查错误消息不应该让它起作用,但它恰好是这种情况。
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 2021-06-07
    • 2020-03-25
    • 2021-07-01
    • 2021-04-09
    • 2019-04-10
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多