मैं एक ड्रॉप-डाउन सूची (ड्रॉपडाउन) का उपयोग कर रहा हूं, जिसके तत्व फायरबेस से प्राप्त किए गए हैं। फॉर्म सही काम करता है, हालांकि जब इंटरनेट कनेक्शन खो जाता है तो फायरबेस ऑफलाइन पर्सिस्टेंस प्रॉपर्टी काम नहीं करती है और सर्कुलर प्रोग्रेस इंडिकेटर सक्रिय रहता है। कुछ प्रतिक्रियाएँ पढ़ना जैसे एक फ़्लटर ऐप में Firestore में ऑफ़लाइन दृढ़ता का उपयोग करना , यह संकेत दिया गया है कि प्रतीक्षा को संभाला नहीं जाना चाहिए, हालांकि यह मेरे लिए स्पष्ट नहीं है कि इसे कैसे प्राप्त किया जाए:

class EstanqueAlimentarPage extends StatefulWidget {

  @override
  _EstanqueAlimentarPageState createState() => _EstanqueAlimentarPageState();
}

class _EstanqueAlimentarPageState extends State<EstanqueAlimentarPage> {
  final formKey = GlobalKey<FormState>();
  AlimentoBloc alimentoBloc = new AlimentoBloc();
  AlimentoModel _alimento = new AlimentoModel();
  AlimentarModel alimentar = new AlimentarModel();
  List<AlimentoModel> _alimentoList;
  bool _alimentoDisponible = true;

@override
  void dispose() {
    alimentoBloc.dispose();
    super.dispose();
  }

@override
void initState() {
  _obtenerListaAlimentoUnaVez();
  super.initState();  
}


Future<void> _obtenerListaAlimentoUnaVez() async {
  
  _alimentoList = await alimentoBloc.cargarAlimento(idEmpresa); // Await that I want to eliminate

  if (_alimentoList.length > 0) { // Here appears a BAD STATE error when the internet connection goes from off to on
    _alimento = _alimentoList[0];
    _alimentoDisponible = true;
  } else {
    _alimentoDisponible = false;
  }
  _cargando = false;
  setState(() {});
}

  @override
  Widget build(BuildContext context) {
    
    return Form(
      key: formKey, 
      child: Column(
        children: <Widget> [
          _crearTipoAlimento(_alimentoList),
          SizedBox(height: 8.0),
          _crearComentarios(),
        ]
      )
    ),
    _crearBoton('Guardar'),

  }

  Widget _crearTipoAlimento(List<AlimentoModel> lista) {

    return Container(
      decoration: _cajaBlanca,
      child: 
      !_cargando // If it isn't loading, Dropdown must be displayed
      ? DropdownButtonFormField<AlimentoModel>(
        decoration: InputDecoration(
          labelText: 'Nombre del Alimento',
          contentPadding: EdgeInsets.only(top:5.0),
          prefixIcon: Icon(FontAwesomeIcons.boxOpen, color: Theme.of(context).primaryColor,),
          border: InputBorder.none,
        ),
        value: _alimento,
        items: lista.map((AlimentoModel value) {
          return DropdownMenuItem<AlimentoModel>(
            child: Text(value.nombre),
            value: value,
          );
        }).toList(),
        onChanged: (_alimentoDisponible) ? (AlimentoModel _alimentoSeleccionado) {
          print(_alimentoSeleccionado.nombre);
          _alimento = _alimentoSeleccionado;
          setState(() {});
        } : null,
        disabledHint: Text('No hay Alimento en Bodega'),
        onSaved: (value) {
          alimentar.idAlimento = _alimento.idAlimento;
          alimentar.nombreAlimento = _alimento.nombreRef; 
        }
      )
      : Center (child: CircularProgressIndicator(strokeWidth: 1.0,))

    );
  }

  Widget _crearComentarios() {
    return TextFormField(
      // -- DESIGN OTHER FIELDS -- //
      onSaved: (value) {
        alimentar.comentarios = value;
      }
    ),
    );
  }

  Widget _crearBoton(String texto) {
    return RaisedButton(
        // -- DESIGN -- //
        onPressed: (_guardando) ? null : _submit,
      ),
    );
  }

  void _submit() {

    // CODE TO WRITE FORM IN FIREBASE
  }
}

मेरे बीएलओसी से फ़ंक्शन कोड है:

  Future<List<AlimentoModel>> cargarAlimento(String idEmpresa, [String filtro]) async {
    final alimento = await _alimentoProvider.cargarAlimento(idEmpresa, filtro); //It's one await more
    _alimentoController.sink.add(alimento);
    return alimento;
  }

और PROVIDER की ओर से क्वेरी है:

Future<List<AlimentoModel>> cargarAlimento(String idEmpresa, [String filtro]) async {

    Query resp;
    final List<AlimentoModel> alimento = new List(); 
    resp = db.child('empresas').child(idEmpresa).child('bodega/1').child('alimento')
            .orderByChild('cantidad').startAt(0.000001);
 
  return resp.once().then((snapshot) {

      if (snapshot.value == null) return [];
      if (snapshot.value['error'] != null) return []; 

      snapshot.value.forEach((id, alim){
        final temp = AlimentoModel.fromJson(Map<String,dynamic>.from(alim));
        temp.idAlimento = id;

        alimento.add(temp);
      });
      return alimento;
  }); 
1
David L 1 अगस्त 2020, 16:09

1 उत्तर

सबसे बढ़िया उत्तर

Firebase ऑफ़लाइन उपयोग करते समय, आप await को केवल उन चीज़ों पर छोड़ देते हैं जो सर्वर को बदल देती हैं (उदा., रिकॉर्ड बनाना या अपडेट करना)। तो आप सर्वर के "हाँ मैंने इसे लिखा" कहने की प्रतीक्षा नहीं करेंगे, आप मानते हैं कि यह लिखा गया है।

आपके मामले में, हालांकि, आप डेटा नहीं लिख रहे हैं, आप डेटा पढ़ रहे हैं। आपको अपने उदाहरण में await रखना होगा। जिस तरह से आप अपना डेटा लोड करते हैं उसमें orderByChild और startAt हैं, हो सकता है कि वे ऑफ़लाइन लोडिंग को रोक रहे हों। आम तौर पर, आप इसे तब प्राप्त करते हैं जब यह पहले से कैश में हो: https: //firebase.google.com/docs/firestore/manage-data/enable-offline#get_offline_data

आप एक BAD STATE error का उल्लेख करते हैं, हो सकता है कि यदि आप इसे प्रदान करते हैं, तो हम समस्या को थोड़ा बेहतर ढंग से इंगित करने में सक्षम हो सकते हैं।

2
Gazihan Alankus 1 अगस्त 2020, 20:39