与 firestore 相比,从 firebase 数据库读取数据
read data from firebase database compared to firestore
由于我正在学习的教程使用的是 firestore,因此我尝试使用 firebase 数据库。你能告诉我哪里错了吗,为什么我不能读取我的数据?
以下是 firestore 的教程代码:
static Stream<List<Todo>> readTodos() => FirebaseFirestore.instance
.collection('todo')
.orderBy(TodoField.createdTime, descending: true)
.snapshots()
.transform(Utils.transformer(Todo.fromJson));
变压器方法是这样的:
static StreamTransformer transformer<T>(
T Function(Map<String, dynamic> json) fromJson) =>
StreamTransformer<QuerySnapshot, List<T>>.fromHandlers(
handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
final snaps = data.docs.map((doc) => doc.data()).toList();
final objects = snaps.map((json) => fromJson(json)).toList();
sink.add(objects);
},
);
这是我的 firebase 数据库代码:
static Stream<List<Todo>> readTodos() => FirebaseDatabase.instance
.ref("todo")
.orderByChild(TodoField.createdTime)
.onValue
.map((todo) => todo.snapshot.children
.map((e) => Todo.fromJson(e.value as Map<String, dynamic>))
.toList()
..sort((a, b) => b.createdTime.compareTo(a.createdTime)));
这里是 streambuilder:
StreamBuilder<List<Todo>>(
stream: FirebaseApi.readTodos(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
default:
if (snapshot.hasError) {
return buildText('Something Went Wrong Try later');
} else {
final todos = snapshot.data;
TodosController todosController = Get.find();
todosController.setTodos(todos);
return TodoListWidget();
}
}
},
),
这是我的数据结构:
因此,由于文本是“出了点问题,稍后再试”,我假设错误来自正确的地方。请让我知道或分享正确的代码,非常感谢!
问题二:
也请告诉我我是否正确地按 createdTime 对待办事项进行排序,因为对于 firebase 只允许升序,谢谢!(我想为答案付费,因为我真的问了很多,如果堆栈,解决方案总是节省我的时间溢出有这个功能)
如果您的 AsyncSnapshot
中有错误,您应该显示该错误的内容以了解导致问题的原因:
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
default:
if (snapshot.hasError) {
print('Error: ${snapshot.error}; //
return buildText('Something Went Wrong Try later');
} else {
由于我正在学习的教程使用的是 firestore,因此我尝试使用 firebase 数据库。你能告诉我哪里错了吗,为什么我不能读取我的数据?
以下是 firestore 的教程代码:
static Stream<List<Todo>> readTodos() => FirebaseFirestore.instance
.collection('todo')
.orderBy(TodoField.createdTime, descending: true)
.snapshots()
.transform(Utils.transformer(Todo.fromJson));
变压器方法是这样的:
static StreamTransformer transformer<T>(
T Function(Map<String, dynamic> json) fromJson) =>
StreamTransformer<QuerySnapshot, List<T>>.fromHandlers(
handleData: (QuerySnapshot data, EventSink<List<T>> sink) {
final snaps = data.docs.map((doc) => doc.data()).toList();
final objects = snaps.map((json) => fromJson(json)).toList();
sink.add(objects);
},
);
这是我的 firebase 数据库代码:
static Stream<List<Todo>> readTodos() => FirebaseDatabase.instance
.ref("todo")
.orderByChild(TodoField.createdTime)
.onValue
.map((todo) => todo.snapshot.children
.map((e) => Todo.fromJson(e.value as Map<String, dynamic>))
.toList()
..sort((a, b) => b.createdTime.compareTo(a.createdTime)));
这里是 streambuilder:
StreamBuilder<List<Todo>>(
stream: FirebaseApi.readTodos(),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
default:
if (snapshot.hasError) {
return buildText('Something Went Wrong Try later');
} else {
final todos = snapshot.data;
TodosController todosController = Get.find();
todosController.setTodos(todos);
return TodoListWidget();
}
}
},
),
这是我的数据结构:
因此,由于文本是“出了点问题,稍后再试”,我假设错误来自正确的地方。请让我知道或分享正确的代码,非常感谢!
问题二: 也请告诉我我是否正确地按 createdTime 对待办事项进行排序,因为对于 firebase 只允许升序,谢谢!(我想为答案付费,因为我真的问了很多,如果堆栈,解决方案总是节省我的时间溢出有这个功能)
如果您的 AsyncSnapshot
中有错误,您应该显示该错误的内容以了解导致问题的原因:
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
default:
if (snapshot.hasError) {
print('Error: ${snapshot.error}; //
return buildText('Something Went Wrong Try later');
} else {