使用API REST Firebase和Flatter的脱机持久性
我正在开发一个Agro应用程序,当我观看Firebase推广视频时,我非常喜欢他们描述应用程序工作的方式,即使没有互联网(离线持久性) 要开发我的应用程序,我使用了:使用API REST Firebase和Flatter的脱机持久性,firebase,flutter,dart,firebase-realtime-database,sdk,Firebase,Flutter,Dart,Firebase Realtime Database,Sdk,我正在开发一个Agro应用程序,当我观看Firebase推广视频时,我非常喜欢他们描述应用程序工作的方式,即使没有互联网(离线持久性) 要开发我的应用程序,我使用了: 飘动 Firebase API REST(http插件) 提供者向API发出请求 集团模式 我已经实际完成了应用程序,但我注意到,当没有internet时,会出现一个错误: SocketException:主机查找失败:“node1.bitcoin.com”(操作系统错误:没有与主机名关联的地址,errno=7) @Ishwa
- 飘动
- Firebase API REST(http插件)
- 提供者向API发出请求
- 集团模式
import 'dart:convert';
import 'package:aplians_fish/src/preferencias_usuario/preferencias_usuario.dart';
import 'package:http/http.dart' as http;
import 'package:aplians_fish/src/models/alimentar_model.dart';
class AlimentarProvider {
final String _url ='https://apliansdb.firebaseio.com';
final _prefs = new PreferenciasUsuario();
// ==========================================================
// ======================== CREATE ==========================
// ==========================================================
Future<bool> crearAlimentar(AlimentarModel alimentar, String idEmpresa, String idEstanque) async {
final url ='$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion.json?auth=${_prefs.token}';
final resp = await http.post(url, body: alimentarModelToJson(alimentar));
final decodedData = json.decode(resp.body); // Da la respuesta, sea un cargue o un error
print(decodedData);
return true;
}
// ==========================================================
// ================== READ =====================
// ==========================================================
Future<List<AlimentarModel>> cargarAlimentar(String idEmpresa, String idEstanque) async {
final url ='$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion.json?auth=${_prefs.token}';
final resp = await http.get(url);
final Map<String, dynamic> decodedData = json.decode(resp.body);
final List<AlimentarModel> alimentar = new List();
if (decodedData == null) return [];
if (decodedData['error'] != null) return [];
decodedData.forEach((id, alim){
final temp = AlimentarModel.fromJson(alim);
temp.idAlimentar = id;
alimentar.add(temp);
});
return alimentar;
}
// ==========================================================
// =========================== UPDATE =======================
// ==========================================================
Future<bool> editarAlimentar(String idEmpresa, String idEstanque, AlimentarModel alimentar) async {
final url = '$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion/${alimentar.idAlimentar}.json?auth=${_prefs.token}';
final resp = await http.put(url, body: alimentarModelToJson(alimentar));
final decodedData = json.decode(resp.body);
print(decodedData);
return true;
}
// ==========================================================
// ================== DELETE =======================
// ==========================================================
Future<bool> borrarAlimentar(String idEmpresa, String idEstanque, String id) async {
final url = '$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion/$id.json?auth=${_prefs.token}';
final resp = await http.delete(url);
print(json.decode(resp.body));
return true;
}
}
导入'dart:convert';
进口“包装:aplians_fish/src/preferencias_usuario/preferencias_usuario.dart”;
将“package:http/http.dart”导入为http;
进口“包装:aplians_fish/src/models/alimentar_model.dart”;
食品供应商{
最后一个字符串https://apliansdb.firebaseio.com';
最终_prefs=新的首选项;
// ==========================================================
//=====================================创建==========================
// ==========================================================
Future crearAlimentar(AlimenterModel alimentar、String idEmpresa、String idEstanque)异步{
最终url='$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion.json?auth=${u prefs.token}';
final resp=wait http.post(url,body:alimentarModelToJson(alimentar));
final decodedata=json.decode(resp.body);//Da la respuesta,sea un cargue o un error
打印(解码数据);
返回true;
}
// ==========================================================
//============================读取=====================
// ==========================================================
Future cargarAlimentar(字符串idEmpresa、字符串idEstanque)异步{
最终url='$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion.json?auth=${u prefs.token}';
final resp=wait http.get(url);
最终映射decodedData=json.decode(分别为主体);
最终清单食品=新清单();
if(decodedData==null)返回[];
if(decodedData['error']!=null)返回[];
decodedData.forEach((id,alim){
最终温度=AlimentarModel.fromJson(alim);
温度idAlimentar=id;
食品添加剂(温度);
});
归还食物;
}
// ==========================================================
//=====================================更新=======================
// ==========================================================
Future editarAlimentar(字符串idEmpresa、字符串idEstanque、AlimentarModel alimentar)异步{
最终url='$\u url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion/${alimentar.idAlimentar}.json?auth=${{u prefs.token}';
final resp=wait http.put(url,body:alimentarModelToJson(alimentar));
final decodedData=json.decode(分别为正文);
打印(解码数据);
返回true;
}
// ==========================================================
//============================删除=======================
// ==========================================================
Future BorraAlimentar(字符串idEmpresa、字符串idEstanque、字符串id)异步{
最终url='$_url/empresas/$idEmpresa/estanques/$idEstanque/loteActual/alimentacion/$id.json?auth=${u prefs.token}';
final resp=等待http.delete(url);
打印(json.decode(resp.body));
返回true;
}
}
这就是我使用BLOC的方式:
import 'package:rxdart/rxdart.dart';
import 'package:aplians_fish/src/models/alimentar_model.dart';
import 'package:aplians_fish/src/providers/alimentar_provider.dart';
class AlimentarBloc {
final _alimentarController = new BehaviorSubject<List<AlimentarModel>>();
final _cargandoController = new BehaviorSubject<bool>();
final _alimentarProvider = new AlimentarProvider();
Stream <List<AlimentarModel>> get alimentarStream => _alimentarController.stream;
Stream <bool> get cargando => _cargandoController.stream;
Future<List<AlimentarModel>> cargarAlimentar(String idEmpresa, String idEstanque) async {
final alimentar = await _alimentarProvider.cargarAlimentar(idEmpresa, idEstanque);
// ahora hay que insertar estos productos al stream...
_alimentarController.sink.add(alimentar);
return alimentar;
}
Future<bool> crearAlimentar(AlimentarModel alimentar, String idEmpresa, String idEstanque) async {
_cargandoController.sink.add(true);
await _alimentarProvider.crearAlimentar(alimentar, idEmpresa, idEstanque);
_cargandoController.sink.add(false); //este es útil para bloquear botones cuando se esté cargando
// esto se hace para notificar que está cargando el producto y de esa forma espere
return true;
}
void editarAlimentar(String idEmpresa, String idEstanque, AlimentarModel alimentar) async {
_cargandoController.sink.add(true);
await _alimentarProvider.editarAlimentar(idEmpresa, idEstanque, alimentar);
_cargandoController.sink.add(false);
// esto se hace para notificar que está cargando el producto y de esa forma espere
}
Future<bool> borrarAlimentar(String idEmpresa, String idEstanque, String id) async {
// _cargandoController.sink.add(true);
await _alimentarProvider.borrarAlimentar(idEmpresa, idEstanque, id);
// _cargandoController.sink.add(false);
// no se requieren los controllers porque para la persona al desplazar, siente que ya se borró
return true;
}
dispose() {
_alimentarController?.close();
_cargandoController?.close();
}
}
import'包:rxdart/rxdart.dart';
进口“包装:aplians_fish/src/models/alimentar_model.dart”;
导入“package:aplians_fish/src/providers/alimentar_provider.dart”;
食品级{
最终_LimentarController=新行为主体();
最终_cargandoController=新行为主体();
最终的食物提供者=新的食物提供者();
Stream get alimentarStream=>\u alimentarController.Stream;
Stream get cargando=>\u cargandoController.Stream;
Future cargarAlimentar(字符串idEmpresa、字符串idEstanque)异步{
最终食品=等待食品供应商提供汽车食品(idEmpresa,idEstanque);
//阿霍拉·哈伊·奎尔·艾斯托斯·艾尔·斯泰尔·斯泰尔·斯泰尔斯·艾尔·斯泰尔·斯泰尔·斯泰尔·斯泰尔。。。
_食品控制器。水槽。添加(食品);
归还食物;
}
Future crearAlimentar(AlimenterModel alimentar、String idEmpresa、String idEstanque)异步{
_cargandoController.sink.add(true);
等待食品供应商(食品商、idEmpresa、idEstanque);
_cargandoController.sink.add(false);//este esútil para bloquear botones cuando se estécargando
//这是一种形式上的产品和服务
返回true;
}
void editarAlimentar(字符串idE)