質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

0回答

701閲覧

Flutter + firebaseで作ったログインプログラムでログイン失敗する。

MaeharaKenji

総合スコア86

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2022/04/14 05:34

編集2022/04/14 05:49

現在Flutterでスマホアプリ開発環境の勉強中です。

クラウドサービスで必要なID登録・ログイン機能などをfirebaseのAuthentication機能というのを利用することで自分のプログラムに取り込めるとのことで、WEB上に掲載されていたサンプルプログラムを打ち込んでみました。

しかし、なぜか下記のエラーメッセージが出てログインに失敗します。

ログインに失敗しました: NoSuchMethodError: tried to call a non-function, such as null: 'dart.global.firebase.auth'

この症状の改善方法をご教示頂きますよう、お願いします。

なお、打ち込んで出来上がったmain.dartのコード内容はこちらです。

main.dart(その1)

dart

1//import 'dart:html'; 2 3//import 'dart:html'; 4//import 'dart:io'; 5 6import 'package:cloud_firestore/cloud_firestore.dart'; 7import 'package:firebase_auth/firebase_auth.dart'; 8import 'package:firebase_core/firebase_core.dart'; 9import 'package:flutter/material.dart'; 10 11void main() async { 12 //初期化処理を追加 13 WidgetsFlutterBinding.ensureInitialized; 14 await Firebase.initializeApp(); 15 16 runApp(ChatApp()); 17} 18 19class ChatApp extends StatelessWidget { 20 21 Widget build(BuildContext context) { 22 return MaterialApp( 23 // アプリ名 24 title: 'ChatApp', 25 theme: ThemeData( 26 //テーマカラー 27 primarySwatch: Colors.blue, 28 ), 29 //ログイン画面を表示 30 home: LoginPage(), 31 ); 32 } 33} 34

main.dart(その2)

dart

1//ログイン画面用Widget 2class LoginPage extends StatefulWidget { 3 4 _LoginPageState createState() => _LoginPageState(); 5} 6 7class _LoginPageState extends State<LoginPage> { 8 9 //メッセージ表示用 10 String infoText = ''; 11 12 //入力したメールアドレス・パスワード 13 String email = ''; 14 String password = ''; 15 16 17 18 Widget build(BuildContext context) { 19 return Scaffold( 20 body: Center( 21 child:Container( 22 padding: EdgeInsets.all(24), 23 child: Column( 24 mainAxisAlignment: MainAxisAlignment.center, 25 children: <Widget>[ 26 // メールアドレス入力 27 TextFormField( 28 decoration: InputDecoration(labelText: 'メールアドレス'), 29 onChanged: (String value) { 30 setState(() { 31 email = value; 32 }); 33 }, 34 ), 35 36 //パスワード入力 37 TextFormField( 38 decoration: InputDecoration(labelText: 'パスワード'), 39 obscureText: true, 40 onChanged: (String value) { 41 setState(() { 42 password = value; 43 }); 44 }, 45 ), 46 Container( 47 padding: EdgeInsets.all(8), 48 //メッセージ表示 49 child:Text(infoText) 50 ), 51 Container( 52 width: double.infinity, 53 //ユーザー登録ボタン 54 child: ElevatedButton( 55 child: Text('ユーザー登録'), 56 onPressed: () async { 57 try { 58 // メール/パスワードでユーザー登録 59 final FirebaseAuth auth = FirebaseAuth.instance; 60 final result = await auth.createUserWithEmailAndPassword( 61 email: email, 62 password: password, 63 ); 64 //ユーザー登録に成功した場合 65 //チャット画面に遷移+ログイン画面を破棄 66 await Navigator.of(context).pushReplacement( 67 MaterialPageRoute(builder: (context) { 68 return ChatPage(result.user!); 69 }), 70 ); 71 } catch (e) { 72 // ユーザー登録に失敗した場合 73 setState(() { 74 infoText = "登録に失敗しました:${e.toString()}"; 75 }); 76 } 77 }, 78 ), 79 ), 80 const SizedBox(height: 8), 81 Container( 82 width: double.infinity, 83 //ログイン登録ボタン 84 child: OutlinedButton( 85 child: Text('ログイン'), 86 onPressed: () async { 87 try { 88 //メール/パスワードでログイン 89 final FirebaseAuth auth = FirebaseAuth.instance; 90 final result = await auth.signInWithEmailAndPassword( 91 email: email, 92 password: password, 93 ); 94 // ログインに成功した場合 95 // チャット画面に遷移+ログイン画面を破棄 96 await Navigator.of(context).pushReplacement( 97 MaterialPageRoute(builder: (context) { 98 return ChatPage(result.user!); 99 }), 100 ); 101 } catch (e) { 102 // ログインに失敗した場合 103 setState(() { 104 infoText = "ログインに失敗しました:${e.toString()}"; 105 }); 106 } 107 }, 108 ), 109 ), 110 ] 111 ), 112 ), 113 ), 114 ); 115 } 116} 117 118

main.dart(その3)

dart

1class ChatPage extends StatelessWidget { 2 //引数からユーザー情報を受け入れるようにする 3 ChatPage(this.user); 4 //ユーザー情報 5 final User user; 6 7 8 Widget build(BuildContext context) { 9 return Scaffold( 10 appBar: AppBar( 11 title: Text('チャット'), 12 actions: <Widget>[ 13 IconButton( 14 icon: Icon(Icons.logout), 15 onPressed: () async { 16 // ログアウト処理 17 // 内部で保持しているログイン情報等が初期化される 18 // (現時点ではログアウト時はこの処理を呼び出せばOKと、思うぐらいで大丈夫です) 19 await FirebaseAuth.instance.signOut(); 20 //ログイン画面に遷移+チャット画面を破棄 21 await Navigator.of(context).pushReplacement( 22 MaterialPageRoute(builder: (context) { 23 return LoginPage(); 24 }), 25 ); 26 }, 27 ) 28 ] 29 ), 30 body: Column( 31 children: [ 32 Container( 33 padding: EdgeInsets.all(8), 34 child: Text('ログイン情報;${user.email}'), 35 ), 36 Expanded( 37 // FutureBuilder 38 //非同期処理の結果を元にWidgetを作れる 39 child: FutureBuilder<QuerySnapshot>( 40 // 投稿メッセージ一覧を取得(非同期処理) 41 // 投稿日時でソート 42 future: FirebaseFirestore.instance 43 .collection('posts') 44 .orderBy('date') 45 .get(), 46 builder: (context, snapshot) { 47 // データが取得できた場合 48 if (snapshot.hasData) { 49 final List<DocumentSnapshot> documents = snapshot.data!.docs; 50 // 取得した投稿メッセージ一覧を元にリスト表示 51 return ListView( 52 children: documents.map((document) { 53 return Card( 54 child: ListTile( 55 title: Text(document['text']), 56 subtitle: Text(document['email']), 57 //自分の投稿メッセージの場合は削除ボタンを表示 58 trailing: document['email'] == user.email 59 ? IconButton( 60 icon: Icon(Icons.delete), 61 onPressed: () async { 62 // 投稿メッセージのドキュメントを削除 63 await FirebaseFirestore.instance 64 .collection('posts') 65 .doc(document.id) 66 .delete(); 67 }, 68 ) 69 : null, 70 ), 71 ); 72 }).toList(), 73 ); 74 } 75 //データが読み込み中の場合 76 return Center( 77 child: Text('読込中...'), 78 ); 79 }, 80 ), 81 ), 82 ], 83 ), 84 floatingActionButton: FloatingActionButton( 85 child: Icon(Icons.add), 86 onPressed: () async { 87 //投稿画面に遷移 88 await Navigator.of(context).push( 89 MaterialPageRoute(builder: (context) { 90 // 引数からユーザー情報を渡す 91 return AddPostPage(user); 92 }), 93 ); 94 }, 95 ), 96 ); 97 } 98} 99

main.dart(その4)

dart

1//投稿画面用Widget 2class AddPostPage extends StatefulWidget { 3 // 引数からユーザー情報を受け取る 4 AddPostPage(this.user); 5 // ユーザー情報 6 final User user; 7 8 9 _AddPostPageState createState() => _AddPostPageState(); 10} 11 12class _AddPostPageState extends State<AddPostPage> { 13 //入力した投稿メッセージ 14 String messageText = ''; 15 16 17 Widget build(BuildContext context) { 18 return Scaffold( 19 appBar: AppBar( 20 title: Text('チャット投稿'), 21 ), 22 23----------------(省略) ------------------------------ 24 25 }); 26 // 1つ前の画面に戻る 27 Navigator.of(context).pop(); 28 }, 29 ), 30 ) 31 ], 32 ), 33 ), 34 ), 35 ); 36 } 37} 38 39

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問