Flutter 应用程序在日志屏幕中无限加载

问题描述 投票:0回答:1

当我尝试从 flutter 应用程序的日志屏幕输入电子邮件地址和密码登录时,无论等待多久我都无法登录该应用程序,它会无限加载。如何修复这个错误?

以下是login.dart文件的代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:lifelink_ridersapp/authentication/auth_screen.dart';
import 'package:lifelink_ridersapp/global/global.dart';
import 'package:lifelink_ridersapp/mainScreens/home_screen.dart';
import 'package:lifelink_ridersapp/widgets/custom_text_field.dart';
import 'package:lifelink_ridersapp/widgets/error_dialog.dart';
import 'package:lifelink_ridersapp/widgets/loading_dialog.dart';


class LoginScreen extends StatefulWidget {
  const LoginScreen({Key? key}) : super(key: key);

  @override
  _LoginScreenState createState() => _LoginScreenState();
}



class _LoginScreenState extends State<LoginScreen>
{
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  TextEditingController emailController = TextEditingController();
  TextEditingController passwordController = TextEditingController();


  formValidation()
  {
    if(emailController.text.isNotEmpty && passwordController.text.isNotEmpty)
    {
      //login
      loginNow();
    }
    else
    {
      showDialog(
          context: context,
          builder: (c)
          {
            return ErrorDialog(
              message: "Please write email/password.",
            );
          }
      );
    }
  }


  loginNow() async
  {
    showDialog(
        context: context,
        builder: (c)
        {
          return LoadingDialog(
            message: "Checking Credentials",
          );
        }
    );

    User? currentUser;
    await firebaseAuth.signInWithEmailAndPassword(
      email: emailController.text.trim(),
      password: passwordController.text.trim(),
    ).then((auth){
      currentUser = auth.user!;
    }).catchError((error){
      Navigator.pop(context);
      showDialog(
          context: context,
          builder: (c)
          {
            return ErrorDialog(
              message: error.message.toString(),
            );
          }
      );
    });
    if(currentUser != null)
    {
      readDataAndSetDataLocally(currentUser!);
    }
  }

  Future readDataAndSetDataLocally(User currentUser) async
  {
    await FirebaseFirestore.instance.collection("riders")
        .doc(currentUser.uid)
        .get()
        .then((snapshot) async {
          if(snapshot.exists){
            await sharedPreferences!.setString("uid", currentUser.uid);
            await sharedPreferences!.setString("email", snapshot.data()!["riderEmail"]);
            await sharedPreferences!.setString("name", snapshot.data()!["riderName"]);
            await sharedPreferences!.setString("photoUrl", snapshot.data()!["riderAvatarUrl"]);

            Navigator.pop(context);
            Navigator.push(context, MaterialPageRoute(builder: (c)=> const HomeScreen()));
          }
          else{
            firebaseAuth.signOut();
            Navigator.pop(context);
            Navigator.push(context, MaterialPageRoute(builder: (c)=> const AuthScreen()));

            showDialog(
                context: context,
                builder: (c)
                {
                  return ErrorDialog(
                    message: "No Record Exists",
                  );
                }
            );
          }

    });
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        mainAxisSize: MainAxisSize.max,
        children: [
          Container(
            alignment: Alignment.bottomCenter,
            child: Padding(
              padding: EdgeInsets.all(15),
              child: Image.asset(
                "images/signup.png",
                height: 270,
              ),
            ),
          ),
          Form(
            key: _formKey,
            child: Column(
              children: [
                CustomTextField(
                  data: Icons.email,
                  controller: emailController,
                  hintText: "Email",
                  isObsecre: false,
                ),
                CustomTextField(
                  data: Icons.lock,
                  controller: passwordController,
                  hintText: "Password",
                  isObsecre: true,
                ),
              ],
            ),
          ),
          ElevatedButton(
            child: const Text(
              "Login",
              style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold,),
            ),
            style: ElevatedButton.styleFrom(
              primary: Colors.orange,
              padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 10),
            ),
            onPressed: ()
            {
              formValidation();
            },
          ),
          const SizedBox(height: 30,),
        ],
      ),
    );
  }
}


下面是Android Studio中控制台的截图: screenshot of console in Android Studio

我尝试输入电子邮件和密码并登录应用程序。但发生的情况是应用程序的日志屏幕被无限加载。

flutter authentication logging runtime-error loading
1个回答
0
投票

正如错误所示,您正在对 null 值使用 null 检查运算符。

空检查运算符是“!”并且您正在使用它

readDataAndSetDataLocally
功能。

以下是可能失败的线路。

await sharedPreferences!.setString("email", snapshot.data()!["riderEmail"]);
await sharedPreferences!.setString("name", snapshot.data()!["riderName"]);
await sharedPreferences!.setString("photoUrl", snapshot.data()!["riderAvatarUrl"]);

在使用空检查运算符之前,您必须确保这些值都不为空。

对于新手来说,每次都使用空检查运算符是一种非常糟糕的做法。您可以在这里阅读有关如何避免这种情况的更多信息:

https://mario-gunawan.medium.com/4-ways-to-avoid-the-null-check-operator-on-flutter-e2b8e7d965d

© www.soinside.com 2019 - 2024. All rights reserved.