Разобрать изображение из json api

Я пытаюсь работать с Dog API, пытаясь получить случайное изображение породы и отобразить его в ListTile.

Класс модели

class DogData {
  DogData ({this.message, this.status});
  String message;
  String status;

  factory DogData.fromJson(Map<String, dynamic> json) => DogData (
    message: json["message"],
    status: json["status"],
  );

  Map<String, dynamic> toJson() => {
    "message": message,
    "status": status,
  };
}

Внутри ListTile есть ошибка, неопределенное имя индекса. Где я ошибся и как это исправить?

import 'package:flutter/material.dart';
import 'package:practice_5/model/breedModel.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:flutter/foundation.dart';
class BreedListTile extends StatelessWidget {
  Future<List<DogData>> fetchDogs(http.Client client) async {
    final response = await client.get('https://dog.ceo/api/breeds/image/random');
    return compute(parseDog, response.body);
  }
  List<DogData> parseDog(responseBody) {
    final parsed = jsonDecode(responseBody) as List;
    return parsed.map<DogData>((json) => DogData.fromJson(json)).toList();
  }
  BreedListTile({Key key, List<DogData> dogList})
      : _dogList = dogList,
        super(key: key);
  final List<DogData> _dogList;

  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        title: Text('Test title'),
        subtitle: Text('Test subtitle'),
        leading: Container(
          child: Image.asset(_dogList[index].message),
        ),
        onTap: () {},
      ),
    );
  }
}

person Sam324    schedule 19.10.2020    source источник


Ответы (1)


Вам нужно использовать ListTile под виджетом ListView. Попробуйте что-то вроде этого:

ListView.builder
  (
    itemCount: _dogList.length,
    itemBuilder: (BuildContext ctxt, int index) {
     return Card(
      child: ListTile(
        title: Text('Test title'),
        subtitle: Text('Test subtitle'),
        leading: Container(
          child: Image.network(_dogList[index].message),
        ),
        onTap: () {},
      ),
    )


Изменить:

Кстати, вы пытаетесь получить изображение по URL-адресу. Итак, вам нужно использовать Image.network('url'). Прочтите подробнее.

person Akif    schedule 19.10.2020
comment
По какой-то причине _dogList.length = null - person Sam324; 19.10.2020