伙计们,我在这里确实有一个有趣的问题,如果你们中的任何人能够帮助我,我会非常高兴。
我的应用流程是什么:
就是这样,这就是我所有的基本逻辑,据我所知,你怎么看我没有从数据库中读取任何信息。
现在......问题是,由于一些奇怪的原因,当我注册我的用户时,我要去firebase控制台查看我的数据库的使用情况,我会看到类似......对于创建的一个用户,我将有 1 次写入(正如我预期的那样很好),但也有13-20 次从 DB 读取。
现在这就是我的问题,为什么我在进行身份验证和写入时会阅读firestorm?
这是我现在正在使用的数据库代码。
class DatabaseFirebase implements BaseDataBase {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final FirebaseStorage _storage = FirebaseStorage.instance;
FirebaseUser _firebaseUser;
Firestore _firestore = Firestore.instance;
@override
Future<String> login(String email, String password) async {
_firebaseUser = await _firebaseAuth.signInWithEmailAndPassword(
email: email, password: password);
return _firebaseUser.uid;
}
@override
Future<String> register(String email, String password) async {
_firebaseUser = await _firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
return _firebaseUser.uid; …Run Code Online (Sandbox Code Playgroud) dart firebase firebase-authentication flutter google-cloud-firestore
在我的应用程序中,我使用来自 Firebase 的数据构建了一个对象列表。在 StreamBuilder 中,我检查快照是否有数据。如果没有,我将返回一个带有“正在加载...”的简单文本小部件。我的问题是,如果我转到应用程序中的另一个页面,然后再回来,您会在一瞬间看到屏幕中间显示“正在加载...”,这有点烦人。我很确定它正在从 Firebase 下载数据,并在我每次返回该页面时构建小部件。如果我不检查数据,它会给我一个我试图从 null 访问数据的数据。
有没有办法缓存已经下载的数据,如果来自 Firebase 的数据没有变化,那么就使用缓存的数据?
这是我的代码的编辑版本:
class Schedule extends StatefulWidget implements AppPage {
final Color color = Colors.green;
@override
_ScheduleState createState() => _ScheduleState();
}
class _ScheduleState extends State<Schedule> {
List<Event> events;
List<Event> dayEvents;
int currentDay;
Widget itemBuilder(BuildContext context, int index) {
// Some Code
}
@override
Widget build(BuildContext context) {
return Center(
child: StreamBuilder(
stream: Firestore.instance.collection('events').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Text("Loading...");
}
events = new List(snapshot.data.documents.length);
for (int i …Run Code Online (Sandbox Code Playgroud) 我正在我的一个应用程序中实现 Firestore 数据存储。
我有一个监听器,它跟踪“日志”集合中的更新,如下所示:
db.collection("logs").addSnapshotListener({ (snapshot, error) in
guard let s = snapshot else {return}
if s.metadata.isFromCache {
print("LOG_C \(s.documentChanges.count)")
return
}
print("LOG \(s.documentChanges.count)")
// other code
})
Run Code Online (Sandbox Code Playgroud)
在测试期间,我一直在将文档上传到此集合,然后通过 Firebase 控制台删除了所有文档。所以,现在,我的测试用户不存在该集合。当我第一次启动应用程序时,我确实看到这个集合是空的——监听器报告了正确的结果。
但是,这样做会消耗大约 1000 次读取。几乎感觉就像是在为我的测试用户下载此集合的所有历史记录(例如,插入了 500 个文档,删除了 500 个文档)。但是,即使是这样,它也不会向我报告——我在控制台中只收到一条“LOG 0”消息。
这是集合侦听器的工作方式吗?我确实知道侦听器下载初始状态,但我认为它将是当前快照,在这种情况下,它将消耗 1 次读取以确定最初没有任何返回。
欢迎任何解释/想法/建议。
我非常想通过查看详细的 Firestore 读取日志来调试它。但是,我在控制台中找不到这样的选项:(
我是 Firestore 的新手,所以我有一个 Profiles 和 Users 集合。在 Cloud Firestore 控制台中,当我单击数据库 > Firestore > 数据选项卡 > 配置文件或 > 用户时,控制台正在读取每个集合中的所有文档。这些读取在“使用”选项卡中进行计数。所以我的问题是,如果我在 Profiles 集合中有 500K 个文档并单击 Data,我将被收取阅读 500K 文档的费用,只是为了查看前 25 个文档。只需单击“数据”选项卡,控制台就会读取第一个集合的所有文档。
我尝试使用过滤器,但要使用它,您必须先单击集合并阅读所有文档,然后才能编辑过滤器。
这是它的工作方式还是我的误解?