gpt4 book ai didi

firebase - 使用API​​ REST Firebase和Flutter的离线持久性

转载 作者:行者123 更新时间:2023-12-03 04:41:45 26 4
gpt4 key购买 nike

我正在开发一个Agro应用程序,当我观看Firebase促销视频时,我非常喜欢它们描述应用程序的方式,即使没有互联网(离线持久性)也是如此。
为了开发我的应用程序,我使用了:

  • Flutter
  • Firebase API REST(http插件)
  • 提供者向API
  • 发出请求
  • BLOC模式

  • 我已经基本完成了该应用程序,但是我注意到,当没有互联网时,会出现错误:

    SocketException: Failed host lookup: ‘node1.bitcoiin.com’ (OS Error: No address associated with hostname, errno = 7)


    @IshwarChandra在Medium上澄清了我:

    When you use offline persistence in Firebase, don't use Transactionsor await for response.


    这样对吗?是否真的可以不使用await从Firebase检索数据?我之所以这么问,是因为在某些情况下我已经实现了BLOC模式,因此消除了用户界面中的等待。但是,始终在其后方调用已等待加载数据的Provider。
    另一方面,StackOverFlow的开发人员向我指出,离线持久性管理只能使用Flutter SDK和

    it's NOT possible (or would require too much programming) to implementit with the REST API as I have been using it.


    那句话正确吗?如果是这样,我有以下疑问:
  • 是否有文档或提示可让我轻松地将http REST Firebase API请求(主要在提供程序中)迁移到Flutter中的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;
    }


    }
    而且,这就是我使用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();
    }

    }

    最佳答案

    您似乎正在通过其REST API从Firebase实时数据库获取数据。 Firebase SDK实现了客户端缓存,但是由于您没有使用SDK,因此也没有使用SDK中的缓存。
    要了解如何使用SDK从Firebase中读取内容,建议您阅读Firebase文档(例如Androidexample in the Flutter library)。在这两者之间,您应该能够找出映射。如果您对代码的特定部分有疑问,请针对该问题发布一个新问题。
    使用BloC与是否使用Firebase无关,因此只要映射与数据库交互的代码(从使用REST API到使用Firebase SDK),就可以继续使用它们。

    关于firebase - 使用API​​ REST Firebase和Flutter的离线持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63090103/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com