Open5

Flutterエラー解決

やまやま

Darterror: bad state: tried to read a provider from a ProviderContainer that was already disposed

StateNotifierの中で、Refを使った他プロバイダーの読み込みをawaitしてから、続いて別のプロバイダーを読み込む処理をしようとしたら、エラーが出た。
いろいろ試した結果、次にプロバイダーを読み込む直前にif (!mounted) return;を追加すればうまくいくことがわかった。

やまやま

Execution failed for task ':app:mergeExtDexDebug'.

Android Studioデバッグしようとしたらこんなエラーが出た。 defaultConfigmultiDexEnabled trueを追記する、というのはよく出てきたが、それはすでに行われていた。
そのうえで、

dependencies {
    implementation "androidx.multidex:multidex:2.0.1"
}

も追記した。
でもだめやった。
https://github.com/invertase/react-native-firebase/discussions/7489
もともとはminSdkVersionが23だったところを24にしてみたら

やまやま

flutter doctor でcmdline-toolsがmissingなのでインストールしたいが失敗

コマンドラインでのインストールに必要な、sdkmanagerのパスを調べるところから、結局それがうまく行かずに(java.lang.NoClassDefFoundErrorエラーが出る)、AndroidStudioの設定からインストールする部分まで、しっかり書かれている良い記事
https://qiita.com/YokohamaHori/items/eb2cc2cadc6cf68bc511

やまやま

デプロイされたcallableなCloud Functionsを呼び出そうとしたらエラー

まだ未解決。
可能性:

  • もともとcallable functions側に問題があって動かない可能性
  • Android側だけでの設定の問題 (AndroidManifest.xmlに何か書いたら治る可能性)

実環境でエラーが出る場合

React Native のCloudFunctionsでUNAVAILABLEエラーが出る問題(解決してないっぽい)
https://stackoverflow.com/questions/78780726/i-get-unavailable-error-when-i-try-to-call-firebase-cloud-function-in-react-nati

Issue #8801 UNAVAILABLEエラーが、特定のデバイスでのみ発生する
→Firebase側の問題でライブラリ側の問題ではなさそうらしい
https://github.com/firebase/flutterfire/issues/8801

Issue #7527
https://github.com/firebase/flutterfire/issues/7527

Firebase Emulatorと組み合わせたときに、エラーが出る場合

解決策: AndroidManifest.xmlにクリアテキスト通信を許可する内容を盛り込む

しかし今困っているのはFirebase Emulator使用時ではなく、実際の環境で起こっている問題についてである。今回のケースでは意味がない

https://note.com/clever_cute_eli/n/nb6f34e266796
上記リンクでの参照記事
https://stackoverflow.com/questions/62984527/error-connecting-to-local-firebase-functions-emulator-from-flutter-app/62985709#62985709

その他記事

他に見つけた記事

stackoverflowはfirebase functions unavailableで検索。
flutterfireのissueではis:issue firebase_functions/unavailable で検索。

Firebaseエミュレータ&Android実機でhttps callable functionが動かない問題
→Android Emulatorでデバッグすれば動いたとのこと。回答では、それでも物理デバイスでのデバッグをしたい場合の参考URLが書かれている。
https://stackoverflow.com/questions/67246536/firebase-cloud-function-flutter-cannot-use-https-callable-function-on-emulat

Issue #11576 ※読む必要のないissueである。 Issueを見た人がandroid:usesCleartextTraffic="true"を追加したら、バグを再現できなかったそうで、そのまま閉じられたIssue
https://github.com/firebase/flutterfire/issues/11576

やまやま

解決

解決した。
Cloud Functionsのデプロイ先リージョンが問題だった。
Firebaseプロジェクトのデフォルトリージョンと、問題のCloudFunctionのデプロイ先リージョンを合わせたら解決した。

経緯

普段Android Emulatorでデバッグしているところを、「Android側の問題なのでは?」と考えてiOS Simulatorでデバッグしてみたら、iOS側でも同じようなエラーが出た。しかし、エラーは同じように発生し、そのメッセージはFirebaseFunctionsException ([firebase_functions/-1004] サーバに接続できませんでした。というものだった。
これより、プラットフォーム別のSDKの問題ではなく、サーバー側に問題がある可能性が高そうだと判断。
Issueなどを探すと、「Firebase Emulatorでローカルテストしたいが、UNAVAILABLEエラーが出て動かない」というケースが多かった。ためしに自分の環境で(Firebase Emulatorの問題に対する解決策としてandroid:usesCleartextTraffic="true"を追加したうえで)Firebase Emulatorを起動したら、普通に接続できた。
やはりサーバー側に問題ありと判断して、少し冷静になるために頭を寝かしていたら、リージョンでは??という発想が。普段のHTTPSトリガーのようにURLを指定しないのに、リージョンのことを何も考えずFirebaseFunctions.httpsCallable.call()を呼び出していたが、きちんとリージョンを設定したら変わるのでは?と考えて設定を見直すと、新しく作成したCloud Functionsがus-central1にデプロイされていた。それをFirebaseプロジェクトのデフォルトリージョンにあわせて、かつFirebaseFunctionsのインスタンス取得時にもFirebaseFunctions.instanceではなくFirebaseFunctions.instanceFor(region: '<REGION>')で取得するように変えたら、うまくいった。

※Functionsを作るたびにリージョン指定するのは面倒なので、まとめてsetGlobalOptionsで指定するのが吉。
https://zenn.dev/sway/articles/firebase_functions_jpregion