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デバッグしようとしたらこんなエラーが出た。 defaultConfig
にmultiDexEnabled true
を追記する、というのはよく出てきたが、それはすでに行われていた。
そのうえで、
dependencies {
implementation "androidx.multidex:multidex:2.0.1"
}
も追記した。
でもだめやった。
もともとはminSdkVersionが23だったところを24にしてみたら
flutter doctor でcmdline-toolsがmissingなのでインストールしたいが失敗
コマンドラインでのインストールに必要な、sdkmanagerのパスを調べるところから、結局それがうまく行かずに(java.lang.NoClassDefFoundError
エラーが出る)、AndroidStudioの設定からインストールする部分まで、しっかり書かれている良い記事
デプロイされたcallableなCloud Functionsを呼び出そうとしたらエラー
まだ未解決。
可能性:
- もともとcallable functions側に問題があって動かない可能性
- Android側だけでの設定の問題 (AndroidManifest.xmlに何か書いたら治る可能性)
実環境でエラーが出る場合
React Native のCloudFunctionsでUNAVAILABLEエラーが出る問題(解決してないっぽい)
Issue #8801 UNAVAILABLEエラーが、特定のデバイスでのみ発生する
→Firebase側の問題でライブラリ側の問題ではなさそうらしい
Issue #7527
Firebase Emulatorと組み合わせたときに、エラーが出る場合
解決策: AndroidManifest.xml
にクリアテキスト通信を許可する内容を盛り込む
しかし今困っているのはFirebase Emulator使用時ではなく、実際の環境で起こっている問題についてである。今回のケースでは意味がない
上記リンクでの参照記事
その他記事
他に見つけた記事
stackoverflowは
firebase functions unavailable
で検索。
flutterfireのissueではis:issue firebase_functions/unavailable
で検索。
Firebaseエミュレータ&Android実機でhttps callable functionが動かない問題
→Android Emulatorでデバッグすれば動いたとのこと。回答では、それでも物理デバイスでのデバッグをしたい場合の参考URLが書かれている。
Issue #11576 ※読む必要のないissueである。 Issueを見た人がandroid:usesCleartextTraffic="true"
を追加したら、バグを再現できなかったそうで、そのまま閉じられたIssue
解決
解決した。
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
で指定するのが吉。