前提
ログイン機能を実装していますが、ログイン時にNull check operator used on a null valueが発生します。
以前までは問題なくログインできておりましたが、いろいろ変更をしているうちにエラーが発生するようになりました。
実現したいこと
Null check operator used on a null valueが発生せずログインできること
発生している問題・エラーメッセージ
Null check operator used on a null value
該当のソースコード
// ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/services.dart'; import 'authentication_error.dart'; import 'registration.dart'; import '../home.dart'; //入力データの状態があるためStatefulWidgetを作成 class Login extends StatefulWidget { const Login({Key? key}) : super(key: key); @override // ignore: library_private_types_in_public_api _LoginPage createState() => _LoginPage(); } class _LoginPage extends State<Login> { String login_Email = ""; // 入力されたメールアドレス String login_Password = ""; // 入力されたパスワード String infoText = ""; // ログインに関する情報を表示 // Firebase Authenticationを利用するためのインスタンス final FirebaseAuth auth = FirebaseAuth.instance; late UserCredential result;//late をつけることで後から代入することを明記 late User user;//late をつけることで後から代入することを明記 // エラーメッセージを日本語化するためのクラス final auth_error = Authenticationerror(); @override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: true,//キーボードが表示されたときにスクロールできるようにする appBar: AppBar( title: const Text('ログイン') ), body: Center( child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min,//Columnを画面中央に表示させる //mainAxisAlignment: MainAxisAlignment.center, //Columnを中央にするのはこれでもOK children: <Widget>[ // メールアドレスの入力フォームのウィジェット Padding( padding: const EdgeInsets.fromLTRB(25.0, 0, 25.0, 0),//左右に余白を設定 child:TextFormField( decoration: const InputDecoration( labelText: "メールアドレス" ), onChanged: (String value) { login_Email = value; }, ) ), // パスワードの入力フォーム Padding( padding: const EdgeInsets.fromLTRB(25.0, 0, 25.0, 10.0), child:TextFormField( decoration: const InputDecoration( labelText: "パスワード(8~20文字)" ), obscureText: true, // パスワードが見えないようRにする maxLength: 20, // 入力可能な文字数 maxLengthEnforcement: MaxLengthEnforcement.enforced, // 入力可能な文字数の制限を超える場合の挙動の制御 onChanged: (String value) { login_Password= value; }, ), ), // ログイン失敗時のエラーメッセージ Padding( padding: const EdgeInsets.fromLTRB(20.0, 0, 20.0, 5.0), child:Text(infoText, style: const TextStyle(color: Colors.red),), ), SizedBox(//ElevatedButtonでボタンを作成した際にSizedBoxでボタンのサイズを決めれる。 width: 250, height: 35, child: ElevatedButton( child: const Text('ログイン', style: TextStyle(fontWeight: FontWeight.bold),), onPressed: () async { try { // 入力したメール/パスワードでユーザーログイン //resultにログイン情報を格納 result = await auth.signInWithEmailAndPassword( email: login_Email, password: login_Password, ); // ログイン成功 // ログインユーザーのIDを取得 user = result.user!;//ログイン情報からユーザ情報のみを取得しuserに格納 Navigator.push( context, MaterialPageRoute( builder: (context) => Home(user_id: user.uid), ) ); }on FirebaseAuthException catch (e) {//エラーをキャッチする // ログインに失敗した場合 setState(() {//setStateで更新があったことを知らせる infoText = auth_error.login_error_msg(e.code);//キャッチしたエラーのエラーコードを日本語に変換しinfoTextに格納 }); } } ), ), Padding( padding: const EdgeInsets.all(10.0), child: SizedBox(//ElevatedButtonでボタンを作成した際にSizedBoxでボタンのサイズを決めれる。 width: 350.0, height: 35.0, child: ElevatedButton( style: ElevatedButton.styleFrom(//buttonのスタイルを決める primary: Colors.blue[50],//ボタンの色 onPrimary: Colors.blue,//ボタンを押したときの色(テキストの色を明記しないとテキストもこの色になる) shape: RoundedRectangleBorder(//ボタンの丸みを設定する borderRadius: BorderRadius.circular(30),//丸みのレベル ), ), child: Text('アカウントを作成する', style: TextStyle(fontWeight: FontWeight.bold, color: Colors.blue), ), // ボタンクリック後にアカウント作成用の画面の遷移する。 onPressed: (){ Navigator.of(context).push( MaterialPageRoute( fullscreenDialog: true,//モーダルとして表示 builder: (BuildContext context) => Registration(), ), ); } ), ), ), ], ), ) ) ); }
試したこと
調べた結果をもとに問題が起きている箇所でnullじゃない場合に処理するようにしてみましたが、現象は変わらず。
if(user != null) { Navigator.push( context, MaterialPageRoute( builder: (context) => Home(user_id: user.uid), ) ); }
補足情報(FW/ツールのバージョンなど)
OS:Windows11
IDE:Android Studio
Flutter 3.0.4
firebase_auth: ^3.6.3
firebase_core: ^1.20.1
cloud_firestore: ^3.4.4

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。