es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo usar runTransaction con firebase_database 9.0.3

¿Alguien puede decirme dónde buscar, o qué me falta, para saber cómo usar runTransaction en la versión 9.0.3? (Flutter, Firebase realtime DB)
Actualicé firebase_database ^7.0.0 a ^9.0.3. Tuve que cambiar runTransaction(MutableData mutable) a runTransaction(Object object), y el objeto es nulo para los datos de tipo Map. Sin embargo, devuelve una cadena cuando se refiere a un solo nodo de tipo String.

Para que algo funcione, agregué + ‘/sap’ al final de .ref(…), y devolvió ‘DROID’.

Código actualizado según el comentario a continuación:

bool bCanWeStartGame = false;
bool bIfiOS = false;
bIfiOS = Theme.of(referencedData.mngGamesPageMaterialContext)
    .platform == TargetPlatform.iOS;
DatabaseReference playersRef = referencedData.database.ref(
    TABLENAME_STARTS + '/' + referencedData.strFBGameUniqueIDKey);

“`dart
if(bIfiOS){
//aparentemente, en el iPhone se necesita ‘abrir línea al registro de la BD’ para que funcione
playersRef.once()
.then((DatabaseEvent event) {//no es necesario hacer nada??
});
}

TransactionResult txResult;
//bucle while para repetir la transacción hasta que se resuelva
int iWhileLoopCheck = 0; //para evitar que el bucle while se ejecute infinitamente
bool bTransactionCommittedOrGetOutAnyWay = false;
while(!bTransactionCommittedOrGetOutAnyWay
&& (iWhileLoopCheck<30)){
iWhileLoopCheck++;
txResult = await playersRef
.runTransaction(
(Object post) {
if (post == null) {
if(bIfiOS){sleep(Duration(milliseconds: 3));}
return Transaction.abort(); //salir, pero volverá a intentar la transacción
}
Map<string, dynamic=””> _post = Map<string, dynamic=””>.from(post as Map);

    bTransactionCommittedOrGetOutAnyWay = true; //cualquiera de las dos opciones siguientes que se ejecute, no quiero que continúe el bucle while
    if (_post[STARTS_TABLE_ALL_PLAYERS] !=
        startingGames[iIndexInStartingGames].allplayers) {
      //alguien se unió desde el intento de inicio
      bCanWeStartGame = false;
      //Transaction.abort() ya que no quiero cambiar los datos
      return Transaction.abort();
    } else {
      //Nadie se ha unido, así que puede iniciar el juego. Avisar a los demás que el juego está comenzando
      _post['stg'] = true;
      bCanWeStartGame = true;
      return Transaction.success(_post);
    }
  });

} //mientras runtransaction no obtenga los datos</string,></string,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí está con el método runTransaction() después de actualizar a firebase_database ^9.0.3. La versión anterior de runTransaction() utilizaba MutableData mutable como parámetro, pero ahora utiliza Object object.

    Una cosa a tener en cuenta es que el parámetro Object object no debe ser nulo. Por lo tanto, es posible que sea necesario ajustar el código para tener esto en cuenta. Según el fragmento de código proporcionado, parece que el problema está con los datos del tipo Map. En este caso, puede ser necesario convertir el Map en una cadena JSON antes de pasarla como parámetro Object.

    Además, parece haber un problema al acceder a un nodo específico en la base de datos en tiempo real de Firebase. Para resolver esto, puede ser necesario agregar + '/sap' al método .ref() como se muestra en el fragmento de código.

    En general, para solucionar el problema con el uso de runTransaction() en firebase_database ^9.0.3, puede ser necesario realizar las siguientes actualizaciones:
    – Convertir los datos del tipo Map en una cadena JSON antes de pasarlos como parámetro Object.
    – Agregar + '/sap' al método .ref() para acceder a un nodo específico en la base de datos en tiempo real de Firebase.

Comments are closed.