【发布时间】:2019-12-23 12:02:15
【问题描述】:
根据Alex Momo's answer,默认情况下,Firestore 将文档存储在缓存中并从那里加载,只有新文档或更改才会再次读取,但需要额外费用。
我正在使用 StreamBuilder 和 FutureBuilder 进行测试,并使用打印来显示数据的来源。
print(document.metadata.isFromCache ? "NOT FROM NETWORK" : "FROM NETWORK");
即使我使用 FutureBuilder (.getDocuments()),第一次打开应用程序时它会打印“FROM NETWORK”,第二次它会再次加载“FROM NETWORK”,并且数据库没有任何变化,所以看起来像缓存仅在应用程序真正离线时才起作用,但似乎如果有连接,它将始终从服务器加载,有人可以解释一下吗?
Source.serverAndCache 参数我认为是默认值,描述中说“导致 Firestore 尝试检索最新的(服务器检索的)快照,但回退如果无法访问服务器,则返回缓存的数据。”,我认为这意味着:您有连接吗?从服务器加载,如果不是?从缓存加载。但这并没有多大帮助,因为每次我们关闭应用程序并重新打开它都会再次从服务器加载所有文档。
FutureBuilder(
future: Firestore.instance.collection("latest").orderBy("date", descending: true)
.getDocuments(source: Source.serverAndCache ),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data.documents.length == null) {
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation(Colors.white),
),
);
} else if(snapshot.data.documents.length == 0) {
return Center(
child: Padding(
padding: const EdgeInsets.only(left: 16, right: 16),
child: Text(
"Sorry but there's no wallpapers for this character yet!",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w300,
),
textAlign: TextAlign.center,
),
)
);
} else {
return GridView.builder(
itemCount: snapshot.data.documents.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: screenHeight / screenWidth * 0.4,
mainAxisSpacing: 1.0,
crossAxisSpacing: 1.0,
),
itemBuilder: (context, index) {
return _buildGrid(snapshot.data.documents[index], index);
}
);
}
}
)
Widget _buildGrid(DocumentSnapshot document, int index) {
print(document.metadata.isFromCache ? "NOT FROM NETWORK" : "FROM NETWORK");
return GestureDetector(
child: Hero(
tag: index,
child: CachedNetworkImage(
imageUrl: document['url'],
errorWidget: (context, url, error) => Icon(Icons.error_outline),
fit: BoxFit.fill,
filterQuality: FilterQuality.low,
),
),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DetailScreen(document['url']))
);
},
);
}
【问题讨论】:
-
这是正确的行为
-
如果您离线,将创建一个本地副本,并且在您离线时完成的任何数据库
write将在您再次在线时同步。但随后仍会从服务器检索数据
标签: firebase flutter dart google-cloud-firestore