12
votes

Flutter + Firebase: Configurer l'application pour utiliser l'émulateur Firebase local

J'ai configuré Firebase pour qu'il s'exécute localement pour le débogage à l'aide de l'émulateur en suivant ce lien.

Maintenant, je veux pouvoir exécuter mon application connectée à l'hôte local pour les déclencheurs de débogage également. Existe-t-il un moyen d'y parvenir en configurant mon application Flutter pour utiliser l'hôte local?

Mon émulateur fonctionne comme suit:

entrez la description de l'image ici


2 commentaires

Veuillez ne pas afficher d'images de texte. Il est préférable de copier le texte directement dans la question pour faciliter la lecture et la recherche.


Si vous ne devez configurer que partiellement votre application. Par exemple, uniquement Firestore ou fonctionne uniquement. Vous pouvez utiliser le code ici: tianhaoz.com/eng/server/firebase / ...


6 Réponses :


5
votes

Après avoir parcouru attentivement la documentation ici , je l'ai fait fonctionner en configurant le paramètre d'hôte sur l'instance de Firestore:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:tracker/screens/screens.dart';

void main() async {

  // This will set the app to communicate with localhost
  await Firestore.instance.settings(host: "10.0.2.2:8080", sslEnabled: false);

  runApp(AppSetupScreen());
}

Remarque : cela ne fonctionnera qu'avec l'émulateur et non avec un périphérique physique.


3 commentaires

ça marche dans le simulateur iOS? J'ai essayé de l'utiliser et les demandes vont toujours à l'émulateur Firebase et non à Firebase: /


Je ne l'ai pas essayé dans le simulateur iOS désolé: /, mais cela devrait fonctionner en donnant "localhost: 8080" comme hôte comme spécifié dans la documentation.


@kashlo Oui, cela fonctionne pour iOS / Android si vous suivez ce stackoverflow.com/a/62586957/6133329



0
votes

On dirait que j'ai connecté ios à localhost: 8080, mais db fonctionne très lentement et je n'ai pas non plus remarqué de journaux dans un fichier. @UsmanZaheer, pouvez-vous s'il vous plaît dire quand a-t-il écrit des journaux et fonctionnait-il rapidement?

Pas:

  • Firebase init

  • ajouter des liens qui ont été créés par ini vers package.json dans les fonctions;

    "firestore": {"rules": "firestore.rules", "indexes": "firestore.indexes.json"},

  • émulateurs Firebase: démarrer

dans main () écrire

await Firestore.instance.settings(
      host: 'http://localhost:8080',
      sslEnabled: false,
      persistenceEnabled: false,
      timestampsInSnapshotsEnabled: true
  ).catchError((e) => print(e));


1 commentaires

L'émulateur est juste à des fins de débogage, je l'ai utilisé pour déboguer mes fonctions cloud. Lorsque vous créez un utilisateur d'authentification, il est enregistré dans Firestore car il n'y a pas d'émulateur d'authentification actuellement, comme pour les autres données, je ne peux pas vraiment dire où il stocke les données (peut-être en mémoire). L'émulateur montre simplement dans la console que la fonction a été touchée et que le succès ou les erreurs ont été détectés.



10
votes

Prêts partez!

ÉTAPE 1 [configuration de Firestore en scintillement dans main.dart]

import 'package:firebase_functions_interop/firebase_functions_interop.dart';
import 'package:node_interop/node.dart';
import 'package:node_interop/util.dart';

void devPrepopulateCollections(ExpressHttpRequest request) {
  var env =
      new Map<String, String>.from(dartify(process.env)); // <-- important part

  if (env.containsKey('FUNCTIONS_EMULATOR') &&
      env.containsKey('FIRESTORE_EMULATOR_HOST')) {
    // TODO: prepopulate firestore emulator from 'yourproject/src/sample_data.json
    request.response
      ..write("Prepopulated firestore with sample_data.json!")
      ..close();
  } else {
    request.response
      ..write("Do not populate production firestore with sample_data.json")
      ..close();
  }
}

ÉTAPE 1 [setup Firestore in Flutter in main.dart] pour la nouvelle version de Firebase

export const prepopulateFirestoreEmulator = functions.https.onRequest(
  (request, response) => {
    if (process.env.FUNCTIONS_EMULATOR && process.env.FIRESTORE_EMULATOR_HOST) {
      // TODO: prepopulate firestore emulator from 'yourproject/src/sample_data.json
      response.send('Prepopulated firestore with sample_data.json!');
    } else {
      response.send(
        "Do not populate production firestore with sample_data.json"
      );
    }
  }
);

ÉTAPE 2 [projet init Firebase]

firebase emulators:start --import ../initialData 
firebase emulators:start --import ../otherStateData

ÉTAPE 3 [config firestore émulator eg firebase.json]

firebase emulators:start
flutter run

ÉTAPE 4 [exécuter des émulateurs et une application de flutter]

"emulators": {
    "ui": {
      "enabled": true,
      "host": "localhost",
      "port": 4000
    },
    "functions": {
      "port": 5001
    },
    "firestore": {
      "host": "0.0.0.0", <------ Make sure to set it "0.0.0.0"
      "port": 5002
    },
}

A travaillé à la fois sur le simulateur iOS et les émulateurs Android

PS: essayez de redémarrer l'émulateur Firestore ou / et l'application Flutter

Terminé!

BONUS [importer les données d'exportation vers l'émulateur Firestore]

lorsque vous arrêtez l'émulateur de Firestore, toutes les données de Firestore disparaissent. Alors peut-être qu'avant d'arrêter l'émulateur, si vous voulez continuer à partir de là où vous en étiez, vous pouvez exporter les données de l'émulateur Firestore comme ça

firebase emulators:export ../data (../data peut être n'importe quel chemin que vous voulez 😎)

pour charger les données exportées

firebase emulators:start --import ../data

vous pouvez enregistrer différents états de votre émulateur Firestore pour différents cas, exemple

firebase init

â ¤ï¸ Note pour moi utiliser fléchettes pour les fonctions de firebase â ¤ï¸

Si vous souhaitez utiliser Dart pour les fonctions Firebase, vous pouvez suivre ce https://github.com/pulyaevskiy/firebase-functions-interop

une bonne chose que j'ai trouvée pour moi-même pour détecter si votre fonction s'exécute dans l' émulateur ou en production, vous pouvez en savoir plus ici

longue histoire courte

functions/index.js

Future<void> main() async {
  
    WidgetsFlutterBinding.ensureInitialized(); <--- Important!
   
    String host = Platform.isAndroid ? '10.0.2.2:5002' : 'localhost:5002';
    await FirebaseFirestore.instance.settings = Settings(
         host: host,
         sslEnabled: false,
    );  
       
}

fonctions / index.dart

Future<void> main() async {
  
    WidgetsFlutterBinding.ensureInitialized(); <--- Important!
      
    await Firestore.instance.settings(
            host: '192.168.1.38:5002', <--- Make sure to put your local ip 
            sslEnabled: false);             it will not work if you use 'localhost:5002'
                                            Google it "how to find my local ip"
       
}

7 commentaires

Merci pour ces instructions! Cela a même fonctionné avec mon appareil Android connecté.


Vous êtes les bienvenus, heureux d'entendre que cela a été utile;)


maintenant flutter a des instructions officielles sur la configuration de l'émulateur Firebase pour Flutter firebase.flutter.dev/docs/firestore/usage#emulator-usage


Pourriez-vous mettre à jour cela pour savoir comment vous connecter à l'émulateur de base de données en temps réel? Je ne peux pas comprendre l'incantation magique nécessaire ...


les instructions officielles fonctionnent pour l'utilisation des simulateurs Android ou iOS. Mais pour les tests sur des périphériques physiques, nécessite l'hôte Firestore "0.0.0.0" + combinaison d'adresses IP locales


@SultanmyrzaKasymbekov merci pour la réponse! Connaissez-vous la même solution pour utiliser Firebase Emulator avec FirebaseAuth et Flutter?


Les instructions @BorisSalimov ci-dessus devraient fonctionner pour vous. Sinon, pouvez-vous me dire ce qui s'est passé de votre côté?



0
votes

Votre main.dart devrait ressembler à ceci:

firebase emulators:start

dans votre fichier firebase.json

export FIRESTORE_EMULATOR_HOST=localhost:8080

vous devez également définir les paramètres suivants dans votre terminal:

  "emulators": {
    "firestore": {
          "host": "localhost",
          "port": 8080
    },
    ...
  }

puis exécutez

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firestore.instance
    .settings(
       host: 'http://localhost:8080',
       sslEnabled: false,
       persistenceEnabled: false,
     )
    .catchError((e) => print(e));
  // 
  // ...
  //
  runApp(App(...));
}


0 commentaires

0
votes

Ajustement pour Flutter Web

en plus de la bonne réponse de @Sultanmyrza

Platform nécessite dart:io/dart:html qui s'excluent mutuellement afin de vérifier la plate-forme que j'utilise kIsWeb

FirebaseFirestore __firestore;
FirebaseFirestore get _firestore {
  if (__firestore != null) {
    return __firestore;
  }
  debugPrint('isFirebaseEmulator: $isFirebaseEmulator');
  __firestore = FirebaseFirestore.instance;
  if (isFirebaseEmulator) {
    __firestore.settings = const Settings(
      host: kIsWeb ? 'localhost:8080' : '10.0.2.2:8080',
      sslEnabled: false,
    );
  }
  return __firestore;
}


0 commentaires

0
votes

Dernière mise à jour : pour connecter l'application Flutter à votre suite d'émulateur Firebase locale, suivezces instructions officielles pour la configuration.


0 commentaires