TypeError (type 'int' is not a subtype of type 'double') flutter

Issue

I am trying to do a http.get request to fetch a data i have already posted(working perfectly) to firebase (realtime storage) but whennever I call the method that gets the data, It throws an error of _TypeError (type ‘int’ is not a subtype of type ‘double’) Please note, I am using provider state management

Below is the method used to fecth my data

Future<void> getAndSetProducts() async {
    const url = 'https://shop-12901-default-rtdb.firebaseio.com/products.json';
    try {
      final response = await http.get(Uri.parse(url));
      var extractedResponse =
          json.decode(response.body) as Map<String, dynamic>;
      List<Product> loadedProducts = [];
      extractedResponse.forEach((prodId, product) {
        loadedProducts.add(
          Product(
            id: prodId,
            title: product['title'],
            price: product['price'], //-Sure the error is from here but not sure of how to resolve it-
            imageUrl: product['imageUrl'],
            description: product['description'],
            isFavorite: product['isFavorite'],
          ),
        );
      });
      _items = loadedProducts;
      notifyListeners();
    } catch (error) {
      throw error; //--------TypeError (type 'int' is not a subtype of type 'double')-------
    }
  }

Below is also the method where I call my method above to perform its task

@override
  void didChangeDependencies() {
    if (_isInit) {
      setState(() {
      isLoading = true;
    });
      try {
        Provider.of<Products>(context).getAndSetProducts().then((_) {
          setState(() {
            isLoading = false;
          });
        });
      } catch (error) {
        print(error);
      }
    }
    _isInit = false;
    super.didChangeDependencies();
  }

Solution

Try to fetch the price as a num then parse it to double.

Future<void> getAndSetProducts() async {
    const url = 'https://shop-12901-default-rtdb.firebaseio.com/products.json';
    try {
      final response = await http.get(Uri.parse(url));
      var extractedResponse =
          json.decode(response.body) as Map<String, dynamic>;
      List<Product> loadedProducts = [];
      extractedResponse.forEach((prodId, product) {
        loadedProducts.add(
          Product(
            id: prodId,
            title: product['title'],
            price: (product['price'] as num).toDouble(), //Try this
            imageUrl: product['imageUrl'],
            description: product['description'],
            isFavorite: product['isFavorite'],
          ),
        );
      });
      _items = loadedProducts;
      notifyListeners();
    } catch (error) {
      throw error; //--------TypeError (type 'int' is not a subtype of type 'double')-------
    }
  }

Answered By – Boris Kayi

Answer Checked By – Candace Johnson (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published.