Flutter-Dart变量丢失并不断重新初始化

时间:2018-07-18 12:33:18

标签: json variables static dart flutter

我正在尝试使用Flutter进行测试。但是当从另一个类访问时,我的变量一直在重新初始化。

我正在使用json解析,我需要我的请求的两个部分。 “ Relatorio”部分和“ Mensagem”部分。

要解析此json,我正在这样做:

List<RelatorioProdutos> parseRelatorioPorProduto(String responseBody) {
  final parsed = json.decode(responseBody);
  var relatorio = parsed['Relatorio'];
  var mensagem = parsed['Mensagem'];
  print (mensagem); // Here the variable returns well,
 //but when i need it in other class i receive null.

  return  relatorio.map<RelatorioProdutos>((json) => new RelatorioProdutos.fromJson(json)).toList();
}

class RelatorioProdutos {
  String CodigoProduto;
  var QtdVendida;
  var TotalVendas;
  String Descricao;

  RelatorioProdutos({this.CodigoProduto, this.QtdVendida, this.TotalVendas, this.Descricao,});

  factory RelatorioProdutos.fromJson(Map json) {

    //returns a List of Maps
    return new RelatorioProdutos(

      CodigoProduto: json['CodigoProduto'] as String,
      QtdVendida: json['QtdVendida'],
      TotalVendas: json['TotalVendas'],
      Descricao: json['Descricao'] as String,
    );
  }
}

我想在另一个类中使用此'mensagem'变量为用户显示错误,但我总是收到'null'。

我已经尝试过setState,但是它会重新加载我的json,并且我不想再次请求RestServer。

从现在开始谢谢!

2 个答案:

答案 0 :(得分:0)

如果我理解正确,则希望从另一个类访问函数的局部变量。我认为这是不可能的。

一种方法是将您的响应包装在另一个包含响应和此变量的对象中:

List<Response<RelatorioProdutos>> parseRelatorioPorProduto(
    String responseBody) {
  final parsed = json.decode(responseBody);
  var relatorio = parsed['Relatorio'];
  var mensagem = parsed['Mensagem'];
  print(mensagem); // Here the variable returns well,
  //but when i need it in other class i receive null.

  return relatorio
      .map((json) => new Response<RelatorioProdutos>(
          new RelatorioProdutos.fromJson(json), mensagem))
      .toList();
}

class RelatorioProdutos {
  String CodigoProduto;
  var QtdVendida;
  var TotalVendas;
  String Descricao;

  RelatorioProdutos({
    this.CodigoProduto,
    this.QtdVendida,
    this.TotalVendas,
    this.Descricao,
  });

  factory RelatorioProdutos.fromJson(Map json) {
    //returns a List of Maps
    return new RelatorioProdutos(
      CodigoProduto: json['CodigoProduto'] as String,
      QtdVendida: json['QtdVendida'],
      TotalVendas: json['TotalVendas'],
      Descricao: json['Descricao'] as String,
    );
  }
}

class Response<T> {
  const Response(
    this.value,
    this.errorMessage,
  );

  final T value;

  final String errorMessage;

  bool get hasError => errorMessage != null;
}

在此示例中,我创建了一个Response对象,该对象可以包含响应值和错误消息。

parseRelatorioPorProduto中,我没有返回 relatorio ,而是将返回类型更改为Response<RelatorioProdutos>,以便可以从任何类访问值和错误消息。该调用该函数。

答案 1 :(得分:0)

谢谢勒萨尔,我尝试过你的想法,但是我得到了很多其他的错误。

为解决此问题,我使用了此方法:

List<RelatorioProdutos>  parseRelatorioPorProduto(String responseBody) {
  final parsed = json.decode(responseBody);
  var relatorio = parsed['Relatorio'];
  var mensagem = parsed['Mensagem'];

  if(mensagem[0].toString().substring(16,17) == "0"){
    List<RelatorioProdutos> asd = new List();
    RelatorioProdutos aimeudeus = new RelatorioProdutos(Descricao: mensagem[0].toString(), CodigoProduto: "a", TotalVendas: 0, QtdVendida: 0);
    asd.add(aimeudeus);
    return asd;
  }else{
    return relatorio.map<RelatorioProdutos>((json) => new RelatorioProdutos.fromJson(json)).toList();
  }


}