Ошибка NewsAPi не может ничего показать на экране, но на самом деле я получаю данные в консоли

Основной файл dart на самом деле я создаю новостное приложение, которое получает информацию о новостях с помощью файла json, но я не могу показать данные на экране

  import 'package:flutter/material.dart';
    import 'package:newsapi/model.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      Future<NewsApi> news;
    
      @override
      void initState() {
        super.initState();
        news = news;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("MovieApp"),
          ),
          body: FutureBuilder<NewsApi>(
              future: news,
              builder: (context, snapshot) {
                return Text(snapshot.data.articles.toString());
              }),
        );
      }
    }

Мой класс Netwrok

import 'dart:convert';

import 'package:http/http.dart';
import 'package:newsapi/model.dart';

class Network {
  Future<NewsApi> getNews() async {
    var finalurl =
        "https://newsapi.org/v2/top-headlines?country=us&apiKey=cdffcc6901e24943ad89df8cdb69a0eb";
    final Response response = await get(Uri.encodeFull(finalurl));
    if (response.statusCode == 200) {
      print("NEws:${response.body}");
      return NewsApi.fromJson(jsonDecode(response.body));
    } else {
      throw Exception("Error Getting the data");
    }
  }
}

мой основной класс модели, созданный расширением gtihub, я просто использую инструмент преобразования json в dart

class NewsApi {
  String status;
  int totalResults;
  List<Articles> articles;

  NewsApi({this.status, this.totalResults, this.articles});

  NewsApi.fromJson(Map<String, dynamic> json) {
    status = json['status'];
    totalResults = json['totalResults'];
    if (json['articles'] != null) {
      articles = new List<Articles>();
      json['articles'].forEach((v) {
        articles.add(new Articles.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['status'] = this.status;
    data['totalResults'] = this.totalResults;
    if (this.articles != null) {
      data['articles'] = this.articles.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Articles {
  Source source;
  String author;
  String title;
  String description;
  String url;
  String urlToImage;
  String publishedAt;
  String content;

  Articles(
      {this.source,
      this.author,
      this.title,
      this.description,
      this.url,
      this.urlToImage,
      this.publishedAt,
      this.content});

  Articles.fromJson(Map<String, dynamic> json) {
    source =
        json['source'] != null ? new Source.fromJson(json['source']) : null;
    author = json['author'];
    title = json['title'];
    description = json['description'];
    url = json['url'];
    urlToImage = json['urlToImage'];
    publishedAt = json['publishedAt'];
    content = json['content'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.source != null) {
      data['source'] = this.source.toJson();
    }
    data['author'] = this.author;
    data['title'] = this.title;
    data['description'] = this.description;
    data['url'] = this.url;
    data['urlToImage'] = this.urlToImage;
    data['publishedAt'] = this.publishedAt;
    data['content'] = this.content;
    return data;
  }
}

class Source {
  String id;
  String name;

  Source({this.id, this.name});

  Source.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name = json['name'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['name'] = this.name;
    return data;
  }
}

Я получаю сообщение об ошибке. При построении FutureBuilder (грязный, состояние: _FutureBuilderState # 6b8bd) была выброшена следующая ошибка NoSuchMethodError: получатель 'article' был вызван с нулевым значением. Получатель: null Пробовали звонить: статьи


person Ali Hassan    schedule 21.11.2020    source источник
comment
успешно получаю данные из api, но я пробую другой метод, но не отображается только на экране мобильного устройства   -  person Ali Hassan    schedule 21.11.2020


Ответы (1)


В initState () вы назначили класс NewsApi для Future news вместо функции getNews ().

это работает.

  @override
  void initState() {
    super.initState();
    news = Network().getNews();
  }

РЕДАКТИРОВАТЬ: отображение данных

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("MovieApp"),
      ),
      body: FutureBuilder<NewsApi>(
        future: news,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            final data = snapshot.data.articles;
            return ListView.builder(
              itemCount: data.length,
              itemBuilder: (BuildContext context, int index) {
                return Padding(
                  padding: const EdgeInsets.all(8),
                  child: Column(
                    children: [
                      if (data[index].urlToImage != null)
                        Image.network(data[index].urlToImage),
                      Text(
                        data[index].title,
                        style: Theme.of(context).textTheme.bodyText1,
                      ),
                      Divider()
                    ],
                  ),
                );
              },
            );
          } else
            return Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
person Mr Random    schedule 21.11.2020
comment
Теперь я получаю ответ от api, но, пожалуйста, скажите мне, как показать эти данные, которые я получаю от api, я использую future builder, но данные, которые я хочу показать, я не могу показать на экране мобильного телефона - person Ali Hassan; 22.11.2020