【问题标题】:Flutter 2.2.3: Null check operator used on a null value [duplicate]Flutter 2.2.3:空值检查运算符
【发布时间】:2021-10-29 05:07:02
【问题描述】:

我是个新手。我的是手机验证应用。

我遇到以下错误:Null check operator used on a null value。 完整的错误信息在这里: 在构建 Builder 时抛出了以下 _CastError:

空值检查运算符

相关的导致错误的小部件是:MaterialApp file:///E:/​​AndroidStudioProjects/phone_verification/lib/main.dart:18:12 抛出异常时,这是堆栈: #0 _InitializerWidgetState.initState (package:phone_verification/main.dart:48:30) #1 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4711:57) #2 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4548:5) ... 正常 元件安装(166 帧) #168 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3611:14)

由于我无法通过此处提供的解决方案解决问题,因此我再次发布问题。请建议对我的代码进行可能的更改。在稳定的频道上运行。 Flutter 版本为 2.2.3。 谢谢

main.dart

    import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_core/firebase_core.dart' show Firebase;
import 'package:flutter/material.dart';
import 'package:phone_verification/screens/homeScreen.dart';
import 'package:phone_verification/screens/loginScreen.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Phone Verification',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: InitializerWidget(),
    );
  }
}

class InitializerWidget extends StatefulWidget {

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

class _InitializerWidgetState extends State<InitializerWidget> {

  late FirebaseAuth _auth;

  late User _user;

  bool isLoading = true;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _auth = FirebaseAuth.instance;
    _user = _auth.currentUser!;
    bool isLoading = false;
  }
  @override
  Widget build(BuildContext context) {
    return isLoading ? Scaffold(
      body: Center(
        child: CircularProgressIndicator(),
      ),
    ) : _user == null ? LoginScreen() : HomeScreen();
  }
}

loginScreen.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:phone_verification/screens/homeScreen.dart';

enum MobileVerificationState {
  SHOW_MOBILE_FORM_STATE,
  SHOW_OTP_FORM_STATE,
}

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  MobileVerificationState currentState = MobileVerificationState.SHOW_MOBILE_FORM_STATE;

  final phoneController = TextEditingController();
  final otpController = TextEditingController();

  FirebaseAuth _auth = FirebaseAuth.instance;

 late String verificationId;

 bool showLoading = false;

  void signInWithPhoneAuthCredential(PhoneAuthCredential phoneAuthCredential) async {

    setState(() {
      showLoading = true;
    });
    try {
      final authCredential = await _auth.signInWithCredential(phoneAuthCredential);

      setState(() {
        showLoading = false;
      });

      if(authCredential.user != null)
        {
          Navigator.push(context,MaterialPageRoute(builder: (context)=> HomeScreen()));
        }

    }on FirebaseAuthException catch (e) {

      setState(() {
        showLoading = false;
      });

      _scaffoldKey.currentState!.showSnackBar(SnackBar(content: Text(e.message.toString())));
    }
  }

  getMobileFormWidget(context) {
    return Column(
      children: [
        Spacer(),
        TextField(
          controller: phoneController,
          decoration: InputDecoration(hintText: "Phone Number"),
        ),
        SizedBox(
          height: 16.0,
        ),
        SizedBox(
          width: 10.0,
        ),
        TextButton(
          onPressed: ()async {

            setState(() {
              showLoading = true;
            });

            await _auth.verifyPhoneNumber(
              phoneNumber: phoneController.text,
              verificationCompleted: (phoneAuthCredential) async {
                setState(() {
                  showLoading = false;
                });
                //signInWithPhoneAuthCredential(phoneAuthCredential);
              },
              verificationFailed: (verificationFailed) async {
                setState(() {
                  showLoading = false;
                });
                _scaffoldKey.currentState!.showSnackBar(SnackBar(content: Text(verificationFailed.message.toString())));
              },
              codeSent: (verificationId, resendingToken) async {
                setState(() {
                  showLoading = false;
                  currentState = MobileVerificationState.SHOW_OTP_FORM_STATE;
                  this.verificationId = verificationId;
                });
              },
              codeAutoRetrievalTimeout: (verificationId) async {

              },
            );
          },
          child: Text(
            "SEND",
          ),
          style: TextButton.styleFrom(
            primary: Colors.white,
            backgroundColor: Colors.deepPurple,
          ),
        ),
        Spacer(),
      ],
    );
  }

  getOtpFormWidget(context) {
    return Column(
      children: [
        Spacer(),
        TextField(
          controller: otpController,
          decoration: InputDecoration(hintText: "Enter OTP"),
        ),
        SizedBox(
          height: 16.0,
        ),
        SizedBox(
          width: 10.0,
        ),
        TextButton(
          onPressed: () async {
            PhoneAuthCredential phoneAuthCredential =
            PhoneAuthProvider.credential(verificationId: verificationId, smsCode: otpController.text);

            signInWithPhoneAuthCredential(phoneAuthCredential);

          },
          child: Text(
            "VERIFY",
          ),
          style: TextButton.styleFrom(
            primary: Colors.white,
            backgroundColor: Colors.deepPurple,
          ),
        ),
        Spacer(),
      ],
    );
  }

  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      body: Container(
          child: showLoading ? Center(child: CircularProgressIndicator(),) : currentState == MobileVerificationState.SHOW_MOBILE_FORM_STATE
              ? getMobileFormWidget(context)
              : getOtpFormWidget(context),
        padding: const EdgeInsets.all(16),

      ));
  }
}

homeScreen.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:phone_verification/screens/loginScreen.dart';

class HomeScreen extends StatefulWidget {

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

class _HomeScreenState extends State<HomeScreen> {

  final _auth = FirebaseAuth.instance;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text("Home Screen"),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await _auth.signOut();
          Navigator.pushReplacement(context,MaterialPageRoute(builder: (context) => LoginScreen()));
        },
        child: Icon(Icons.logout),
      ),
    );
  }
}

【问题讨论】:

    标签: android firebase flutter


    【解决方案1】:

    这是行。 _user = _auth.currentUser!; 我理解你的逻辑,但你不能那样做。 ! 运算符表示这不是空变量。而不是直接使用:

    _user = _auth.currentUser
    

    然后将_user的类型改为User?而不是用户

    【讨论】:

    • 谢谢哈扎尔!错误已解决,但应用程序未加载。该应用程序已安装在设备上,并且出现加载符号但没有进一步,即登录屏幕未加载。有什么建议?以下是我的控制台上显示的内容:调试服务正在侦听 ws://127.0.0.1:58796/vIST4OIYE4U=/ws 正在将文件同步到设备 Redmi 6 Pro...应用程序在此处停止。
    • 嗨,我找到了第二个问题的答案。我只是在初始化 bool isLoading=false。它现在正在工作。谢谢。
    【解决方案2】:

    您是说用户不能为空_user = _auth.currentUser!;,但您在此处检查用户是否为空: _user == null ? LoginScreen() : HomeScreen();

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 2021-02-25
      • 2023-01-05
      • 2021-11-06
      • 2021-06-17
      • 2022-06-15
      • 2021-11-10
      • 2021-08-30
      相关资源
      最近更新 更多