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');
}
我正在尝试从 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');
}