添加firebase_database时Flutter的稳定Firebase包

8e2ybdfx  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(163)

在我的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;
      }
    });
  }

}
dtcbnfnu

dtcbnfnu1#

我可以追踪到问题。默认情况下,Uri.encodeComponent()方法不会转义句点.字符,因为它在URI组件中被认为是安全字符。但是,由于Firebase Realtime Database键不允许使用句点,因此我调整了编码函数以直接处理句点。

String encodeFirebaseKey(String key) {
  return Uri.encodeComponent(key).replaceAll('.', '%2E');
  }

String decodeFirebaseKey(String encodedKey) {
    return Uri.decodeComponent(encodedKey.replaceAll('%2E', '.'));
  }

因此,对于任何试图找到firebase兼容版本的人来说,我最初问题中列出的pubspec是一个有效的配置。
仍然在寻找一个更强大的方法来缩小哪些软件包是兼容的。

相关问题