Данные флаттера! = Null

У меня есть приложение JSON, вызывающее пользователей, но у меня проблемы с нулевыми картами.

Это файл Json.

MemberInfo.json

{
"Dependents": [
    {
      "Name": "Kim",
      "Relationship": "Parent",
      "Entitlements": {
        "GP": {
          "Entitlement": "10000",
          "Utilisation": "500",
          "Balance": "9500"
        },
        "OPS": {
          "Entitlement": "10000",
          "Utilisation": "500",
          "Balance": "9500"
        },
        "IP": {
          "Entitlement": "50000",
          "Utilisation": "17000",
          "Balance": "33000"
        }
      }
    },
    {
      "Name": "Tim",
      "Relationship": "Spouse",
      "Entitlements": {
        "GP": {
          "Entitlement": "10000",
          "Utilisation": "500",
          "Balance": "9500"
        },
        "OPS": {
          "Entitlement": "10000",
          "Utilisation": "500",
          "Balance": "9500"
        },
        "IP": {

        }
      }
    }
  ]
}

А файл с дротиком выглядит следующим образом:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'dart:async';
import 'package:http/http.dart' as http;

final String url = "http://crm.emastpa.com.my/MemberInfo.json";
final String url2 = "http://crm.emastpa.com.my/MemberInfo2.json";

class Dependents extends StatelessWidget {
  Dependents({Key key, this.index, this.name, this.page}) : super(key:key);

  final int index;
  final String name;
  final int page;

  Future<String> jsonContent() async {
    var res = await http.get(
        Uri.encodeFull(url2),
        headers: {"Accept": "application/json"});
    return res.body;
  }

  @override
  Widget build(BuildContext context) {

    Widget fifthBody = new Container(
      child: new Center(
        child: new FutureBuilder<String>(
            future: jsonContent(),
            builder: (context, snapshot){
              if (snapshot.hasData){

                List<Widget> widgets = [];

                //get snapshot data from JSON tree
                var jsondecode = json.decode(snapshot.data);

                //[]->Entitlements
                var jsonEntData = jsondecode["Dependents"][index]["Entitlements"];

                //Everything under Entitlements
                var jsonEntDataGP = jsonEntData["GP"];
                var jsonEntDataOPS = jsonEntData["OPS"];
                var jsonEntDataIP = jsonEntData["IP"];

                //GP Branch
                var gp_ent = jsonEntDataGP["Entitlement"];
                var gp_util = jsonEntDataGP["Utilisation"];
                var gp_bal = jsonEntDataGP["Balance"];

                //OPS branch
                var ops_ent = jsonEntDataOPS["Entitlement"];
                var ops_util = jsonEntDataOPS["Utilisation"];
                var ops_bal = jsonEntDataOPS["Balance"];

                //IP branch
                var ip_ent = jsonEntDataIP["Entitlement"];
                var ip_util = jsonEntDataIP["Utilisation"];
                var ip_bal = jsonEntDataIP["Balance"];

                jsonEntDataGP != null?
                    widgets.add(new ExpansionTile(
                        title: new Text("GP"),
                        children: <Widget>[
                          new ListTile(
                            title: new Text("Entitlement"),
                            trailing: new Text(gp_ent),
                          )
                        ],
                    ))
                  : new Center();

                jsonEntDataOPS != null?
                widgets.add(new ExpansionTile(
                    title: new Text("OPS"),
                    children: <Widget>[
                      new ListTile(
                        title: new Text("Entitlement"),
                        trailing: new Text(ops_ent),
                      )
                    ]))
                    : new Center();

                jsonEntDataIP != null?
                  widgets.add(new ExpansionTile(
                      title: new Text("IP"),
                      children: <Widget>[
                        new ListTile(
                          title: new Text("Entitlement"),
                          trailing: new Text(ip_ent),
                        )
                      ]))
                  : new Center();


                return new Column(
                  children: widgets,
                );
              }else if (snapshot.hasError){
                return new Text(snapshot.error);
              }

              //loading the page
              return new Center(
                child: new CircularProgressIndicator(),
              );
            }),
      ),
    );

    return MaterialApp(
          home: Scaffold(
              appBar: AppBar(
                title: Text("$name + index: $index"),
              ),
              body: fifthBody
          ),
    );
  }
}

Я получаю вот такую ​​ошибку:

I/flutter ( 8842): The following assertion was thrown building FutureBuilder<String>(dirty, state:
I/flutter ( 8842): _FutureBuilderState<String>#f9262):
I/flutter ( 8842): 'package:flutter/src/widgets/text.dart': Failed assertion: line 230 pos 15: 'data != null': is not
I/flutter ( 8842): true.

Я пытаюсь составить список прав пользователя, но я не уверен, как поступать с нулевым ключом, таким как «IP». Приложение работает до тех пор, пока ключ имеет значения внутри, но вернет исключение, если ключ равен нулю.

Как мне решить эту проблему?

3
0
14 212
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

var jsonEntDataIP = jsonEntData["IP"] ?? '';
Ответ принят как подходящий

IP пустой JsonObject

"IP": {},

Поэтому, когда вы пытаетесь получить доступ к данным IP-объекта, он возвращает ноль и передает, что в текстовое представление позже дает данные, является нулевой ошибкой.

Вы пытаетесь получить данные из объекта json без ключей как

var ip_ent = jsonEntDataIP["Entitlement"];

И используя позже как

new Text(ip_ent)

Чтобы преодолеть это, вам нужно назначить значение по умолчанию в случае, если переменная равна нулю или может скрыть это представление в соответствии с вашим требованием.

Чтобы присвоить значение по умолчанию в случае null, сделайте это.

var ip_ent = jsonEntDataIP["Entitlement"] ?? '';

Хорошее объяснение. Спасибо, Дхирадж.

Asyraf Dayan 13.09.2018 08:02

Другие вопросы по теме