#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. Да, просто я ждал несколько минут, не мог сделать этого раньше.