3

I have a JSON app calling users but I am having problems dealing with null Maps.

This is the Json file.

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": {

        }
      }
    }
  ]
}

And the dart file is as follows:

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
          ),
    );
  }
}

This is the error I am getting:

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.

I am trying to build a list of the user's entitlements but I am not so sure as to how to deal with a null key such as "IP". The app works as long as the key has values inside but will return the exception if the key is null.

How should I deal with this problem?

2 Answers 2

5

IP is empty JsonObject

"IP": {},

So when you try to access data of IP object it returns null & passing that to textview later gives data is null error.

You are trying to get data from json object without keys as

var ip_ent = jsonEntDataIP["Entitlement"];

And using later as

new Text(ip_ent)

To overcome this you need to assign default value in case of variable is null or can hide that view as your requirement.

To assign default value in case of null, please do this.

var ip_ent = jsonEntDataIP["Entitlement"] ?? '';
Sign up to request clarification or add additional context in comments.

1 Comment

Nice explanation. Thanks Dhiraj.
3
var jsonEntDataIP = jsonEntData["IP"] ?? '';

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.