Estou tentando buscar uma única linha de dados do Supabase usando o seguinte código:
// supabase_service.dart
Future<Map<String, dynamic>> fetchTransaction(int id) async {
return await _supabaseClient
.from('transactions')
.select()
.eq('id', id)
.single();
}
Estou chamando esse código de um widget sem estado assim:
final int id;
final dbservice = SupabaseService();
@override
Widget build(BuildContext context) {
final transaction = dbservice.fetchTransaction(id);
// do stuff with result
Text('TXN ID: ${transaction["id"]}'); // <---error
Entretanto, quando tento usar 'transaction', recebo o seguinte erro:
The operator '[]' isn't defined for the type 'Future<Map<String, dynamic>>'
Não consigo descobrir se o erro é porque estou tentando acessar os dados incorretamente ou se é porque preciso processar os dados de alguma forma antes de acessá-los.
Como @thenry respondeu, o valor é carregado do banco de dados, então ele não estará imediatamente disponível. É por isso que sua variável é um
Future
, e por isso você não pode acessá-la como faria com uma variável "now" normal.Você realmente não pode usar
await
nobuild
método, pois toda a construção de UI tem que acontecer de forma síncrona. Espero que isso faça sentido quando você pensar sobre isso: você sempre tem que renderizar uma UI mesmo enquanto os dados estão carregando. Nesse ponto, você normalmente vai querer renderizar algum elemento de UI que mostre que os dados estão carregando.A maneira mais simples de exibir um
Future
valor na interface do usuário é envolvê-lo emFutureBuilder
:Então você pode ver que aqui lidamos com os três estados principais:
CircularProgressIndicator
.Se isso é novidade para você, recomendo também a leitura:
FutureBuilder
.Você definiu
fetchTransaction(int id)
como umaFuture
função, então, ao chamá-la, você terá que adicionar umaawait
instrução para referenciar seu resultado de retorno.Por exemplo,
Isso deve permitir que você acesse a chave "id" no mapa retornado, se ela existir.