# #firebase #flutter
Вопрос:
Ошибка:
E/flutter (22800): [ОШИБКА:flutter/lib/ui/ui_dart_state.cc(199)] Необработанное исключение: Ошибка noSuchMethod: «Телефон» получателя был вызван при нуле. Е/трепетание (22800): получатель: нуль, е/трепетание (22800): пыталась дозвониться: телефон e/флаттер (22800): Объект #0.noSuchMethod (Dart о:ядро-патчи/object_patch.Дарт:54:5) е/трепетание (22800): #1 _OtpscreenState.verifyPhone (в упаковке:userauth/Otpscreen.в Dart:172:35) е/трепетание (22800): #2 _OtpscreenState.initState (в упаковке:userauth/Otpscreen.Дарт:209:5) е/трепетание (22800): #3 StatefulElement._firstBuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4711:57) е/трепетание (22800): #4 ComponentElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4548:5) е/трепетание (22800): #5 элемент.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #6 элементов.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #7 SingleChildRenderObjectElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:6083:14) е/трепетание (22800): #8 элементов.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #9 элемент.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #10 ComponentElement.performRebuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4599:16) е/трепетание (22800): элемент № 11.перестроить (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4267:5) е/трепетание (22800): #12 ComponentElement._firstBuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4553:5) е/трепетание (22800): #13 ComponentElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4548:5) е/трепетание (22800): #14 элементов.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #15 элементов.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #16 SingleChildRenderObjectElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:6083:14) е/трепетание (22800): #17 элементов.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #18 элементов.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #19 SingleChildRenderObjectElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:6083:14) е/трепетание (22800): #20 элементов.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #21 элемент.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #22 ComponentElement.performRebuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4599:16) е/трепетание (22800): #23 StatefulElement.performRebuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4746:11) е/трепетание (22800): #24 элемента.перестроить (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4267:5) е/трепетание (22800): #25 ComponentElement._firstBuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4553:5) е/трепетание (22800): #26 StatefulElement._firstBuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4737:11) е/трепетание (22800): #27 ComponentElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4548:5) е/трепетание (22800): #28 элементов.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #29 элемент.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #30 SingleChildRenderObjectElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:6083:14) е/трепетание (22800): #31 элемент.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): элемент № 32.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #33 SingleChildRenderObjectElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:6083:14) е/трепетание (22800): #34 элемента.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #35 элементов.updateChild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3363:18) е/трепетание (22800): #36 ComponentElement.performRebuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4599:16) е/трепетание (22800): #37 StatefulElement.performRebuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4746:11) е/трепетание (22800): #38 элементов.перестроить (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4267:5) е/трепетание (22800): #39 ComponentElement._firstBuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4553:5) е/трепетание (22800): #40 StatefulElement._firstBuild (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4737:11) е/трепетание (22800): #41 ComponentElement.крепление (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:4548:5) е/трепетание (22800): #42 элемента.inflateWidget (пакет:флаттер/ГРЦ/виджеты/рамки.Дарт:3611:14) е/трепетание (22800): #43 элемента.Поле обновления (пакет:flutter/src/виджеты/фреймворк.dart:3363:18) E/flutter (22800): #44 Элемент компонента.Выполнение сборки (пакет:flutter/src/виджеты/фреймворк.dart:4599:16) E/flutter (22800): #45 Элемент.восстановление (пакет:flutter/src/виджеты/фреймворк
Вот мой код:
import 'package:flutter/material.dart';
import 'package:pinput/pin_put/pin_put.dart';
import 'package:pinput/pin_put/pin_put_state.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:userauth/Profilescreen.dart';
class Otpscreen extends StatefulWidget {
String phone;
Otpscreen(this.phone);
@override
_OtpscreenState createState() => _OtpscreenState();
}
class _OtpscreenState extends State<Otpscreen> {
final GlobalKey<ScaffoldState> _scaffoldkey = GlobalKey<ScaffoldState>();
late String otp;
late String _verificationCode;
final TextEditingController _pinPutController = TextEditingController();
final FocusNode _pinPutFocusNode = FocusNode();
final BoxDecoration pinPutDecoration = BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(10.0),
border: Border.all(
color: const Color.fromRGBO(126, 203, 224, 1),
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 10, bottom: 10),
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(right: 310),
child: RawMaterialButton(
onPressed: () {
Navigator.pop(context, "phone");
},
child: Icon(Icons.arrow_back),
),
),
SizedBox(height: 40),
Text(
"Verify Phone",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
color: Colors.black),
),
SizedBox(height: 10),
Text(
"code is sent to ${widget.phone}",
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: Colors.grey),
),
Padding(
padding: const EdgeInsets.all(30.0),
child: PinPut(
fieldsCount: 6,
textStyle: const TextStyle(
fontSize: 25.0, color: Colors.white),
eachFieldWidth: 40.0,
eachFieldHeight: 55.0,
focusNode: _pinPutFocusNode,
controller: _pinPutController,
submittedFieldDecoration: pinPutDecoration,
selectedFieldDecoration: pinPutDecoration,
followingFieldDecoration: pinPutDecoration,
pinAnimationType: PinAnimationType.fade,
onSubmit: (pin) async {
try {
await FirebaseAuth.instance
.signInWithCredential(
PhoneAuthProvider.credential(
verificationId: _verificationCode,
smsCode: otp))
.then((value) async {
if (value.user != null) {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) => Profilescreen()),
(route) => false);
}
});
} catch (e) {
FocusScope.of(context).unfocus();
_scaffoldkey.currentState!.showSnackBar(
SnackBar(content: Text("invalid OTP")));
}
},
),
),
SizedBox(
height: 20,
),
Center(
child: Padding(
padding: const EdgeInsets.only(
left: 20, right: 20, top: 0, bottom: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: Text(
"Didn't receive an code?",
),
),
GestureDetector(
onTap: () {
Navigator.pushNamed(context, "phone");
},
child: Center(
child: Text(
"Request Again",
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
),
),
],
),
),
),
SizedBox(height: 20),
RawMaterialButton(
onPressed: () {
Navigator.pushNamed(context, "profile");
},
fillColor: Colors.blue,
child: Padding(
padding: const EdgeInsets.fromLTRB(50, 15, 50, 15),
child: Text(
"VERIFY AND CONTINUE",
style: TextStyle(
fontSize: 16, fontWeight: FontWeight.bold),
),
),
),
],
),
),
),
],
),
),
);
}
verifyPhone() async {
var widget;
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: " 91${widget.phone}",
verificationCompleted: (PhoneAuthCredential credential) async {
await FirebaseAuth.instance
.signInWithCredential(credential)
.then((value) async {
if (value.user != null) {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => Profilescreen()),
(route) => false);
}
});
},
verificationFailed: (FirebaseAuthException e) {
print(e.message);
},
codeSent: (String verificationID, int? resendToken) {
setState(() {
_verificationCode = verificationID;
});
},
codeAutoRetrievalTimeout: (String verificationID) {
setState(() {
var verificationCode = verificationID;
});
},
timeout: Duration(seconds: 60));
}
@override
void initState() {
// TODO: implement initState
super.initState();
verifyPhone();
}
}
Спасибо!
Комментарии:
1. Вы используете нулевую безопасность?
2. Нет, я не обновлял свою версию.
Ответ №1:
Почему в вашей функции verifyPhone() вы объявляете переменную «виджет»??
попробуйте удалить это
verifyPhone() async {
var widget; <<--- remove this from your code
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: " 91${widget.phone}",
verificationCompleted: (PhoneAuthCredential credential) async {
await FirebaseAuth.instance
.signInWithCredential(credential)
.then((value) async {
if (value.user != null) {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => Profilescreen()),
(route) => false);
}
});
},
verificationFailed: (FirebaseAuthException e) {
print(e.message);
},
codeSent: (String verificationID, int? resendToken) {
setState(() {
_verificationCode = verificationID;
});
},
codeAutoRetrievalTimeout: (String verificationID) {
setState(() {
var verificationCode = verificationID;
});
},
timeout: Duration(seconds: 60));
}
Ответ №2:
Вы пытаетесь получить виджет.телефон в этой строке
var widget;
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: " 91${widget.phone}", <-
Но вместо того, чтобы передавать телефон в качестве параметра в Otpscreen, код получает переменную телефона, объявленную внутри функции. Поскольку переменная имеет значение null, возвращаемое значение является ошибкой noSuchMethod. Попробуйте удалить var widget
объявление.