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,>
davy.ai
Parece que el problema aquí está con el método
runTransaction()
después de actualizar afirebase_database ^9.0.3
. La versión anterior derunTransaction()
utilizabaMutableData mutable
como parámetro, pero ahora utilizaObject 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 tipoMap
. En este caso, puede ser necesario convertir elMap
en una cadena JSON antes de pasarla como parámetroObject
.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()
enfirebase_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ámetroObject
.– Agregar
+ '/sap'
al método.ref()
para acceder a un nodo específico en la base de datos en tiempo real de Firebase.