Пожарные транзакции не работают - PullRequest
0 голосов
/ 27 июня 2018

Я обнаружил некоторую цепочку проблем , в которой люди также не могут завершать транзакции, но он даже не предоставляет решения .

Проблема

Внезапно мои транзакции вылетают при использовании transaction.get.

runTransaction(
  (Transaction transaction) async {
    await transaction.get(documentReference); // "Timed out waiting for Task"
  }

PlatformException также не очень помогает мне, потому что он падает в platform_channel ...

E/flutter (16297): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (16297): PlatformException(Error performing transaction, Timed out waiting for Task, null)
E/flutter (16297): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:547:7)
E/flutter (16297): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:279:18)
E/flutter (16297): <asynchronous suspension>
E/flutter (16297): #2      Firestore.runTransaction (file:///G:/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.7.3/lib/src/firestore.dart:115:10)
// here comes another <asynchronous suspension> followed by my code

Это происходит от Android .

Ответы [ 3 ]

0 голосов
/ 11 мая 2019

Эта ошибка возникает иногда, потому что:

  • не отлаживайте транзакцию во время ее выполнения, поэтому ставьте точку останова в нужной строке до или после.

Появляются другие ошибки, потому что вы этого не сделаете:

  • сначала делайте все вызовы, затем пишите или обновляйте.

    как сказано в документе Firestore:

    " Операции чтения должны предшествовать операциям записи. "

https://firebase.google.com/docs/firestore/manage-data/transactions#transactions

0 голосов
/ 27 июля 2019

Проблема, с которой я столкнулся, была исправлена ​​командой cloud_firestore.

Если вы по-прежнему сталкиваетесь с подобной проблемой, вам следует задать вопрос здесь, в StackOverflow, или создать проблему .

0 голосов
/ 15 января 2019

Работает без проблем:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

Future<void> main() async {
  final FirebaseApp app = await FirebaseApp.configure(
    name: 'yourappname',
    options: const FirebaseOptions(
      googleAppID: 'yourgoogleid',
      gcmSenderID: 'yourgmssenderid',
      apiKey: 'yourapikey',
      projectID: 'yourprojectid',
    ),
  );
  final Firestore firestore = Firestore(app: app);
  await firestore.settings(
  timestampsInSnapshotsEnabled: true,
  persistenceEnabled: true,
  sslEnabled: true
  );

  runApp(MaterialApp(
      title: 'Firestore Example', home: MyHomePage(firestore: firestore)));
}

class MessageList extends StatelessWidget {
  MessageList({this.firestore});

  final Firestore firestore;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: firestore.collection('messages').snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (!snapshot.hasData) return const Text('Loading...');
        final int messageCount = snapshot.data.documents.length;
        return ListView.builder(
          itemCount: messageCount,
          itemBuilder: (_, int index) {
            final DocumentSnapshot document = snapshot.data.documents[index];
            return ListTile(
              title: Text(document['message'] ?? '<No message retrieved>'),
              subtitle: Text('Message ${index + 1} of $messageCount'),
            );
          },
        );
      },
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({this.firestore});
  final Firestore firestore;
  CollectionReference get messages => firestore.collection('messages');

  Future<void> _addMessage() async {
final DocumentReference postRef = firestore.document('posts/123');
firestore.runTransaction((Transaction tx) async {
  DocumentSnapshot postSnapshot = await tx.get(postRef);
  if (postSnapshot.exists) {
    await tx.update(postRef, <String, dynamic>{'likesCount': postSnapshot.data['likesCount'] + 1});
  }
});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Firestore Example'),
      ),
      body: MessageList(firestore: firestore),
      floatingActionButton: FloatingActionButton(
        onPressed: _addMessage,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...