问题描述
我构建了一个Agro App,其中大多数用户在注册数据时都脱机,当他们返回中心站点时,他们获得了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),)
),);
}
当数据已经上传到Internet时,您会看到哪些选项来标记数据?我可以这样做吗?
解决方法
不幸的是,Firebase实时数据库在数据快照上没有内置标记来指示它是否已同步到服务器。
实现此类操作的最简单方法是向写入操作添加完成侦听器,并在调用此侦听器时将写入标记为已完成。但是,这仅在应用程序保持活动状态时有效。如果重新启动该应用程序,则稍后将同步您的数据,但不会调用完成处理程序。
如果您也想处理这种情况,可以在应用启动时将标记值写入数据库,并为此添加完成侦听器。写入标记值的完成侦听器后,您将知道服务器之前也处理了所有排队的写操作。
您可以将两种方法结合起来:
- 在本地存储中保留一组出色的写操作。
- 添加您编写的每个项目的键。
- 在调用项目的完成处理程序时,将其删除。
- 重新启动他的应用并确认您的标记值后,清除整个列表。
顺便说一句:这是Cloud Firestore(属于Firebase的另一个数据库)具有更好的API的一个区域,因为它有一个hasPendingWrites
property来指示快照上是否有挂起的写入。