作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 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)
。
在花了几个小时之后我对此一无所知。
最佳答案
尝试以下操作
!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) {
}
关于Firebase实时数据库Flutter流永不返回问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70597252/
我是一名优秀的程序员,十分优秀!