発生している問題
FlutterでFirebase Authenticationを用いてTwitterログインを実装しています。
「FlutterでFirebaseのTwitterログインを実装する」
を参考に実装し、Twitterのログイン画面が表示されてるところまでは確認できたのですが、認証後にコールバックでアプリに戻った際に、アプリが再起動し、最初からプログラムが起動されてしまうので、
dart
1final authResult = twitterLogin.login();
の結果を受け取ることができません。
dart
1final twitterLogin = TwitterLogin( 2 apiKey: 'fsaf7893nkva0df', 3 apiSecretKey: 'l0n7zqrgerg93sd0f9723lg90u734', 4 redirectURI: 'example://', 5);
までは実行され、Twitterログイン画面が表示されますが、
コールバックでアプリに戻った際は、最初から実行されるので、この後の、
dart
1final authResult = twitterLogin.login();
以降の処理が動きません。
ソース
login.dart
dart
1import 'package:flutter/material.dart'; 2import 'package:firebase_auth/firebase_auth.dart'; 3import 'package:google_sign_in/google_sign_in.dart'; 4import 'package:self_scoring_app/views/pages/top_page.dart'; 5 6import 'package:twitter_login/twitter_login.dart'; 7 8import '../../cache/CacheUpdateStatus.dart'; 9import '../../utility/Config.dart'; 10import '../../utility/Messages.dart'; 11import '../widgets/PageStyle.dart'; 12 13class LoginPage extends StatefulWidget { 14 const LoginPage({ 15 Key key, 16 }) : super(key: key); 17 18 19 _LoginPageState createState() => _LoginPageState(); 20} 21 22class _LoginPageState extends State<LoginPage> { 23 final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); 24 bool isUser = false; 25 26 27 void initState() { 28 super.initState(); 29 _load(); 30 } 31 32 33 Widget build(BuildContext context) { 34 bool _return = false; 35 if (this.isUser) { 36 _return = true; 37 } 38 return Scaffold( 39 appBar: AppBar( 40 backgroundColor: PageStyle.headerColor, 41 automaticallyImplyLeading: _return, 42 title: Padding( 43 padding: EdgeInsets.only(left: 5), 44 child: Text(Messages.pageLoginTitle, style: PageStyle.defaultTextStyle), 45 ), 46 titleSpacing: 0, 47 ), 48 body: Container( 49 child: Column( 50 children: <Widget>[ 51 Form( 52 key: _formKey, 53 child: Center( 54 child: Padding( 55 padding: const EdgeInsets.symmetric(horizontal: 24), 56 child: Column( 57 mainAxisAlignment: MainAxisAlignment.center, 58 mainAxisSize: MainAxisSize.min, 59 children: _getButtons(), 60 ), 61 ), 62 ), 63 ) 64 ], 65 ), 66 ), 67 ); 68 } 69 70 void _load() { 71 final FirebaseAuth firebaseAuth = FirebaseAuth.instance; 72 if (firebaseAuth.currentUser != null) { 73 this.isUser = true; 74 } 75 } 76 77 List<Widget> _getButtons() { 78 List<Widget> buttons = []; 79 80 buttons.add( 81 SizedBox( 82 child: ElevatedButton( 83 style: ElevatedButton.styleFrom( 84 primary: Colors.blue, 85 onPrimary: Colors.white, 86 ), 87 onPressed: () => _onSignInWithTwitter(), 88 child: Text(Messages.buttonTwitterLogin, style: PageStyle.buttonTextStyle), 89 ), 90 ), 91 ); 92 return buttons; 93 } 94 95 Future _onSignInWithTwitter() async { 96 print(Config.twitterConsumerKey); 97 print(Config.twitterSecretKey); 98 try { 99 final twitterLogin = TwitterLogin( 100 apiKey: Config.twitterConsumerKey, 101 apiSecretKey: Config.twitterSecretKey, 102 redirectURI: 'test-log://', 103 ); 104 print("test1--------1"); 105 final authResult = await twitterLogin.loginV2(); 106 print("test1--------2"); 107 print(authResult.status); 108 switch (authResult.status) { 109 case TwitterLoginStatus.loggedIn: 110 // success 111 print('====login success===='); 112 final credential = TwitterAuthProvider.credential( 113 accessToken: authResult.authToken, 114 secret: authResult.authTokenSecret, 115 ); 116 await FirebaseAuth.instance.signInWithCredential(credential); 117 break; 118 case TwitterLoginStatus.cancelledByUser: 119 // cancel 120 print('====login cancel===='); 121 break; 122 case TwitterLoginStatus.error: 123 // error 124 print('====login error===='); 125 break; 126 } 127 } catch (e) { 128 await showDialog( 129 context: context, 130 builder: (context) { 131 return AlertDialog( 132 title: Text(Messages.errorCommon, style: PageStyle.defaultTextStyle), 133 content: Text(e.toString(), style: PageStyle.defaultTextStyle), 134 ); 135 }, 136 ); 137 } 138 } 139} 140
AndroidManifest.xml
xml
1<application 2 android:icon="@mipmap/ic_launcher" 3 android:label="@string/app_name"> 4 <activity> 5 <省略> 6 <intent-filter> 7 <action android:name="android.intent.action.VIEW" /> 8 <category android:name="android.intent.category.DEFAULT" /> 9 <category android:name="android.intent.category.BROWSABLE" /> 10 <data android:scheme="example" /> <!-- host is option --> 11 </intent-filter> 12 </activity> 13</application>
試したこと
- AndroidManifest.xmlの、intent-filterの値を変えてみました。
- 「flutter_twitter」などの他のpackageが使えないか試したのですが、「The plugin
flutter_twitter
uses a deprecated version of the Android embedding.」というエラーが出て、インストール自体できませんでした。
起動中のアプリにそのまま戻して、結果を受け取れるようにするにはどうしたらよいでしょうか?
あなたの回答
tips
プレビュー