Анализ объекта внутри объекта с помощью API Flutter и JSON

#flutter #rest

Вопрос:

Я пытаюсь получить ссылку на изображение из сервиса REST, который я уже создал. Это результат работы GET:

 {
    "products": {
        "_id": "60abddf1413e7c408c103f6a",
        "product_image": "www.google.com",
        "createdAt": "2021-05-24T17:10:09.738Z",
        "__v": 0
    }
}
 

И это мой код маршрута, вызывающего эту службу GET в flutter:

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

import 'package:http/http.dart' as http;

Future<Album> fetchAlbum() async {
  final response =
      await http.get(Uri.parse('http://10.0.2.2:3000/product/last'));

  if (response.statusCode == 200) {
    return Album.fromJson(jsonDecode(response.body));
  } else {
    throw Exception('Failed to load album');
  }
}

class Product {
  final String product_image;
  final String createdAt;

  Product({
    this.product_image,
    this.createdAt
  });

  factory Product.fromJson(Map<String, dynamic> json) {
    return Product(
      product_image: json['product_image'],
      createdAt: json['createdAt']
    );
  }
}

class Album {
  final Product products;

  Album({
    this.products,
  });

  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      products: json['products']
    );
  }
}

class PromotionsPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    final arg = ModalRoute.of(context).settings.arguments;
    Future<Album> futureAlbum = fetchAlbum();

    return Scaffold(
      appBar: AppBar(
        title: Text('Promotions Page'),
      ),
      body: Center(
          child: FutureBuilder<Album>(
            future: futureAlbum,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Text(snapshot.data.products.product_image);
              } else if (snapshot.hasError) {
                return Text("${snapshot.error}");
              }

              // By default, show a loading spinner.
              return CircularProgressIndicator();
            },
          ),
        ),
    );
  }
}
 

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

введите описание изображения здесь

Ответ №1:

Вы не вызываете свой Product.fromJson конструктор в своем Album.fromJson конструкторе. json['products'] является a Map , и вы пытаетесь присвоить его a Product .

Вызов Product.fromJson :

 factory Album.fromJson(Map<String, dynamic> json) {
  return Album(
    products: Product.fromJson(json['products']),
  );
}
 

Комментарии:

1. Ты потрясающая, большое тебе спасибо. Я подумал, что, поскольку я определил его в конструкторе, я не должен настраивать его так снова. Спасибо.

2. @FeberCastellon, пожалуйста, примите ответ, если он решил вашу проблему.

3. Да, просто я ждал несколько минут, не мог сделать этого раньше.