Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用API REST Firebase和Flatter的脱机持久性_Firebase_Flutter_Dart_Firebase Realtime Database_Sdk - Fatal编程技术网

使用API REST Firebase和Flatter的脱机持久性

使用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

我正在开发一个Agro应用程序,当我观看Firebase推广视频时,我非常喜欢他们描述应用程序工作的方式,即使没有互联网(离线持久性)

要开发我的应用程序,我使用了:

  • 飘动
  • Firebase API REST(http插件)
  • 提供者向API发出请求
  • 集团模式
我已经实际完成了应用程序,但我注意到,当没有internet时,会出现一个错误:

SocketException:主机查找失败:“node1.bitcoin.com”(操作系统错误:没有与主机名关联的地址,errno=7)

@IshwarChandra在媒体上向我澄清:

在Firebase中使用脱机持久性时,不要使用事务 或者等待回应

是这样吗?是否真的可以不使用WAIT从Firebase检索数据?。我这样问是因为我在某些情况下实现了BLOC模式,从而从用户界面中消除了等待。然而,它的背后总是会调用一个等待加载数据的提供者

另一方面,StackOverFlow的一位开发人员向我表示,离线持久性管理只能通过FlatterSDK和

这是不可能实现的(或者需要太多的编程) 正如我一直在使用的那样,它使用RESTAPI

那句话对吗?如果是这样,我有以下疑问:

  • 是否有文档或提示允许我轻松地将http REST Firebase API请求(我主要在提供程序中有)迁移到Flatter中的Firebase SDK

  • 我可以保留我正在使用的bloc和provider的体系结构吗

  • 在做改变之前还有什么建议吗

  • 为供参考,我在我的提供商上提供了示例代码:

    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)