【发布时间】:2019-07-27 13:52:02
【问题描述】:
这发生在我的主应用程序中 和 我用给定的代码实验室复制它: https://codelabs.developers.google.com/codelabs/flutter-firebase/index.html?index=..%2F..index#10
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Baby Names',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() {
return _MyHomePageState();
}
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Baby Name Votes')),
body: _buildBody(context),
);
}
Widget _buildBody(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('baby').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return LinearProgressIndicator();
return _buildList(context, snapshot.data.documents);
},
);
}
Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot){
return ListView(
padding: const EdgeInsets.only(top: 20.0),
children: snapshot.map((data) => _buildListItem(context, data)).toList(),
);
}
Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
final record = Record.fromSnapshot(data);
return Padding(
key: ValueKey(record.name),
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(5.0),
),
child: ListTile(
title: Text(record.name),
trailing: Text(record.votes.toString()),
onTap: () => print(record),
),
),
);
}
}
class Record {
final String name;
final int votes;
final DocumentReference reference;
Record.fromMap(Map<String, dynamic> map, {this.reference})
: assert(map['name'] != null),
assert(map['votes'] != null),
name = map['name'],
votes = map['votes'];
Record.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, reference: snapshot.reference);
@override
String toString() => "Record<$name:$votes>";
}
我使用的唯一插件是 cloud_firestore 0.9.5+2。请您耐心等待这个测试过程。你不会马上看到问题。首先运行应用程序,设置此项目。您可以按照给定代码实验室中的说明进行操作。一旦在前端和后端设置了所有内容(在 firstore 上创建文档)。去吃午饭、吃晚饭、玩电子游戏或和朋友一起出去玩。 1小时后回来。运行该应用程序,您将因这些读取为新的而产生费用。再做一次,1小时回来,它会再次发生
如何在现实生活中复制它: 通过 codelabs 中的给定代码启动此应用程序。运行它,如果您将 4 个文档存储到 Firestore,它应该会导致 4 个文档读取。
重新启动它。不收取任何阅读费用。太好了!但不,真的没有。
我第二天醒来打开应用程序,我收取了 4 次阅读费用。 好吧,也许发生了一些神奇的事情。我立即重新启动它并且不会产生任何费用(太棒了!)。 1 小时后,我启动应用程序并收取 4 次读取费用,以显示完全没有更改的 4 个文档。
问题是,在应用启动时。它似乎正在从查询快照下载文档。没有对文件进行任何更改。这个流构建器之前已经运行了很多次。
离线模式(飞行模式),缓存数据显示没有问题。
例如,在我的主应用程序中,我有一个 photoUrl,并且在新的应用程序启动时,您可以看到它是从 firestore 加载的(意味着作为新文档下载,因此会产生 READ 费用)。我重新启动我的主应用程序,不收取任何费用,并且照片不刷新(太棒了!)。 1 小时后,我启动应用程序并为我检索到的每个文档收费(没有更改)。
这就是 Cloud Firestore 的行为方式吗? 根据我的阅读,它不应该像这样:(
【问题讨论】:
-
您应该编辑问题以显示相关代码以及查询的实际执行方式,这样我们就可以就您的应用实际执行的操作达成一致,
-
另请记住,Firestore 控制台账单会在您使用时读取。
-
我知道它确实像我注意到的那样。我不再看控制台。我在使用我的应用程序 2 小时后查看。关闭我的应用程序并返回(2 小时后)到控制台查看控制台和 appengine 中的使用情况 我已经为此奋斗了 1 个月,但我认为我需要帮助
-
也感谢您的快速回复。如果您使此代码正常工作并且后端按预期工作。请回复flutter通道、cloudstore插件版本、gradle设置等。我会尝试复制它,然后再次测试后回复
标签: firebase flutter google-cloud-firestore