如何解决扑扑中的Firestore交易错误?

时间:2019-02-16 01:27:05

标签: dart transactions flutter google-cloud-firestore

我正在实现聊天应用程序,必须使用事务来同步用户的消息。但是,有致命错误会突然终止应用程序。我该如何处理?

我为此搜索了许多材料,但没有解决方案。 Github issue与此相关,我已经为此写过issue

Future<void> sendMessage(String content,String receiver,String chatRoomID) async {
  DocumentReference doc = Firestore.instance
    .collection(firestoreMessageCollection)
    .document(chatRoomID)
    .collection(chatRoomID)
    .document(DateTime.now().millisecondsSinceEpoch.toString());

  await Firestore.instance.runTransaction((tx) async{
    await tx.set(doc,{
      firestoreChatFromField: sl.get<CurrentUser>().uid,
      firestoreChatToField: receiver,
      firestoreChatTimestampField: DateTime.now().millisecondsSinceEpoch.toString(),
      firestoreChatContentField: content
    });
  });
}

我期望正确的结果是哪项交易正常进行,但发生以下错误并终止了应用程序。

  

E / AndroidRuntime(1719):原因:java.lang.IllegalArgumentException:提供的文档引用来自其他Firestore实例。

即使我使用的是同一Firestore实例,它也会连续发生。有谁解决了这个可怕的问题?

2 个答案:

答案 0 :(得分:0)

它与Firestore设置有关。初始化Firestore设置时,请使用Firestore.instance。如果您使用其他实例,则会发生我的错误

答案 1 :(得分:0)

我也遇到了同样的问题。当我更新文档参考代码时,此问题已修复。您可以尝试更改文档参考吗?

来自:

DocumentReference doc = Firestore.instance
    .collection(firestoreMessageCollection)
    .document(chatRoomID)
    .collection(chatRoomID)
    .document(DateTime.now().millisecondsSinceEpoch.toString());

收件人:

DocumentReference doc = Firestore.instance.document('$firestoreMessageCollection/$chatRoomID/$chatRoomID/${DateTime.now().millisecondsSinceEpoch.toString()}');

我还更新了依赖项版本。就我而言,这些是:

firebase_core: ^0.4.0+6
firebase_auth: 0.11.1+7
cloud_firestore: 0.12.5+2
firebase_storage: ^3.0.2
firebase_messaging: ^5.0.4
firebase_crashlytics: ^0.0.4+8