在我的flutter开发过程中,我遇到了许多问题,Firebase插件之间不合作,并且很难缩小哪些版本的软件包是兼容的。我最近添加了firebase_database,似乎找不到一个稳定的配置,让我实际使用实时连接,而不崩溃我的应用程序。
如果任何人都可以分享一个类似的设置,他们使用,并可以确认是稳定的,这将极大地帮助我缩小什么是错误的可能性。
下面是我的pubspec.yaml的相关部分:
environment:
sdk: ">=3.0.0"
dependencies:
flutter:
sdk: flutter
firebase_core: ^2.1.0
firebase_auth: ^4.0.0
cloud_firestore: ^4.9.0
firebase_database: ^10.2.7
firebase_analytics: ^10.0.0
cloud_functions: ^4.0.0
#firebase_messaging will be needed eventually, but not now.
很久以前,我发现了一个页面,直接列出了哪些版本是要一起使用,但没有能够找到它再次在一年多。如果它还存在,有人可以给我一个链接吗?我想更永久地解决firebase依赖问题,因为它对我来说是一个反复出现的问题。
作为一个次要的问题,这是我的应用程序的相关部分,导致崩溃。我有很多麻烦找出什么是错的,因为任何时候我听它我的应用程序立即崩溃,但它似乎与返回任何属性的_dbRef。
import 'package:firebase_database/firebase_database.dart';
class RealtimeService {
final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();
String encodeFirebaseKey(String key) {
return Uri.encodeComponent(key);
}
String decodeFirebaseKey(String encodedKey) {
return Uri.decodeComponent(encodedKey);
}
Stream<Map<String, Conversation>> getConversationsStream(String userEmail) {
// Check for null _dbRef
if (_dbRef == null) {
print('Error: _dbRef is null');
return Stream.error('Database reference is null');
}
String encodedEmail = encodeFirebaseKey(userEmail);
// Listen for values and handle potential errors inside asyncMap
return _dbRef
.child('userConversations')
.child(encodedEmail)
.onValue
.asyncMap((event) async {
print('mark 1');
try {
print('mark 2');
Map<String, dynamic> userConvos = event.snapshot.value as Map<
String,
dynamic> ?? {};
if (userConvos.isEmpty) {
return {}; // Return empty map if no conversations found
}
// Fetching details of each conversation and mapping it to a list
Map<String, Conversation> conversations = {};
await Future.wait(userConvos.keys.map((convoId) async {
DataSnapshot convoSnapshot = (await _dbRef.child('conversations')
.child(convoId)
.once()).snapshot;
if (convoSnapshot.value != null) {
conversations[convoId] = ConversationObject.fromMap(
map: convoSnapshot.value as Map<String, dynamic>);
}
}));
return conversations;
} catch (e) {
print('Error in asyncMap: $e');
throw e;
}
});
}
}
1条答案
按热度按时间dtcbnfnu1#
我可以追踪到问题。默认情况下,
Uri.encodeComponent()
方法不会转义句点.
字符,因为它在URI组件中被认为是安全字符。但是,由于Firebase Realtime Database键不允许使用句点,因此我调整了编码函数以直接处理句点。因此,对于任何试图找到firebase兼容版本的人来说,我最初问题中列出的pubspec是一个有效的配置。
仍然在寻找一个更强大的方法来缩小哪些软件包是兼容的。