Forma correta de trabalhar com vários Future async await #17
-
Olá pessoal, estou com um problema onde tenho um metodo Future que chama diversos outros metodos, o que eles fazem é baixar dados de uma API e depois fazer insert no banco local Sqflite. Obs: sei isso pois fico atualizando a todo momento pasta onde fica o banco e ele fica constantemente subindo de tamanho até acabar o processo Segue exemplo de uma das chamadas da API... obs: todas são iguais somente muda a API Metodo que chama todas as API Future fetchAllSyncronization(BuildContext context) async {
final ClienteProdutoStore clienteProdutoStore = await Modular.get();
final ClienteLinhaProdutoStore clienteLinhaProdutoStore = await Modular.get();
final ClienteGrupoProdutoStore clienteGrupoProdutoStore = await Modular.get();
final CrmOcorrenciaStore crmOcorrenciaStore = await Modular.get();
final CrmSemVendaOcorrenciaStore crmSemVendaOcorrenciaStore =
await Modular.get();
final CrmSemVendaStore crmSemVendaStore = await Modular.get();
final EntradaEstoqueDiaStore entradaEstoqueDiaStore = await Modular.get();
final EquipeMetasStore equipeMetasStore = await Modular.get();
final MetasStore metasStore = await Modular.get();
final PedidoFaturadoItemStore pedidoFaturadoItemStore = await Modular.get();
final PedidoVendaFaturadoStore pedidoVendaFaturadoStore = await Modular.get();
final PesquisaClienteStore pesquisaClienteStore = await Modular.get();
final PesquisaStore pesquisaStore = await Modular.get();
final PlanejamentoVisitaVendedorStore planejamentoVisitaVendedorStore =
await Modular.get();
final SaldoFlexStore saldoFlexStore = await Modular.get();
final SupervisorStore supervisorStore = await Modular.get();
final TituloChequePendenteStore tituloChequePendenteStore =
await Modular.get();
final TotalVendasClienteStore totalVendasClienteStore = await Modular.get();
final TotalVendasGrupoProdutoStore totalVendasGrupoProdutoStore =
await Modular.get();
final TotalVendasLinhaProdutoStore totalVendasLinhaProdutoStore =
await Modular.get();
final TotalVendasProdutoStore totalVendasProdutoStore = await Modular.get();
final VendasVendedoresDiaStore vendasVendedoresDiaStore = await Modular.get();
final VendasVendedoresMesStore vendasVendedoresMesStore = await Modular.get();
final VendedoresStore vendedoresStore = await Modular.get();
LoadingIndicatorDialog().show(context, text: 'Cliente Produto');
await clienteProdutoStore.fetchClienteProduto();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Cliente Linha Produto');
await clienteLinhaProdutoStore.fetchClienteLinhaProduto();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Cliente Grupo Produto');
await clienteGrupoProdutoStore.fetchClienteGrupoProduto();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Crm Ocorrencia');
await crmOcorrenciaStore.fetchCrmOcorrencia();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Crm Sem Venda Ocorrencia');
await crmSemVendaOcorrenciaStore.fetchCrmSemVendaOcorrencia();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Crm Sem Venda');
await crmSemVendaStore.fetchCrmSemVenda();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Entrada Estoque Dia');
await entradaEstoqueDiaStore.fetchEntradaEstoqueDia();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Equipes Metas');
await equipeMetasStore.fetchEquipeMetas();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Metas');
await metasStore.fetchMetas();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Pedido Faturado Item');
await pedidoFaturadoItemStore.fetchPedidoFaturadoItem();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Pedido Venda Faturado');
await pedidoVendaFaturadoStore.fetchPedidoVendaFaturado();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Pesquisa Cliente');
await pesquisaClienteStore.fetchPesquisaCliente();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Pesquisa');
await pesquisaStore.fetchPesquisa();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Planejamento Visita Vendedor');
await planejamentoVisitaVendedorStore.fetchPlanejamentoVisitaVendedor();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Saldo Flex');
await saldoFlexStore.fetchSaldoFlex();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Supervisor');
await supervisorStore.fetchSupervisor();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Titulo Cheque Pendente');
await tituloChequePendenteStore.fetchTituloChequePendente();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Total Vendas Cliente ');
await totalVendasClienteStore.fetchTotalVendasCliente();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Total Vendas Grupo Produto');
await totalVendasGrupoProdutoStore.fetchTotalVendasGrupoProduto();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Total Vendas Linha Produto');
await totalVendasLinhaProdutoStore.fetchTotalVendasLinhaProduto();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Total Vendas Produto');
await totalVendasProdutoStore.fetchTotalVendasProduto();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Vendas Vendedores Dia');
await vendasVendedoresDiaStore.fetchVendasVendedoresDia();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Vendas Vendedores Mes');
await vendasVendedoresMesStore.fetchVendasVendedoresMes();
LoadingIndicatorDialog().dismiss();
LoadingIndicatorDialog().show(context, text: 'Vendedores');
await vendedoresStore.fetchVendedores();
LoadingIndicatorDialog().dismiss();
}
Store que é chamado pelo metodo anterior class ClienteProdutoStore extends ValueNotifier<ClienteProdutoState> {
final ClienteProdutoService service;
ClienteProdutoStore(this.service) : super(InitialClienteProdutoState());
Future fetchClienteProduto() async {
value = LoadingClienteProdutoState();
try {
final clienteProdutos = await service.fetchClienteProduto();
value = SuccessClienteProdutoState(clienteProdutos);
} catch (e) {
value = ErrorClienteProdutoState(e.toString());
}
}
}
Service que é chamado pelo Store class ClienteProdutoService {
Uno uno;
Map<String, String> headersApiInfo = getHeaders();
ClienteProdutoService(this.uno);
Future<List<ClienteProdutoModel>> fetchClienteProduto() async {
HttpOverrides.global = MyHttpOverrides();
final response = await uno.post(
"https://$ipExterno:$porta/flextotal/ws/integracao/APISUPER01/consultar",
headers: headersApiInfo,
data: {
'CDSUPERVISOR': 1001,
});
final list = response.data as List;
list.forEach(
(element) async {
await DBHelper.insertClienteProduto(
ClienteProdutoModel.fromMap(element),
);
return;
},
);
final clienteProdutos =
list.map((e) => ClienteProdutoModel.fromMap(e)).toList();
return clienteProdutos;
}
}
Insert no banco que é chamado pelo service static Future<int> insertClienteProduto(
ClienteProdutoModel clienteProdutoModel) async {
final db = await database;
return await db!.insert(
'cliente_produto',
clienteProdutoModel.toMap(),
);
}
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 8 replies
-
@seadramdesenv |
Beta Was this translation helpful? Give feedback.
-
Você pode usar Future.wait e colocar todas as variáveis tipo Future ali. Ao invés de executar um por um ele irá executar todos em paralelo finalizando apenas quando o Future mais demorado terminar a execução Ex:
Observe que retirei os "await" da frente do Modular.get para ele me retornar o Future do método a ser executado posteriormente |
Beta Was this translation helpful? Give feedback.
Você pode usar Future.wait e colocar todas as variáveis tipo Future ali. Ao invés de executar um por um ele irá executar todos em paralelo finalizando apenas quando o Future mais demorado terminar a execução
Ex:
Observe que retirei os "await" da frente do Modular.get para ele me retornar o Future do método a ser executado posteriormente