Los desarrolladores de Dart y Flutter pueden utilizar Web3Dart para el desarrollo en Ethereum, permitiendo aplicaciones móviles y web multiplataforma.
La principal biblioteca Ethereum para los ecosistemas Dart y Flutter, que proporciona capacidades completas de interacción con blockchain.
import 'package:web3dart/web3dart.dart';
import 'package:http/http.dart';
class EthereumService {
final Web3Client client;
EthereumService(String rpcUrl) : client = Web3Client(rpcUrl, Client());
Future<EtherAmount> getBalance(String address) async {
final addr = EthereumAddress.fromHex(address);
return await client.getBalance(addr);
}
Future<String> sendTransaction({
required Credentials credentials,
required String to,
required BigInt amount,
}) async {
final transaction = await client.sendTransaction(
credentials,
Transaction(
to: EthereumAddress.fromHex(to),
value: EtherAmount.fromBigInt(EtherUnit.wei, amount),
),
);
return transaction;
}
}
Nota Importante: Especifique siempre un límite de gas al crear transacciones para evitar fallos inesperados. La biblioteca Web3Dart intentará estimar el gas, pero se recomiendan valores explícitos para aplicaciones en producción.
Ejemplo de un widget Flutter usando Web3Dart para mostrar el saldo de una wallet:
import 'package:flutter/material.dart';
import 'package:web3dart/web3dart.dart';
class WalletWidget extends StatefulWidget {
_WalletWidgetState createState() => _WalletWidgetState();
}
class _WalletWidgetState extends State<WalletWidget> {
final ethereum = EthereumService('YOUR_ETHEREUM_NODE_URL');
EtherAmount? balance;
Future<void> updateBalance() async {
final newBalance = await ethereum.getBalance('YOUR_ADDRESS');
setState(() {
balance = newBalance;
});
}
Widget build(BuildContext context) {
return Card(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
children: [
Text('Balance: ${balance?.getValueInUnit(EtherUnit.ether)} ETH'),
ElevatedButton(
onPressed: updateBalance,
child: Text('Refresh Balance'),
),
],
),
),
);
}
}
Consejo de Rendimiento: Para aplicaciones Flutter en producción, considera implementar mecanismos de caché y patrones de actualización en segundo plano para evitar llamadas RPC excesivas que podrían afectar la capacidad de respuesta de la aplicación.
Trabajando con contratos inteligentes en Dart con seguridad de tipos completa:
class SmartContractService {
final Web3Client client;
final DeployedContract contract;
SmartContractService(String rpcUrl, String contractAddress, String abi)
: client = Web3Client(rpcUrl, Client()),
contract = DeployedContract(
ContractAbi.fromJson(abi, 'YourContract'),
EthereumAddress.fromHex(contractAddress),
);
Future<List<dynamic>> callFunction(
String functionName,
List<dynamic> params,
) async {
final function = contract.function(functionName);
final result = await client.call(
contract: contract,
function: function,
params: params,
);
return result;
}
}
Nota de Seguridad: Al manejar claves privadas en aplicaciones Flutter, utiliza soluciones de almacenamiento seguro como
flutter_secure_storage
para proteger credenciales sensibles. Nunca codifiques claves privadas directamente en el código de tu aplicación.
Manejo adecuado de errores en Dart para aplicaciones Ethereum robustas:
class EthereumException implements Exception {
final String message;
final dynamic originalError;
EthereumException(this.message, [this.originalError]);
String toString() => 'EthereumException: $message';
}
extension EtherAmountExtension on EtherAmount {
String formatEther([int decimals = 4]) {
return getValueInUnit(EtherUnit.ether).toStringAsFixed(decimals);
}
}