Firebase 实时数据库 Flutter 流从来没有 returns 问题

Firebase RealTime database Flutter stream never returns problem

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

我正在按照 Firecasts 的官方教程进行以下 link: https://www.youtube.com/watch?v=sXBJZD0fBa4

这是数据库的样子:

这是我写的代码:

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

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)

花了几个小时在这上面我一无所知。

尝试以下方法

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

这里的问题是当查询 return 没有文件时,snapshots() 也会 return 一个 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) {
}

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

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

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