Эмулятор облачной функции flutter firebase, функции вызова не работают

Я использую эмулятор firebase, и мои облачные функции ошибочны ...

Я называю свою функцию так:

HttpsCallable displayNameAndEmail = FirebaseFunctions.instanceFor(region: 'europe-west1').httpsCallable("displayNameAndEmail");

displayNameAndEmail.call({
          'displayName': "$firstName $lastName",
          'lang': lang,
          'email': email
        });
        print("\nDisplayName6\n\n");

И вот ошибка, которую я получаю:

[ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: [firebase_functions/unavailable] UNAVAILABLE
E/flutter (14049): 
E/flutter (14049): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:597:7)
E/flutter (14049): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:158:18)
E/flutter (14049): <asynchronous suspension>
E/flutter (14049): #2      MethodChannelHttpsCallable.call (package:cloud_functions_platform_interface/src/method_channel/method_channel_https_callable.dart:22:24)
E/flutter (14049): <asynchronous suspension>
E/flutter (14049): #3      HttpsCallable.call (package:cloud_functions/src/https_callable.dart:34:37)
E/flutter (14049): <asynchronous suspension>
E/flutter (14049): 
E/flutter (14049): #0      MethodChannelHttpsCallable.call (package:cloud_functions_platform_interface/src/method_channel/method_channel_https_callable.dart:38:7)
E/flutter (14049): <asynchronous suspension>
E/flutter (14049): #1      HttpsCallable.call (package:cloud_functions/src/https_callable.dart:34:37)
E/flutter (14049): <asynchronous suspension>
E/flutter (14049): 

Любая идея ?


person Simon B    schedule 20.06.2021    source источник
comment
Вы вызывали useFunctionsEmulator, как показано здесь: stackoverflow.com/questions/62994836/?   -  person Frank van Puffelen    schedule 20.06.2021
comment
Да, я ... @FrankvanPuffelen   -  person Simon B    schedule 20.06.2021
comment
Спасибо за подтверждение. ???? Однако вместо того, чтобы говорить об этом в комментарии, можете ли вы отредактировать свой вопрос, чтобы показать, как вы это сделали? Вероятно, нам также понадобится минимальная реализация облачной функции, с которой вы получаете эту ошибку, поэтому, пожалуйста, добавьте ее также в свой вопрос.   -  person Frank van Puffelen    schedule 20.06.2021


Ответы (1)


Первая строка создает отдельный экземпляр FirebaseFunctions (для указанного региона). Вы должны указать этому новому экземпляру подключиться к эмулятору, как указал Фрэнк в первом комментарии.

Вот документация FlutterFire с более подробной информацией. Если вы используете Android:

  • не забудьте использовать 10.0.2.2 в качестве хоста (необходимо при использовании эмулятора Android)
  • Добавить
<application android:usesCleartextTraffic="true"/>

к android\app\src\debug\AndroidManifest.xml. Это разрешает простой HTTP-трафик к / от эмуляторов Firebase.

Еще одно полезное упоминание - использование dart каскадной нотации, .., как следует:

String ip = Platform.isAndroid ? '10.0.2.2' : 'localhost';

var instance = FirebaseFunctions.instanceFor(region: 'europe-west1')
  ..useFunctionsEmulator(origin: 'http://$ip:5001');
HttpsCallable displayNameAndEmail = 
  instance.httpsCallable("displayNameAndEmail");

Кроме того, если вы обновитесь до последней версии, команда FlutterFire, похоже, будет стремиться к более единообразному подходу / интерфейсу. Все методы включения эмулятора (такие как useFunctionsEmulator) теперь принимают хост и порт в качестве позиционных аргументов (ранее требовался только один именованный аргумент, origin).

person Andrei Ștefănie    schedule 29.06.2021