Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 即使没有数据更改,Firestore缓存也不工作_Firebase_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

Firebase 即使没有数据更改,Firestore缓存也不工作

Firebase 即使没有数据更改,Firestore缓存也不工作,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,根据,默认情况下,Firestore将文档存储在缓存中并从缓存中加载,只有在有新文档或更改时,Firestore才会以额外的成本再次读取 我正在使用StreamBuilder和FutureBuilder进行测试,我使用了一个打印来显示数据的来源 打印(document.metadata.isFromCache?“非来自网络”:“来自网络”) 即使我使用FutureBuilder(.getDocuments()),第一次打开应用程序时它会打印“来自网络”,第二次它会再次加载“来自网络”,并且数据库

根据,默认情况下,Firestore将文档存储在缓存中并从缓存中加载,只有在有新文档或更改时,Firestore才会以额外的成本再次读取

我正在使用StreamBuilder和FutureBuilder进行测试,我使用了一个打印来显示数据的来源

打印(document.metadata.isFromCache?“非来自网络”:“来自网络”)

即使我使用FutureBuilder(.getDocuments()),第一次打开应用程序时它会打印“来自网络”,第二次它会再次加载“来自网络”,并且数据库没有任何更改,所以看起来缓存只在应用程序真正离线时才起作用,但如果存在连接,它会始终从服务器加载,有人能解释更多吗

参数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']))
          );
        },
      );
    }

彼得的评论是正确的。无论何时调用
.getDocuments(source:source.serverAndCache)
,Firestore都需要对照服务器检查数据是否被修改。由于这需要服务器读取文档,因此您将为这些读取收取费用

如果要强制Firestore从其本地缓存读取,请使用
.getDocuments(source:source.cache)
。这意味着您有显示过时数据的风险,但这是您必须做出的权衡

我通常建议使用
onSnapshot
侦听器,因为它们更适合只将更改从服务器发送到客户端

另外,请查看:


这是正确的行为如果您脱机,将创建本地副本,并且在脱机时完成的任何数据库
写入操作将在您再次联机时同步。但是,数据仍将从服务器检索