Firebase 即使没有数据更改,Firestore缓存也不工作
根据,默认情况下,Firestore将文档存储在缓存中并从缓存中加载,只有在有新文档或更改时,Firestore才会以额外的成本再次读取 我正在使用StreamBuilder和FutureBuilder进行测试,我使用了一个打印来显示数据的来源 打印(document.metadata.isFromCache?“非来自网络”:“来自网络”)强> 即使我使用FutureBuilder(.getDocuments()),第一次打开应用程序时它会打印“来自网络”,第二次它会再次加载“来自网络”,并且数据库没有任何更改,所以看起来缓存只在应用程序真正离线时才起作用,但如果存在连接,它会始终从服务器加载,有人能解释更多吗 参数Source.serverAndCache我认为是默认值,描述中说“会导致Firestore尝试检索最新(服务器检索到的)快照,但如果无法访问服务器,则返回返回缓存数据。”,我认为这意味着:您有连接吗?是否从服务器加载?从缓存加载。但这并没有多大帮助,因为每次我们关闭并重新打开应用程序时,它都会再次从服务器加载所有文档Firebase 即使没有数据更改,Firestore缓存也不工作,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,根据,默认情况下,Firestore将文档存储在缓存中并从缓存中加载,只有在有新文档或更改时,Firestore才会以额外的成本再次读取 我正在使用StreamBuilder和FutureBuilder进行测试,我使用了一个打印来显示数据的来源 打印(document.metadata.isFromCache?“非来自网络”:“来自网络”) 即使我使用FutureBuilder(.getDocuments()),第一次打开应用程序时它会打印“来自网络”,第二次它会再次加载“来自网络”,并且数据库
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']))
);
},
);
}
彼得的评论是正确的。无论何时调用
.getDocuments(source:source.serverAndCache)
,Firestore都需要对照服务器检查数据是否被修改。由于这需要服务器读取文档,因此您将为这些读取收取费用
如果要强制Firestore从其本地缓存读取,请使用.getDocuments(source:source.cache)
。这意味着您有显示过时数据的风险,但这是您必须做出的权衡
我通常建议使用onSnapshot
侦听器,因为它们更适合只将更改从服务器发送到客户端
另外,请查看:
写入操作将在您再次联机时同步。但是,数据仍将从服务器检索