【发布时间】:2020-08-13 21:50:48
【问题描述】:
我正在尝试使用模型将 Firebase 实时数据库中的数据检索到 Flutter 中的列表中。当我这样做时,我的列表返回为空。我已经阅读了其他几篇关于在 Flutter 中使用 Firebase 的文章,但还没有找到明确的答案。这是我目前的方法(该对象称为“需求”,我正在尝试检索并显示需求列表):
型号:
import 'package:firebase_database/firebase_database.dart';
class Need {
final String id;
final String imageUrl;
final String caption;
final String title;
Need({
this.id,
this.imageUrl,
this.caption,
this.title,
});
Need.fromSnapshot(DataSnapshot snapshot) :
id = snapshot.key,
imageUrl = snapshot.value["imageUrl"],
caption = snapshot.value["caption"],
title = snapshot.value["postTitle"];
toJson() {
return {
"imageUrl": imageUrl,
"caption": caption,
"title": title,
};
}
}
带有 Firebase 查询的数据库服务:
import 'package:firebase_database/firebase_database.dart';
import 'package:Given_Flutter/models/need_model.dart';
class DatabaseService {
static Future<List<Need>> getNeeds() async {
Query needsSnapshot = await FirebaseDatabase.instance
.reference()
.child("needs-posts")
.orderByKey();
print(needsSnapshot); // to debug and see if data is returned
List<Need> needs;
Map<dynamic, dynamic> values = needsSnapshot.data.value;
values.forEach((key, values) {
needs.add(values);
});
return needs;
}
}
列表视图:
import 'package:flutter/material.dart';
import 'package:Given_Flutter/models/need_model.dart';
import 'package:Given_Flutter/services/database_service.dart';
import 'package:Given_Flutter/need_view.dart';
class Needs extends StatefulWidget {
static final String id = 'needs_screen';
@override
_NeedsState createState() => _NeedsState();
}
class _NeedsState extends State<Needs> {
List<Need> _needs = [];
@override
void initState() {
super.initState();
_setupNeeds();
}
_setupNeeds() async {
List<Need> needs = await DatabaseService.getNeeds();
setState(() {
_needs = needs;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: RefreshIndicator(
onRefresh: () => _setupNeeds(),
child: ListView.builder(
itemCount: _needs.length,
itemBuilder: (BuildContext context, int index) {
Need need = _needs[index];
return NeedView(
need: need,
);
}
)
)
);
}
}
Firebase 实时数据库结构:
我做错了什么?
【问题讨论】:
-
你的调试打印输出什么?
-
@GrahamD 这行显示错误: Map
values = needsSnapshot.data.value;错误:没有为类 'Query' 定义 getter 'data'。 -
@GrahamD 我已尝试删除该行和以下 forEach 循环,以专注于我是否从 Firebase 获取数据。当我这样做时,调试日志从不打印快照数据,即使我有一个打印行。我不知道是因为该部分没有被执行还是快照为空。相反,调试日志显示错误“在 null 上调用了 getter 'length'。”,这是有道理的,因为返回到 ListView 的需求列表是空的。
-
尝试在代码行中使用 needsSnapshot.value 而不是 needsSnapshot.data.value: Map
values = needsSnapshot.data.value;我建议你把更多的印刷声明作为战略要点,看看你实际得到了什么。我不认为你可以打印快照,你只会得到快照的实例,你必须打印它的属性,例如。 .key, .value
标签: firebase flutter firebase-realtime-database dart