Flutter 2.2.3:对空值使用空检查操作符



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

我遇到了以下错误:Null检查操作符用于空值。完整的错误信息如下:下面的_CastError被抛出:

对空值使用的空检查操作符

相关的导致错误的小部件是:MaterialAppfile:///E:/AndroidStudioProjects/phone_verification/lib/main.dart:18:12当抛出异常时,这是堆栈:# 0 _InitializerWidgetState。initState(包:phone_verification/main.dart 48:30):# 1 StatefulElement。_firstBuild(包:颤振/src/widget/framework.dart: 4711:57)# 2 ComponentElement。Mount (package:flutter/src/widgets/framework.dart:4548:5)…正常的元件安装(166帧)# 168的元素。inflateWidget(包:颤振/src/widget/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),
),
);
}
}

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

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

_user = _auth.currentUser

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

最新更新