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

How to know if the writes in Firebase are on the server or only cached?

我构建了一个 Agro 应用程序,其中大多数用户在注册数据时处于离线状态,当他们 return 访问中央站点时,他们获得了 Internet 连接并且数据开始增加。

但是,用户并不清楚他的记录是否上传到云端,所以我想实现一个类似于WhatsApp使用的滴答系统:

我想象的是这样的:

我显示列表的过程如下:

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

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

遗憾的是,Firebase 实时数据库在数据快照上没有 built-in 标记来指示它是否已同步到服务器。

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

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

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

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

顺便说一下:这是 Cloud Firestore(属于 Firebase 的另一个数据库)更好的一个领域 API,因为它有一个 hasPendingWrites property 指示是否有快照上的待处理写入。