# #firebase #flutter #firebase-authentication
Вопрос:
Я получаю ошибку:
Получатель ‘uid’ не определен для типа ‘Функция будущего()’. Попробуйте импортировать библиотеку, которая определяет»uid», исправив имя на имя существующего геттера или определив геттер или поле с именем «uid».»
У меня есть необходимые зависимости, но, вероятно, не последняя, я получаю ошибку:
Получатель ‘uid’ не определен для типа ‘Функция будущего()’. Попробуйте импортировать библиотеку, которая определяет»uid», исправив имя на имя существующего геттера или определив геттер или поле с именем «uid».»
У меня есть необходимые зависимости, но, вероятно, не самые последние
Вот мой код ниже:
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_gk_design/Room/data/model/text_message_model.dart';
import 'package:flutter_gk_design/Room/data/model/user_model.dart';
import 'package:flutter_gk_design/Room/domain/entities/text_message_entity.dart';
abstract class FirebaseRemoteDataSource {
Future<void> signUp(String email, String password);
Future<void> signIn(String email, String password);
Future<void> signOut();
Future<bool> isSignIn();
Future<String> getCurrentUid();
Future<void> getCreateCurrentUser(
String email, String name, String profileUrl);
Future<void> sendTextMessage(TextMessageEntity textMessage);
Stream<List<UserModel>> getUsers();
Stream<List<TextMessageModel>> getMessages();
}
class FirebaseRemoteDataSourceImpl implements FirebaseRemoteDataSource {
final FirebaseAuth _auth = FirebaseAuth.instance;
final _userCollection = FirebaseFirestore.instance.collection("users");
final _globalChatChannelCollection =
FirebaseFirestore.instance.collection("globalChatChannel");
final String channelId = "8ghYhb9YN58qQeSBy2MG";
@override
Future<String> getCurrentUid() async => _auth.currentUser.uid;
@override
Future<bool> isSignIn() async => _auth.currentUser.uid != null;
@override
Future<void> signIn(String email, String password) async {
await _auth.signInWithEmailAndPassword(email: email, password: password);
}
@override
Future<void> signUp(String email, String password) async {
await _auth.createUserWithEmailAndPassword(
email: email, password: password);
}
@override
Future<void> getCreateCurrentUser(
String email, String name, String profileUrl) async {
_userCollection.doc(_auth.currentUser.uid).get().then((user) {
if (!user.exists) {
final newUser = UserModel(
name: name,
email: email,
uid: _auth.currentUser.uid,
profileUrl: profileUrl,
).toDocument();
_userCollection.doc(_auth.currentUser.uid).set(newUser);
return;
} else {
print("User Already exists");
return;
}
});
}
@override
Stream<List<TextMessageModel>> getMessages() {
return _globalChatChannelCollection
.doc(channelId)
.collection("messages")
.orderBy("time")
.snapshots()
.map((querySnapshot) => querySnapshot.docs
.map((docSnapshot) => TextMessageModel.fromSnapshot(docSnapshot))
.toList());
}
@override
Stream<List<UserModel>> getUsers() {
return _userCollection.snapshots().map(
(querySnapShot) => querySnapShot.docs
.map((docSnapshot) => UserModel.fromSnapshot(docSnapshot))
.toList(),
);
}
@override
Future<void> sendTextMessage(TextMessageEntity textMessage) async {
final newMessage = TextMessageModel(
message: textMessage.message,
recipientId: textMessage.recipientId,
time: textMessage.time,
receiverName: textMessage.receiverName,
senderId: textMessage.senderId,
senderName: textMessage.senderName,
type: textMessage.type,
);
_globalChatChannelCollection
.doc(channelId)
.collection("messages")
.add(newMessage.toDocument());
}
@override
Future<void> signOut() async {
await _auth.signOut();
}
}
Ответ №1:
Похоже, вы используете более старую версию firebase_auth
плагина, где currentUser
все еще была функция. На этом вы бы сделали:
Future<String> getCurrentUid() async => (await _auth.currentUser()).uid;
Но я бы рекомендовал вместо этого обновить плагин до последней версии, так как многое изменилось.