🖥️

Flutter Google Sign Inでつまづいたこと

2022/02/09に公開

はじめに

フリーランスでFlutter開発を行っています。
普段はQiitaに書いていますが、今年からはzennとmediumに書いていこうかなと思います!

今回、アプリにFirebaseAuthのGoogle SignInを実装したのですが、思わぬ落とし穴があったのでメモ

内容

Google Sign-inの実装は結構どこにでも書いてあるので詳しくは割愛させていただきます。
普通に実装しました!
普通にです!!
もう一回言います!
フツーに実装しました!

// Google認証
googleUser = await _googleSignIn.signIn();
if (googleUser != null) {
  googleAuth = await googleUser.authentication;
  credential = firebase.GoogleAuthProvider.credential(
  accessToken: googleAuth.accessToken, idToken: googleAuth.idToken);

 // Google認証を通過した後、Firebase側にログイン
 if (_user == null) {
   final resultCredential =
        await _firebaseAuth.signInWithCredential(credential);
   }

ね!普通でしょ?!
でも動作しません!!

Google Sign-in ボタンをタップ

Googleのアカウント選択画面が表示

アカウント選択

無反応....

処理が googleUser = await _googleSignIn.signIn(); の箇所で止まってしまいます!

原因

https://stackoverflow.com/questions/59790087/flutter-firebase-google-sign-in-not-working-stops-after-account-selection
古い記事ですが全く同じ症状です。(この記事探すのに2日かかりました)
この記事に書いてあるように、

It turns out that the author had customized the app's starting Activity such that onActivityResult was no longer calling super.onActivityResult, which prevented the google_sign_in plugin from sending data from the native side back to the Flutter side.

要するに、

MainActivityをカスタマイズしているとonActivityResultがsuper.onActivityResultを呼べないため、google_sign_inプラグインがネイティブ側からFlutter側へデータを送り返すことができない

との事!

解決策

確かにこのプロジェクトネイティブ側も触っています!
なので、MainActivityにsuper.onActivityResultを追加しました!

MainActivity.kt
class MainActivity : FlutterFragmentActivity() {

...省略

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    // ここを追加
    super.onActivityResult(requestCode, resultCode, data); 
    // ここで色々する
    }

...省略

}

まとめ

たった1行追加ですがちゃんと動くようになりました!
普段はあまり発生しないケースだと思いますが、ネイティブ側を触っていると発生するという限定ケースでした。ネイティブ側もちゃんと実装しないといけないですね。

思わぬ落とし穴があったので同じ境遇の方がいれば役に立つといいなと思いメモしました。

Discussion