#firebase #flutter #google-cloud-firestore
#firebase #flutter #google-cloud-firestore
Вопрос:
Flutter показывает мне, что мой loggedInUser пуст / недействителен. Но я сохранил его значение от пользователя в методе getCurrentUser() . Теперь из-за этого мой код получает исключение в строке 92 (строка, за которой следует комментарий). Исключение составляет —
При обработке жеста была выдана следующая ошибка NoSuchMethodError: средство получения ’email’ было вызвано в null. Получатель: null Пытался вызвать: email
// Но всякий раз, когда я использую _auth.CurrentUser.email вместо loggedInUser, мой код работает нормально. Я не понимаю, почему??
Пожалуйста, кто-нибудь, помогите мне, я новичок в flutter.
Вот мой код для экрана чата —
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:palabrero_chat_app/constants.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class ChatScreen extends StatefulWidget {
static const String id = 'chat_screen';
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final myController = TextEditingController();
@override
void dispose() {
myController.dispose();
super.dispose();
}
// ignore: deprecated_member_use
final _firestore = Firestore.instance;
final _auth = FirebaseAuth.instance;
FirebaseUser loggedInUser;
String messageText;
@override
void initState() {
super.initState();
Firebase.initializeApp().whenComplete(() {
print("completed");
setState(() {});
});
getCurrentUser();
}
void getCurrentUser() async {
try {
final user = await _auth.currentUser;
if(user!=null) {
loggedInUser = user;
}
}
catch (e) {
print(e);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: null,
actions: <Widget>[
IconButton(
icon: Icon(Icons.close),
onPressed: () {
_auth.signOut();
Navigator.pop(context);
//Implement logout functionality
}),
],
title: Text('⚡️Chat'),
backgroundColor: Colors.lightBlueAccent,
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Container(
decoration: kMessageContainerDecoration,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
child: TextField(
onChanged: (value) {
messageText = value;
},
decoration: kMessageTextFieldDecoration,
),
),
FlatButton(
onPressed: () {
getCurrentUser();
//messageText loggedInUser.email
_firestore.collection('messages').add({
'text' : messageText,
'sender' : loggedInUser.email, //This line no. 92
//If i use _auth.currentUser.email above, in place of loggedInUser, my code
works. Please explain it to me.
});
},
child: Text(
'Send',
style: kSendButtonTextStyle,
),
),
],
),
),
],
),
),
);
}
}
Комментарии:
1. какую версию firebase_auth вы используете?
2. @PeterHaddad 0.18.0 1
Ответ №1:
Измените это:
void getCurrentUser() async {
try {
final user = await _auth.currentUser;
if(user!=null) {
loggedInUser = user;
}
}
catch (e) {
print(e);
}
}
в это:
void getCurrentUser() {
try {
final user = _auth.currentUser;
if(user!= null) {
setState(() { loggedInUser = user; });
}
}
catch (e) {
print(e);
}
}
Удалите async / await, поскольку currentUser
не возвращает Future
, также используйте setState
для обновления переменной loggedInUser
Ответ №2:
Как сказал Питер.. Я следовал его подходу, но мой код работал, пока я выполнял следующее:
- Я удалил async / await и добавил setState, но потерпел неудачу — в нем говорилось, что я не могу назначить пользователю будущее, поскольку loggedInUser был FirebaseUser.
- Я перечитал async / await и сохранил setState таким, какой он есть, и код сработал..
Итак, я чувствую, что это только для FirebaseUser, нам нужно добавить setState к назначению loggedInUser.
Ответ №3:
В функции getCurrentUser()
попробуйте изменить final user = _auth.currentUser;
чтобы final user = _auth.currentUser();
просто добавить эти круглые скобки.