如何知道 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 标记来指示它是否已同步到服务器。
实现此类功能的最简单方法是向写入操作添加一个完成侦听器,并在调用此侦听器时将写入标记为已完成。但是,这仅在应用程序保持活动状态时有效。如果应用程序重新启动,您的数据将在稍后同步,但不会调用完成处理程序。
如果您还想处理这种情况,您可以在应用启动时将标记值写入数据库,并为此添加一个完成侦听器。一旦标记值的完成侦听器被写入,您就会知道之前排队的所有写入也由服务器处理。
您可以将这两种方法结合起来:
- 在本地存储中保留一组未完成的写操作。
- 添加您编写的每个项目的密钥。
- 在调用完成处理程序时删除项目的键。
- 当他的应用程序重新启动并确认您的标记值时,清除整个列表。
顺便说一下:这是 Cloud Firestore(属于 Firebase 的另一个数据库)更好的一个领域 API,因为它有一个 hasPendingWrites
property 指示是否有快照上的待处理写入。
我构建了一个 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 标记来指示它是否已同步到服务器。
实现此类功能的最简单方法是向写入操作添加一个完成侦听器,并在调用此侦听器时将写入标记为已完成。但是,这仅在应用程序保持活动状态时有效。如果应用程序重新启动,您的数据将在稍后同步,但不会调用完成处理程序。
如果您还想处理这种情况,您可以在应用启动时将标记值写入数据库,并为此添加一个完成侦听器。一旦标记值的完成侦听器被写入,您就会知道之前排队的所有写入也由服务器处理。
您可以将这两种方法结合起来:
- 在本地存储中保留一组未完成的写操作。
- 添加您编写的每个项目的密钥。
- 在调用完成处理程序时删除项目的键。
- 当他的应用程序重新启动并确认您的标记值时,清除整个列表。
顺便说一下:这是 Cloud Firestore(属于 Firebase 的另一个数据库)更好的一个领域 API,因为它有一个 hasPendingWrites
property 指示是否有快照上的待处理写入。