Home > Mobile >  Error: Property 'body' cannot be accessed on 'Response?' because it is potential
Error: Property 'body' cannot be accessed on 'Response?' because it is potential

Time:03-29

so I'am trying to learn dart and flutter and everything went well so far. But now I'am stuck at an error which I cannot handle. I coded a function which is supposed to asynchronously return the actual BTC price from https://blockchain.info/ticker.

Only thing it returns is errors:

Error: Property 'body' cannot be accessed on 'Response?' because it is potentially null.
 - 'Response' is from 'package:http/src/response.dart' ('/D:/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.4/lib/src/response.dart').
Try accessing using ?. instead.
          return Text("${BTCPrice.fromJson(jsonDecode(snapshot.data.body)).eur}");
                                                                    ^^^^
/D:/flutter/packages/flutter/lib/src/widgets/async.dart:242:12: Context: 'data' refers to a property so it couldn't be promoted.
See http://dart.dev/go/non-promo-property
  final T? data;
           ^

My Code:

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

Future<http.Response> fetchBTCPrice() async {
  final response = await http.get(Uri.https('blockhain.info', 'ticker'));
  return response;
}

Widget buildBTCPrice() {
  return FutureBuilder<http.Response>(
    future: fetchBTCPrice(),
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        int? statusCode = snapshot.data?.statusCode;
        if (statusCode == 200) {
          return Text("${BTCPrice.fromJson(jsonDecode(snapshot.data.body)).eur}");
        }
        return Text('$statusCode');

      } else if (snapshot.hasError) {
        return Text('${snapshot.error}');
      }
      return CircularProgressIndicator();
    },
  );
}

class BTCPrice {
  final double eur;
  BTCPrice({required this.eur});

  factory BTCPrice.fromJson(Map<String, dynamic> json) {
    print(json);
    return BTCPrice(
      eur: json['eur']['15m']
    );
  }
}

Last things to mention: I'am running the application on a Android Emulator powerd by Android Studio; and please feel free to hand over any advice you have (in terms of code improvement), even if it is not fixing my issue.

CodePudding user response:

To get rid of that error you need to use the bang operator to tell the compiler that snapshot.data won't be null.

if (statusCode == 200) {
  return Text(
 "${BTCPrice.fromJson(jsonDecode(snapshot.data!.body)).eur}"); // adding ! on data
}

Edit

The unrelated error you mentioned in your comment:

unexpected character (at character 1) <html><head><title>loading...</title></head><body><script type='text/javasc... ^

would be fixed by changing your GET request from this

final response = await http.get(Uri.https('blockhain.info', 'ticker'));

to this

final response = await http.get(Uri.parse('https://blockchain.info/ticker'));
  • Related