微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何知道Firebase中的写入是在服务器上还是仅在缓存中?

如何解决如何知道Firebase中的写入是在服务器上还是仅在缓存中?

我构建了一个Agro App,其中大多数用户注册数据时都脱机,当他们返回中心站点时,他们获得了Internet连接并且数据上升。

但是,用户不清楚他的记录是否已上传到云中,因此我想实现类似于WhatsApp所使用的滴答系统:

  • 写入数据且仅在缓存中时呈灰色勾号

  • 当数据上传到云中并因此可供其他用户使用时,会出现蓝色勾号

我想象的是这样的:

List with gray tick and blue tick depending on whether the data is already on the server

显示列表的过程如下:

Widget _crearListado(BuildContext context,AlimentarBloc alimentarBloc) {

    return Column(
      children: <Widget>[

        Container(
          child: Padding(
            child: StreamBuilder(
                stream: alimentarBloc.alimentarStream,builder: (BuildContext context,AsyncSnapshot<List<AlimentarModel>> snapshot){
                  if (snapshot.hasData) {
                    final alimentarList = snapshot.data;
                    if (alimentarList.length == 0) return _imagenInicial(context);
                    return Container(
                      child: Stack(
                        children: <Widget>[
                          ListView.builder(
                            itemCount: alimentarList.length,itemBuilder: (context,i) =>_crearItem(context,alimentarBloc,alimentarList[i]),],),);
                  } else if (snapshot.hasError) {
                    return Text(snapshot.error.toString());
                  } 
                    return Center (child: Image(image: Assetimage('assets/Preloader.gif'),height: 200.0,));
                },);
  }

  Widget _crearItem(BuildContext context,AlimentarBloc alimentarBloc,AlimentarModel alimentar) { 

      return Stack( 
          alignment: Alignment.centerLeft,children: <Widget>[
            Container(
              child: Card(
                  child: ListTile(
                    leading: Container(,child: Text(" ${alimentar.nombreRefEstanque}"),title: Text('${alimentar.nombreAlimentoFull}'),subtitle: Container(
                      child: Container(
                            child: Text ('$_fechaAlimentar)
                      ),onTap: () => null,trailing: Container(
                      child: Text("${alimentar.consumo),)
            ),);
  }

当数据已经上传到Internet时,您会看到哪些选项来标记数据?我可以这样做吗?

解决方法

不幸的是,Firebase实时数据库在数据快照上没有内置标记来指示它是否已同步到服务器。

实现此类操作的最简单方法是向写入操作添加完成侦听器,并在调用此侦听器时将写入标记为已完成。但是,这仅在应用程序保持活动状态时有效。如果重新启动该应用程序,则稍后将同步您的数据,但不会调用完成处理程序。

如果您也想处理这种情况,可以在应用启动时将标记值写入数据库,并为此添加完成侦听器。写入标记值的完成侦听器后,您将知道服务器之前也处理了所有排队的写操作。

您可以将两种方法结合起来:

  1. 在本地存储中保留一组出色的写操作。
  2. 添加您编写的每个项目的键。
  3. 在调用项目的完成处理程序时,将其删除。
  4. 重新启动他的应用并确认您的标记值后,清除整个列表。

顺便说一句:这是Cloud Firestore(属于Firebase的另一个数据库)具有更好的API的一个区域,因为它有一个hasPendingWrites property来指示快照上是否有挂起的写入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?