0
People I am trying to return data from my api in the application and I am using Getx to manage the state, but in my View I am having the error Rangeerror (index): Invalid value: Valid value range is Empty: 0, I print the return of the api in the view and is return the right value.
follows the code below:
//View
import 'package:aurora_mobile/src/controllers/home_controller.dart';
import 'package:aurora_mobile/src/controllers/pedido_controller.dart';
import 'package:aurora_mobile/src/rotas/RouteGenerator.dart';
import 'package:aurora_mobile/src/tiles/check_pedidos_tile.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class ListaPedidos extends StatefulWidget {
String result;
ListaPedidos(this.result);
@override
_ListaPedidosState createState() => _ListaPedidosState();
}
class _ListaPedidosState extends State<ListaPedidos> {
HomeController homeController = Get.find();
PedidoController pedidoController = Get.find();
PedidoController controller = Get.put(PedidoController());
@override
void initState() {
super.initState();
pedidoController.getPedidoData(widget.result, homeController.cnpj);
controller.checkeds.clear();
}
@override
void dispose() {
super.dispose();
pedidoController.pedidos.clear();
controller.checkeds.clear();
}
@override
Widget build(BuildContext context) {
print("Views: "+widget.result);
return Scaffold(
appBar: AppBar(
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Image.asset(
"assets/imagens/LOGO.jpg",
width: 100,
height: 100,
),
Text(
"Armazém Geral\n${homeController.empresa}\nPerfil: ${homeController.perfil}",
style: TextStyle(
color: Colors.black,
fontSize: 12
),
),
IconButton(
color: Colors.black87,
icon: Icon(Icons.logout),
onPressed: (){
Navigator.pushReplacementNamed(context, RouteGenerator.ROTA_LOGIN);
},
)
],
),
backgroundColor: Colors.white,
),
body: Container(
child: Obx((){
if(pedidoController.loading.value){
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation(
Colors.blue
),
),
);
}else if(pedidoController.pedidos.isEmpty){
return Center(
child: Text("Não foi encontrado dados"),
);
}else{
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: ListView.builder(
itemCount: pedidoController.pedidos.length,
itemBuilder: (_, index){
print("View Pedido: "+pedidoController.pedidos[index].produto);
return Obx(() => CheckboxPedidos(
nota: pedidoController.pedidos[index].notaFiscal,
produto: pedidoController.pedidos[index].produto,
lote: pedidoController.pedidos[index].lote,
qtd: pedidoController.pedidos[index].qtdDisp,
unidade: pedidoController.pedidos[index].unidMedida,
cnpjCli: homeController.cnpj,
uz: pedidoController.pedidos[index].palete,
checked: controller.checkeds[index],
selectAll: pedidoController.selectAll,
serial: pedidoController.pedidos[index].loteSerial,
cubagem: pedidoController.pedidos[index].cubagem,
qtd_total: pedidoController.pedidos[index].qtdTotal,
qtd_uz: pedidoController.pedidos[index].qtdUz,
index: index,
)
);
},
)
)
],
);
}
}),
),
floatingActionButtonLocation: FloatingActionButtonLocation.endDocked,
floatingActionButton: FloatingActionButton(
elevation: 8,
backgroundColor: Colors.orange,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.home, color: Colors.white70),
Text("Inicio",
style: TextStyle(
fontSize: 10,
color: Colors.white70
),
)
],
),
onPressed: (){
Navigator.pushReplacementNamed(context, RouteGenerator.ROTA_HOME);
},
),
bottomNavigationBar: BottomAppBar(
elevation: 8,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: 15,
),
RaisedButton(
child: SizedBox(
height: 68,
child: Row(
children: [
Icon(Icons.arrow_back, color: Colors.white70),
//Text("Voltar", style: TextStyle(color: Colors.white70))
],
),
),
color: Colors.orange,
shape: CircleBorder(),
onPressed: (){
Navigator.pushReplacementNamed(context, RouteGenerator.ROTA_PALETE);
}
),
SizedBox(
width: 20,
),
RaisedButton(
elevation: 8,
child: SizedBox(
height: 55,
child: Row(
children: [
Text("Gerar Pedido", style: TextStyle(color: Colors.white))
],
),
),
color: Colors.lightBlue,
onPressed: (){
// showDialog(
// context: context,
// builder: (context){
// return AlertDialog(
// title: Text("Autoriza Remontagem?"),
// content: DropdownButtonFormField(
// icon: Icon(Icons.arrow_drop_down),
// iconSize: 40,
// isExpanded: true,
// elevation: 16,
// style: TextStyle(color: Colors.orangeAccent),
// // value: _selected,
// onChanged: (newValue){
//
// },
// items: status.map((Status status) {
// return DropdownMenuItem<Status>(
// value: status,
// child: Text(status.status)
// );
// }).toList(),
// ),
// actions: [
// FlatButton(
// onPressed: () => Navigator.pop(context),
// child: Text("Cancelar")
// ),
// FlatButton(
// onPressed:() async {
//
//
// Navigator.pop(context);
// } ,
// child: Text("Salvar")
// ),
// ],
// );
// }
// );
}
),
],
),
)
);
}
}
//Controller
import 'package:aurora_mobile/src/model/PedidosUZ.dart';
import 'package:aurora_mobile/src/repository/pedido_repository.dart';
import 'package:get/get.dart';
class PedidoController extends GetxController {
RxBool loading = false.obs;
RxList<PedidosUZ> pedidos = <PedidosUZ>[].obs;
final checkeds = <bool>[].obs;
bool selectAll = false;
//Puxar os dados da Api
Future getPedidoData(String busca, String cnpjCli) async {
loading.value = true;
print("Contoller Pedido: "+busca+" "+cnpjCli);
pedidos.addAll(await PedidoRepository.getDados(busca, cnpjCli));
loading.value = false;
}
}
//Class
class PedidosUZ {
String notaFiscal;
String loteSerial;
String produto;
String qtdDisp;
String lote;
String unidMedida;
String cnpj;
String palete;
String cubagem;
String timeStamp;
String qtdTotal;
String qtdUz;
PedidosUZ(
{this.notaFiscal,
this.loteSerial,
this.produto,
this.qtdDisp,
this.lote,
this.unidMedida,
this.cnpj,
this.palete,
this.cubagem,
this.timeStamp,
this.qtdTotal,
this.qtdUz});
PedidosUZ.fromJson(Map<String, dynamic> json) {
notaFiscal = json['nota_fiscal'];
loteSerial = json['lote_serial'];
produto = json['produto'];
qtdDisp = json['qtd_disp'];
lote = json['lote'];
unidMedida = json['unid_medida'];
cnpj = json['cnpj'];
palete = json['palete'];
cubagem = json['cubagem'];
timeStamp = json['time_stamp'];
qtdTotal = json['qtd_total'];
qtdUz = json['qtd_uz'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['nota_fiscal'] = this.notaFiscal;
data['lote_serial'] = this.loteSerial;
data['produto'] = this.produto;
data['qtd_disp'] = this.qtdDisp;
data['lote'] = this.lote;
data['unid_medida'] = this.unidMedida;
data['cnpj'] = this.cnpj;
data['palete'] = this.palete;
data['cubagem'] = this.cubagem;
data['time_stamp'] = this.timeStamp;
data['qtd_total'] = this.qtdTotal;
data['qtd_uz'] = this.qtdUz;
return data;
}
}
//Repository
import 'package:aurora_mobile/src/model/PedidosUZ.dart';
import 'package:aurora_mobile/src/util/api_pedido.dart';
class PedidoRepository {
static Future<List<PedidosUZ>> getDados(String busca, String cnpjCli) async {
List<PedidosUZ> dados = [];
var map = await ApiPedido.buscaPedidos(busca, cnpjCli);
var listaMaps = map;
if(listaMaps != null && listaMaps.isNotEmpty){
listaMaps.forEach((m) => dados.add(PedidosUZ.fromJson(m)));
}
print("Repository Pedido: "+dados[0].notaFiscal);
return dados;
}
}
//api
import 'dart:convert';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
class ApiPedido {
static final URL = 'http://localhost/camera/api.php';
static Future buscaPedidos(String busca, String cnpjCli) async {
var client = http.Client();
try{
var response = await client.get(URL + "?action=pesquisaPedido"
"&busca=$busca"
"&cnpj=$cnpjCli"
);
//Map<String, dynamic> resp = json.decode(response.body);
var resp = json.decode(response.body);
print("Api Pedido: "+response.body);
return resp;
}catch(e){
Get.snackbar("Erro ao Conectar", "Não foi possível acessar o servidor $e");
}finally{
client.close();
}
}
}