

{"id":123331,"date":"2024-07-20T18:00:32","date_gmt":"2024-07-20T12:30:32","guid":{"rendered":"https:\/\/data-flair.training\/blogs\/?p=123331"},"modified":"2026-06-01T14:21:27","modified_gmt":"2026-06-01T08:51:27","slug":"flutter-news-aggregator-app","status":"publish","type":"post","link":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/","title":{"rendered":"Flutter Project &#8211; News Aggregator App"},"content":{"rendered":"<p>In the fast-paced digital age, staying informed has never been more crucial. A news aggregator app is designed to simplify the way you access and consume news. It serves as a centralized hub, collecting headlines and articles from a wide range of reputable sources, eliminating the need to jump between multiple apps or websites.<\/p>\n<h2>About Flutter News Aggregator App<\/h2>\n<p>In this project, we will build a News Aggregator app in Flutter. We will use the NY Times developer API to get the latest news on this project. We will build three screens: one to show the various news headlines from which the user can select, the other to show a detailed summary of particular news, and last, to show a screen if the request sent through the API failed.<\/p>\n<h3>Prerequisites For Flutter News Aggregator project<\/h3>\n<p><strong>In order to build the News Aggregator app on Flutter, we would need the following things:<\/strong><\/p>\n<p>(i) <strong>Flutter &#8211;<\/strong> Refer to the link for installing <a href=\"https:\/\/docs.flutter.dev\/get-started\/install\">Flutter<\/a>, depending on your operating system.<\/p>\n<p>(ii)<strong> Android Studio &#8211;<\/strong> You can download <a href=\"https:\/\/developer.android.com\/studio\">Android Studio<\/a>. This is necessary as it will run the app in the Android emulator.<\/p>\n<p>(iii) <strong>Visual Studio Code &#8211;<\/strong> Although this is not necessary, you can also build apps in Android Studio. But in our case, we have used <a href=\"https:\/\/code.visualstudio.com\/download\">VS code<\/a> as it is a good code editor.<\/p>\n<p>(iv)<strong> NY Times Developer API Key<\/strong><span style=\"margin: 0px;padding: 0px\"><strong>\u2014<\/strong>We will use this to get news from the NY Times. You can get the API key by creating an app on your account on\u00a0<a href=\"https:\/\/developer.nytimes.com\/\" target=\"_blank\" rel=\"noopener\">NY Times Developer<\/a><\/span>.<\/p>\n<p>Now that the setup is ready, let\u2019s get started!<\/p>\n<h3>Download Flutter News Aggregator Project<\/h3>\n<p>Please download the source code of the Flutter News Aggregator Project: <a href=\"https:\/\/drive.google.com\/file\/d\/1awbXarWDYJPuDhQZxWbduU2nWLjC3DHQ\/view?usp=drive_link\"><strong>Flutter News Aggregator Project Code.<\/strong><\/a><\/p>\n<h3>Creating New Flutter News Aggregator Project<\/h3>\n<p><strong>First, let\u2019s create a new project in Flutter by doing the following steps:-<\/strong><\/p>\n<p>1. Go to the directory where you want to save the project using:-<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd  $Project-directory-path\r\n<\/pre>\n<p>2. Then create a new project using the below command:-<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">flutter create news_aggregator\r\n<\/pre>\n<p><a href=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/12\/create-flutter-news-aggregator-project.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-132542 size-full\" src=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/12\/create-flutter-news-aggregator-project.webp\" alt=\"create flutter news aggregator project\" width=\"568\" height=\"53\" \/><\/a><\/p>\n<h3>Changes in pubsec.yaml file<\/h3>\n<h4>In order to build the application, we would need the following three libraries:-<\/h4>\n<p><strong>http &#8211;<\/strong> We will use this to send the request to the NY Times developer API to get the news. It can be installed using the below mentioned command:-<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">flutter pub add http<\/pre>\n<p><strong>intl &#8211;<\/strong> This library we will be using to format date in the required format, to show when the news was published. The command mentioned below can be used to install the library:-<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">flutter pub add intl<\/pre>\n<p><strong>url_launcher<\/strong> &#8211; We will be using this library to open a url. Url_launcher can be installed using the following:-<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">flutter pub add url_launcher<\/pre>\n<p>You can see that the installed libraries would reflect changes in the pubsec.yaml file, as seen in the image below.<\/p>\n<p><a href=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/12\/installed-libraries.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-132543 size-full\" src=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/12\/installed-libraries.webp\" alt=\"installed libraries\" width=\"1198\" height=\"485\" \/><\/a><\/p>\n<h3>Steps to Build News Aggregator App<\/h3>\n<h4>1. Building Main Layout of the App<\/h4>\n<p>Let\u2019s start by building the main layout of the app. We are using \u2018MaterialApp\u2019 widget to create the basic structure of the app. Here we are defining the theme to be used for which we have created the color scheme using \u2018ColorScheme.fromSeed\u2019. In the \u2018home\u2019 argument, we are returning the Scaffold widget to define the basic visual structure. Inside the Scaffold, we defined the backgroundColor and appBar and returned the \u2018HomePage\u2019 widget, which we will create later in the \u2018body\u2019 argument.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import 'package:flutter\/material.dart';\r\n\r\nimport '.\/home_page.dart';\r\n\r\nfinal ColorScheme kColorSceheme =\r\n    ColorScheme.fromSeed(seedColor: Colors.black87);\r\nvoid main() {\r\n  return runApp(\r\n    MaterialApp(\r\n      debugShowCheckedModeBanner: false,\r\n      theme: ThemeData(\r\n          useMaterial3: true,\r\n          colorScheme: kColorSceheme,\r\n          primaryColor: Colors.black87,\r\n          appBarTheme: AppBarTheme(\r\n            backgroundColor: Colors.black,\r\n          )),\r\n      home: Scaffold(\r\n        backgroundColor: Colors.white,\r\n        appBar: AppBar(\r\n          title: const Text(\r\n            'News Aggregator (By DataFlair)',\r\n            textAlign: TextAlign.center,\r\n            style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white),\r\n          ),\r\n          shadowColor: Colors.black,\r\n        ),\r\n        body: HomePage(),\r\n      ),\r\n    ),\r\n  );\r\n}<\/pre>\n<h4>2. Creating Model for Articles2<\/h4>\n<p>The below code is used to create class for the news article, where we accept several parameters such as the title of the page, summary of the page, URL for the image, timeStamp and url to the main article of the NY Times.<\/p>\n<p><strong>We also defined a few functions such as:-<\/strong><\/p>\n<p><strong>(i) getArticleDetailsFrmJasonObj &#8211;<\/strong> This function is used to extract the parameters we defined above from the jasonObject which we received through the API call and converts them into the required data type.<\/p>\n<p><strong>(ii) get formattedTime &#8211;<\/strong> This is a getter function used to convert the date in the required format using the intl package which we installed in our pubsec file.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import 'package:intl\/intl.dart';\r\n\r\nclass Article {\r\n  String title;\r\n  String summary;\r\n  String imageURL;\r\n  int timeStamp;\r\n  String url;\r\n\r\n  Article(\r\n      {required this.title,\r\n      required this.summary,\r\n      required this.imageURL,\r\n      required this.timeStamp,\r\n      required this.url});\r\n\r\n  static Article getArticleDetailsFrmJasonObj(dynamic jsonObj) {\r\n    String title = jsonObj['title'];\r\n    String url = jsonObj['url'];\r\n    String summary = jsonObj['abstract'];\r\n    List multiMediaList = jsonObj['multimedia'];\r\n\r\n    int length = multiMediaList.length;\r\n    String imageURL = multiMediaList[length - 1]['url'];\r\n\r\n    int timeStamp =\r\n        DateTime.parse(jsonObj['created_date']).microsecondsSinceEpoch;\r\n\r\n    return Article(\r\n        title: title,\r\n        summary: summary,\r\n        imageURL: imageURL,\r\n        timeStamp: timeStamp,\r\n        url: url);\r\n  }\r\n\r\n  @override\r\n  String toString() {\r\n    return \"title = $title; summary = $summary; imageURL = $imageURL; \"\r\n        \"timeStamp = $timeStamp; url = $url\";\r\n  }\r\n\r\n  String get formattedTime {\r\n    var timeStamp = DateTime.fromMicrosecondsSinceEpoch(this.timeStamp);\r\n    var formatter = DateFormat('dd MMM, yyyy. HH:mm');\r\n    return formatter.format(timeStamp);\r\n  }\r\n}<\/pre>\n<h4>3. Building Home Page with Necessary Functions<\/h4>\n<p>Now, let\u2019s build the home page of the app, which will open when a user opens the app. It is a stateful widget as the content on the page which is the news articles, needs to be updated and may change.<\/p>\n<p>We have imported several packages here such as <strong>material.dart<\/strong> for the UI, <strong>dart:convert<\/strong> to convert b\/w different data representations,<strong>http<\/strong> to send API requests and other custom widgets which we will create in the next section.<\/p>\n<p>We have also imported a file called \u2018configurations.dart\u2019, where we store the NY Times API key.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import 'package:flutter\/material.dart';\r\nimport 'dart:convert';\r\nimport 'dart:io';\r\n\r\nimport 'package:http\/http.dart' as http;\r\nimport 'package:news_aggregator\/models\/article.dart';\r\nimport 'widgets\/articleWidget.dart';\r\nimport 'widgets\/retryRequest.dart';\r\nimport 'configurations.dart';\r\n\r\nclass HomePage extends StatefulWidget {\r\n  const HomePage({super.key});\r\n  @override\r\n  State&lt;HomePage&gt; createState() {\r\n    return _HomePageState();\r\n  }\r\n}<\/pre>\n<p>In the code below, we have defined a few variables and functions that we will use to write code for the logic and user interactions.<\/p>\n<p><strong>The variables we have defined are:-<\/strong><\/p>\n<p><strong>a. _isRequestSent &#8211;<\/strong> This is a boolean variable. It is used to check if the request has been successfully sent or not.<\/p>\n<p><strong>b. _isRequestFailed &#8211;<\/strong> This boolean variable is used to check if the API request sent has failed or not.<\/p>\n<p><strong>c. articlesList &#8211;<\/strong> It is used to store a list of the object of the article which we will show on our page.<\/p>\n<p><strong>The functions we are using are:-<\/strong><\/p>\n<p><strong>a. sendRequest &#8211; I<\/strong>t is used to send requests to the API and get the articles. In the url, we have also passed the API key, which you will get through the NY Times developer page. Using http.get, we will get the API call response. If it is successful, we will decode it using json and get the required parameters.<\/p>\n<p><strong>b. requestError &#8211;<\/strong> This function sets both the variables, _isRequestSent and _isRequestFailed to true.<\/p>\n<p><strong>c. retryRequest &#8211;<\/strong> This function sets both the variables, _isRequestSent and _isRequestFailed to false.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">class _HomePageState extends State&lt;HomePage&gt; {\r\n  bool _isRequestSent = false;\r\n  bool _isRequestFailed = false;\r\n  List&lt;Article&gt; articlesList = [];\r\n\r\n  void sendRequest() async {\r\n    String url =\r\n        \"https:\/\/api.nytimes.com\/svc\/topstories\/v2\/technology.json?api-key=$API_KEY\";\r\n    try {\r\n      http.Response response = await http.get(Uri.parse(url));\r\n      \/\/ Checking if the request was success or not\r\n      if (response.statusCode == HttpStatus.ok) {\r\n        \/\/print('Request Success');\r\n        Map decode = json.decode(response.body);\r\n        List results = decode['results'];\r\n        \/\/ Parsing the result\r\n        for (var jsonObject in results) {\r\n          var article = Article.getArticleDetailsFrmJasonObj(jsonObject);\r\n          articlesList.add(article);\r\n        }\r\n        setState(() {\r\n          _isRequestSent = true;\r\n        });\r\n      } else {\r\n        print(response.statusCode);\r\n        print(\"Request not success\");\r\n        requestError();\r\n      }\r\n    } catch (e) {\r\n      print(e);\r\n      requestError();\r\n    }\r\n  }\r\n\r\n  void requestError() {\r\n    setState(() {\r\n      _isRequestSent = true;\r\n      _isRequestFailed = true;\r\n    });\r\n  }\r\n\r\n  void retryRequest() {\r\n    setState(() {\r\n      _isRequestSent = false;\r\n      _isRequestFailed = false;\r\n    });\r\n  }<\/pre>\n<p>In the build function, firstly we are checking if the API request has been sent or not and if not, we are sending request. Then we are returning a \u2018Container\u2019 widget whose alignment is set to center. In the child argument, depending on the condition we are returning widgets. If _isRequestSent is false, we are returning a CircularProgressIndicator, then is the _isRequestSent is true and _isRequestFailed is true, we return \u2018RetryRequest\u2019 widget, which we will create in the helper widgets section.<\/p>\n<p>Finally, if both _isRequestSent is true and _isRequestFailed is false, we are returning the list of articles using \u2018ListView.builder\u2019 and in the itemBuilder function returning the ArticleWidget, which is a custom we will create in the helper widgets section for the current article.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"> @override\r\n  Widget build(BuildContext context) {\r\n    if (!_isRequestSent) {\r\n      sendRequest();\r\n    }\r\n    return Container(\r\n      alignment: Alignment.center,\r\n      child: !_isRequestSent\r\n          ? const CircularProgressIndicator()\r\n          : _isRequestFailed\r\n              ? RetryRequest(\r\n                  retry: retryRequest,\r\n                )\r\n              : ListView.builder(\r\n                  itemCount: articlesList.length,\r\n                  itemBuilder: (ctx, index) =&gt;\r\n                      ArticleWidget(article: articlesList[index]),\r\n                ),\r\n    );\r\n  }\r\n}<\/pre>\n<h4>4. Building Current Article Page<\/h4>\n<p>This page will open when the user clicks on any article on the home page. This is used to show the main content of the article.<\/p>\n<p>In the below code, we have imported url_launcher package to open a url. CurrentArticlePage is a Stateful widget as the content of the page can be rendered depending upon user interaction. Here we are passing the article which we will show about using the constructor function. We have also defined openURL function, which is used to open the url on your browser once user clicks on the corresponding button.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import 'package:flutter\/material.dart';\r\nimport 'package:url_launcher\/url_launcher.dart';\r\n\r\nimport '.\/models\/article.dart';\r\n\r\nclass CurrentArticlePage extends StatefulWidget {\r\n  const CurrentArticlePage({required this.article, super.key});\r\n  final Article article;\r\n  @override\r\n  State&lt;CurrentArticlePage&gt; createState() {\r\n    \/\/ ignore: no_logic_in_create_state\r\n    return _CurrentArticlePageState(article);\r\n  }\r\n}\r\n\r\nclass _CurrentArticlePageState extends State&lt;CurrentArticlePage&gt; {\r\n  _CurrentArticlePageState(this.article);\r\n  Article article;\r\n\r\n  void openURL() async {\r\n    String url = article.url;\r\n    print(url);\r\n    Uri uri = Uri(scheme: 'https', path: url);\r\n    if (await canLaunchUrl(uri)) {\r\n      await launchUrl(uri);\r\n      \/\/print(\"Launching\");\r\n    } else {\r\n      \/\/print(\"Not Launching\");\r\n      SnackBar(\r\n        content: Text(\"Cannot Open $url\"),\r\n      );\r\n    }\r\n  }<\/pre>\n<p>In the build function, we are returning Scaffold to define the basic visual structure for the page and defined an AppBar to show the title of the article. In the body argument, we are returning the Container widget where we set the margin and in the child, we are using a Column widget to show different part of the page. Inside the Column widget, we are returning title of the page inside a Text widget, Divider widget which has SizedBox above and below it to give some gap b\/w widgets, Row widget which is used to show the formatted time with icon of clock horizontally to each other, image of the article using Image.network, a summary of the article using Text widget and an ElevatedButton which is used to open the url of the article on your browser.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">@override\r\n  Widget build(BuildContext context) {\r\n    return Scaffold(\r\n      appBar: AppBar(\r\n        foregroundColor: Colors.white,\r\n        title: Text(\r\n          article.title,\r\n          style: const TextStyle(fontSize: 18, overflow: TextOverflow.fade),\r\n        ),\r\n      ),\r\n      body: Container(\r\n        margin: EdgeInsets.all(10),\r\n        child: Column(\r\n          children: [\r\n            Text(\r\n              article.title,\r\n              textAlign: TextAlign.center,\r\n              style: const TextStyle(\r\n                  color: Colors.black,\r\n                  fontSize: 20,\r\n                  fontWeight: FontWeight.bold),\r\n            ),\r\n            const SizedBox(\r\n              height: 10,\r\n            ),\r\n            const Divider(\r\n              height: 1,\r\n              color: Colors.black,\r\n            ),\r\n            const SizedBox(\r\n              height: 10,\r\n            ),\r\n            Row(\r\n              mainAxisAlignment: MainAxisAlignment.center,\r\n              children: [\r\n                const Icon(\r\n                  Icons.access_time,\r\n                  color: Colors.grey,\r\n                ),\r\n                Padding(\r\n                  padding: const EdgeInsets.symmetric(horizontal: 10),\r\n                  child: Text(article.formattedTime),\r\n                )\r\n              ],\r\n            ),\r\n            Container(\r\n              width: double.infinity,\r\n              height: 150,\r\n              margin: const EdgeInsets.all(10),\r\n              child: Image.network(\r\n                article.imageURL,\r\n                fit: BoxFit.cover,\r\n              ),\r\n            ),\r\n            Text(\r\n              article.summary,\r\n              style: const TextStyle(fontSize: 16),\r\n            ),\r\n            Container(\r\n              margin: const EdgeInsets.all(20),\r\n              child: ElevatedButton(\r\n                onPressed: openURL,\r\n                child: const Text(\"READ MORE\"),\r\n              ),\r\n            )\r\n          ],\r\n        ),\r\n      ),\r\n    );\r\n  }\r\n}<\/pre>\n<h4>5. Helper Widgets<\/h4>\n<p>This widget, ArticleWidget, shows a glimpse of the news articles on the home screen for each news site. Here, we are accepting an article to show the constructor function.<\/p>\n<p>In the build function, we are returning the GestureDetector widget, which, when the user taps, will lead to that complete Article Page, which we created in the previous section using the Navigator.push function. In the child argument, we are returning a Container where we have defined the color and margin and through which we are showing the Card widget which gives a nice look to the UI. Inside the Card widget, we are returning a Row Widget as the content is arranged horizontally where we show the image of the article using Image.network and a Column widget inside the Expanded widget.<\/p>\n<p>Through the Column widget we are displaying the formatted Time and the title of the article. One important thing is that while using the Text widget to show the title, the overflow property is set to TextOverflow.fade, which fades the text if it is too large and protects it from bugs in our code.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import 'package:flutter\/material.dart';\r\n\r\nimport 'package:news_aggregator\/models\/article.dart';\r\nimport '..\/currentArticlePage.dart';\r\n\r\nclass ArticleWidget extends StatelessWidget {\r\n  const ArticleWidget({required this.article, super.key});\r\n\r\n  final Article article;\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return GestureDetector(\r\n      onTap: () {\r\n        Navigator.push(\r\n            context,\r\n            MaterialPageRoute(\r\n                builder: (BuildContext ctx) =&gt;\r\n                    CurrentArticlePage(article: article)));\r\n      },\r\n      child: Container(\r\n        color: Theme.of(context).primaryColor,\r\n        margin: const EdgeInsets.symmetric(horizontal: 5, vertical: 5),\r\n        child: Card(\r\n          color: Theme.of(context).primaryColor,\r\n          elevation: 3.0,\r\n          child: Row(\r\n            children: [\r\n              Container(\r\n                width: 150,\r\n                child: Image.network(article.imageURL, fit: BoxFit.fill),\r\n              ),\r\n              Expanded(\r\n                child: Column(\r\n                  crossAxisAlignment: CrossAxisAlignment.center,\r\n                  children: [\r\n                    Container(\r\n                      margin: const EdgeInsets.symmetric(horizontal: 10),\r\n                      width: double.infinity,\r\n                      child: Text(\r\n                        article.formattedTime,\r\n                        style:\r\n                            const TextStyle(fontSize: 14, color: Colors.white),\r\n                        textAlign: TextAlign.start,\r\n                      ),\r\n                    ),\r\n                    Container(\r\n                      margin: const EdgeInsets.all(10),\r\n                      child: Text(\r\n                        article.title,\r\n                        style:\r\n                            const TextStyle(fontSize: 18, color: Colors.white),\r\n                        overflow: TextOverflow.fade,\r\n                      ),\r\n                    ),\r\n                  ],\r\n                ),\r\n              ),\r\n            ],\r\n          ),\r\n        ),\r\n      ),\r\n    );\r\n  }\r\n}<\/pre>\n<p><strong>RetryRequest<\/strong> is a stateless widget used on the home screen and shown when the request fails. Here, we are accepting the retry function through the constructor function we created in the home page widget.<\/p>\n<p>In the build function, we are returning Column widget, inside which we are showing the Text that the request has failed and an ElevatedButton through which retry function is called. Both these widgets are separated by SizedBox widget.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">import 'package:flutter\/material.dart';\r\n\r\nclass RetryRequest extends StatelessWidget {\r\n  const RetryRequest({super.key, required this.retry});\r\n\r\n  final void Function() retry;\r\n  @override\r\n  Widget build(BuildContext context) {\r\n    return Container(\r\n      child: Column(\r\n        mainAxisAlignment: MainAxisAlignment.center,\r\n        children: [\r\n          const Text(\r\n            'Request Failed!',\r\n            style: TextStyle(fontSize: 16),\r\n          ),\r\n          const SizedBox(\r\n            height: 15,\r\n          ),\r\n          ElevatedButton(\r\n              style: ElevatedButton.styleFrom(\r\n                backgroundColor: Colors.black87,\r\n              ),\r\n              onPressed: () {\r\n                retry;\r\n              },\r\n              child: const Text(\r\n                'RETRY!',\r\n                style: TextStyle(color: Colors.white),\r\n              ))\r\n        ],\r\n      ),\r\n    );\r\n  }\r\n}<\/pre>\n<h3>Flutter News Aggregator Output<\/h3>\n<p><a href=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/12\/flutter-news-aggregator-app-putput.webp\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-132871 size-full\" src=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/12\/flutter-news-aggregator-app-putput.webp\" alt=\"flutter news aggregator app output\" width=\"1200\" height=\"787\" \/><\/a><\/p>\n<h3>Conclusion<\/h3>\n<p>This Flutter News Aggregator project was full of amazing widgets and various packages we used like http, intl, url_launcher. In this project, we got to learn several things like how to send an http request, how to decode json format, how to format date and much more. We also used various widgets like CircularProgressIndicator, ListView.builder, Divider, Image.network, Expanded and many more. We also created our own custom model of the article which helped in maintaining our code.<\/p>\n<p>I hope you enjoyed working on this project!<br \/>\nThank you for reading! Keep Learning Flutter!<span hidden class=\"__iawmlf-post-loop-links\" data-iawmlf-links=\"[{&quot;id&quot;:104,&quot;href&quot;:&quot;https:\\\/\\\/docs.flutter.dev\\\/get-started\\\/install&quot;,&quot;archived_href&quot;:&quot;http:\\\/\\\/web-wp.archive.org\\\/web\\\/20250914042324\\\/https:\\\/\\\/docs.flutter.dev\\\/get-started\\\/install&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2025-12-05 21:21:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-10 11:35:53&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-13 15:22:01&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-16 23:25:27&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-20 05:48:48&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-23 20:06:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-27 02:37:50&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-30 06:04:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-03 08:38:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-06 15:40:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-10 16:01:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-14 09:38:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-17 17:00:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-21 03:52:14&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-24 14:31:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-29 04:30:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-02 06:09:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-06 16:05:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-11 06:18:59&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-15 16:39:34&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-23 19:54:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:36:36&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 02:56:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-07 21:41:59&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-11 19:44:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-15 11:06:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-22 12:54:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-26 02:54:47&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-02 13:36:10&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 15:34:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-10 06:29:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-13 12:55:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 07:13:02&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-21 08:07:48&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-26 16:50:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-29 22:58:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-03 15:32:29&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-06 23:55:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-12 01:48:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-15 20:55:56&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-19 17:46:14&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-22 18:34:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-26 13:42:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-31 15:28:25&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-05 03:46:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-08 15:19:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-13 01:12:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-16 02:14:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-20 07:49:46&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-23 19:18:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-28 04:16:03&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-02 02:12:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-06 12:41:42&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-12 15:36:12&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-16 08:55:42&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-20 05:29:30&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-25 11:05:10&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-29 03:30:39&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-07-29 03:30:39&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:105,&quot;href&quot;:&quot;https:\\\/\\\/developer.android.com\\\/studio&quot;,&quot;archived_href&quot;:&quot;http:\\\/\\\/web-wp.archive.org\\\/web\\\/20251202124635\\\/https:\\\/\\\/developer.android.com\\\/studio&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2025-12-05 21:21:07&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-09 10:52:29&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-12 14:56:07&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-16 00:19:09&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-19 07:25:53&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-22 10:42:11&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-26 03:17:56&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2025-12-29 06:25:55&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-01 10:52:49&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-04 17:32:46&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-08 15:52:46&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-01-11 22:04:15&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-15 00:17:50&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-18 14:43:54&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-22 12:08:47&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-25 13:13:07&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-01-29 01:03:13&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-01 18:04:59&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-05 06:37:55&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-08 09:12:53&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-11 13:41:30&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-15 11:39:22&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-18 13:52:15&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-21 16:17:18&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-25 02:36:20&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-02-28 05:56:50&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-03 14:23:47&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-07 01:25:34&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-10 10:45:18&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-13 23:35:02&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-17 04:39:01&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-20 04:41:40&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-23 06:47:41&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-26 17:19:43&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-03-30 07:29:08&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-02 13:36:10&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-05 18:44:52&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-08 20:57:23&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-11 22:58:17&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-15 10:52:19&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-18 16:28:10&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-22 05:16:23&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-26 02:09:28&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-29 08:32:16&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-02 14:37:35&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-05 17:27:15&quot;,&quot;http_code&quot;:429},{&quot;date&quot;:&quot;2026-05-09 00:11:31&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-12 03:42:11&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-15 05:35:22&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-19 07:55:47&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-22 16:31:55&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-26 13:42:38&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-05-30 15:02:52&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-02 16:31:52&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-06 12:02:38&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-10 16:59:14&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-13 18:01:54&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-17 05:27:52&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-22 00:49:18&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-06-26 11:58:19&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-06-29 14:46:02&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-03 00:52:42&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-06 04:29:00&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-09 04:45:32&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-12 15:36:13&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-16 00:31:42&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-19 01:47:51&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-22 03:28:21&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-25 23:34:00&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-29 03:24:00&quot;,&quot;http_code&quot;:503}],&quot;broken&quot;:true,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-07-29 03:24:00&quot;,&quot;http_code&quot;:503},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:106,&quot;href&quot;:&quot;https:\\\/\\\/code.visualstudio.com\\\/download&quot;,&quot;archived_href&quot;:&quot;http:\\\/\\\/web-wp.archive.org\\\/web\\\/20251204121135\\\/https:\\\/\\\/code.visualstudio.com\\\/download&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2025-12-05 21:21:11&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-09 06:36:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-13 13:39:51&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-16 16:39:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-20 05:48:47&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-23 15:52:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-26 16:42:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-30 06:04:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-03 08:38:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-06 11:44:47&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-09 15:03:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-12 17:34:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-16 07:23:38&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-19 08:10:24&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-22 12:08:46&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-25 13:13:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-01-28 16:33:40&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-02 06:09:04&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-05 11:09:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-10 05:12:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-13 09:16:38&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-16 09:57:52&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-02-20 19:12:00&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-24 07:09:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-27 11:07:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-03 02:56:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-06 10:14:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-10 09:42:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-13 21:54:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-17 09:04:15&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-22 09:38:30&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-25 18:47:58&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-29 09:14:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-01 13:26:26&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-05 13:53:54&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-08 14:38:46&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-12 03:23:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 10:52:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-18 16:28:11&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-22 05:16:24&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-04-25 15:25:43&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-28 18:00:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-02 00:06:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-05 06:50:53&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-11 05:39:12&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-14 08:20:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-17 14:13:55&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-21 06:49:17&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-25 07:48:29&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-28 08:01:28&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-05-31 15:28:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-03 17:34:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-06 23:32:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-10 14:18:20&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-13 15:09:34&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-17 05:27:51&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-21 17:20:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-26 11:58:19&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-30 04:57:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-03 05:35:31&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-06 12:41:44&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-10 06:52:21&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-13 16:40:15&quot;,&quot;http_code&quot;:503},{&quot;date&quot;:&quot;2026-07-17 00:33:35&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-20 06:17:52&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-24 11:50:09&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-28 01:32:41&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-07-28 01:32:41&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:126,&quot;href&quot;:&quot;https:\\\/\\\/developer.nytimes.com&quot;,&quot;archived_href&quot;:&quot;http:\\\/\\\/web-wp.archive.org\\\/web\\\/20250906191241\\\/https:\\\/\\\/developer.nytimes.com\\\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2025-12-06 00:16:13&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-11 23:32:37&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2025-12-19 11:56:49&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-02-28 10:32:05&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-03-22 12:54:22&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-06 15:34:07&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-12 03:23:57&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-15 20:28:23&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-04-27 22:41:08&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-01 08:37:06&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-18 10:03:27&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-22 00:49:17&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-06-30 23:53:33&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-05 08:09:15&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-18 18:42:34&quot;,&quot;http_code&quot;:206},{&quot;date&quot;:&quot;2026-07-27 07:44:14&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-07-27 07:44:14&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:2614,&quot;href&quot;:&quot;https:\\\/\\\/drive.google.com\\\/file\\\/d\\\/1awbXarWDYJPuDhQZxWbduU2nWLjC3DHQ\\\/view?usp=drive_link&quot;,&quot;archived_href&quot;:&quot;http:\\\/\\\/web-wp.archive.org\\\/web\\\/20260601085228\\\/https:\\\/\\\/drive.google.com\\\/file\\\/d\\\/1awbXarWDYJPuDhQZxWbduU2nWLjC3DHQ\\\/view?usp=drive_link&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-06-02 08:35:07&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-06-18 10:03:26&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-06-22 00:49:20&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-06-30 23:53:33&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-07-05 08:09:14&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-07-18 18:42:34&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-07-27 07:44:17&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-07-27 07:44:17&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]\"><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the fast-paced digital age, staying informed has never been more crucial. A news aggregator app is designed to simplify the way you access and consume news. It serves as a centralized hub, collecting&#46;&#46;&#46;<\/p>\n","protected":false},"author":86671,"featured_media":123985,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28289],"tags":[30249,32684,30263,30264,30262,30251,30252,32685,21609,30266,30265],"class_list":["post-123331","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-flutter-tutorials","tag-flutter","tag-flutter-news-aggregator","tag-flutter-news-aggregator-app","tag-flutter-news-aggregator-app-project","tag-flutter-project","tag-flutter-project-for-practice","tag-flutter-project-ideas","tag-news-aggregator","tag-news-aggregator-app","tag-news-aggregator-app-project","tag-news-aggregator-app-using-flutter"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flutter Project - News Aggregator App - DataFlair<\/title>\n<meta name=\"description\" content=\"This Flutter News Aggregator project was full of using amazing widgets and various packages we used like http, intl, url_launcher.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter Project - News Aggregator App - DataFlair\" \/>\n<meta property=\"og:description\" content=\"This Flutter News Aggregator project was full of using amazing widgets and various packages we used like http, intl, url_launcher.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/\" \/>\n<meta property=\"og:site_name\" content=\"DataFlair\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DataFlairWS\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-20T12:30:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-01T08:51:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/11\/news-aggregator-app.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"TechVidvan Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@DataFlairWS\" \/>\n<meta name=\"twitter:site\" content=\"@DataFlairWS\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"TechVidvan Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flutter Project - News Aggregator App - DataFlair","description":"This Flutter News Aggregator project was full of using amazing widgets and various packages we used like http, intl, url_launcher.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/","og_locale":"en_US","og_type":"article","og_title":"Flutter Project - News Aggregator App - DataFlair","og_description":"This Flutter News Aggregator project was full of using amazing widgets and various packages we used like http, intl, url_launcher.","og_url":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/","og_site_name":"DataFlair","article_publisher":"https:\/\/www.facebook.com\/DataFlairWS\/","article_published_time":"2024-07-20T12:30:32+00:00","article_modified_time":"2026-06-01T08:51:27+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/11\/news-aggregator-app.webp","type":"image\/webp"}],"author":"TechVidvan Team","twitter_card":"summary_large_image","twitter_creator":"@DataFlairWS","twitter_site":"@DataFlairWS","twitter_misc":{"Written by":"TechVidvan Team","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#article","isPartOf":{"@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/"},"author":{"name":"TechVidvan Team","@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/person\/0e594f928e31fc96628ac40f6ae74f49"},"headline":"Flutter Project &#8211; News Aggregator App","datePublished":"2024-07-20T12:30:32+00:00","dateModified":"2026-06-01T08:51:27+00:00","mainEntityOfPage":{"@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/"},"wordCount":1697,"commentCount":0,"publisher":{"@id":"https:\/\/data-flair.training\/blogs\/#organization"},"image":{"@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#primaryimage"},"thumbnailUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/11\/news-aggregator-app.webp","keywords":["flutter","flutter news aggregator","flutter news aggregator app","flutter news aggregator app project","flutter project","flutter project for practice","flutter project ideas","news aggregator","news aggregator app","news aggregator app project","news aggregator app using flutter"],"articleSection":["Flutter Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/","url":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/","name":"Flutter Project - News Aggregator App - DataFlair","isPartOf":{"@id":"https:\/\/data-flair.training\/blogs\/#website"},"primaryImageOfPage":{"@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#primaryimage"},"image":{"@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#primaryimage"},"thumbnailUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/11\/news-aggregator-app.webp","datePublished":"2024-07-20T12:30:32+00:00","dateModified":"2026-06-01T08:51:27+00:00","description":"This Flutter News Aggregator project was full of using amazing widgets and various packages we used like http, intl, url_launcher.","breadcrumb":{"@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#primaryimage","url":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/11\/news-aggregator-app.webp","contentUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2023\/11\/news-aggregator-app.webp","width":1200,"height":628,"caption":"news aggregator app"},{"@type":"BreadcrumbList","@id":"https:\/\/data-flair.training\/blogs\/flutter-news-aggregator-app\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog Home","item":"https:\/\/data-flair.training\/blogs\/"},{"@type":"ListItem","position":2,"name":"Flutter Tutorials","item":"https:\/\/data-flair.training\/blogs\/category\/flutter-tutorials\/"},{"@type":"ListItem","position":3,"name":"Flutter Project &#8211; News Aggregator App"}]},{"@type":"WebSite","@id":"https:\/\/data-flair.training\/blogs\/#website","url":"https:\/\/data-flair.training\/blogs\/","name":"DataFlair","description":"Learn Today. Lead Tomorrow.","publisher":{"@id":"https:\/\/data-flair.training\/blogs\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/data-flair.training\/blogs\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/data-flair.training\/blogs\/#organization","name":"DataFlair","url":"https:\/\/data-flair.training\/blogs\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/logo\/image\/","url":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2016\/07\/Data-Flair.png","contentUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2016\/07\/Data-Flair.png","width":106,"height":48,"caption":"DataFlair"},"image":{"@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DataFlairWS\/","https:\/\/x.com\/DataFlairWS","https:\/\/www.linkedin.com\/company\/dataflair-web-services-pvt-ltd\/","https:\/\/www.youtube.com\/user\/DataFlairWS"]},{"@type":"Person","@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/person\/0e594f928e31fc96628ac40f6ae74f49","name":"TechVidvan Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c89190da3d4010c71ba476b618ab10fdc2335c82cdfa0ad5002d98d0f2473444?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c89190da3d4010c71ba476b618ab10fdc2335c82cdfa0ad5002d98d0f2473444?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c89190da3d4010c71ba476b618ab10fdc2335c82cdfa0ad5002d98d0f2473444?s=96&d=mm&r=g","caption":"TechVidvan Team"},"description":"TechVidvan Team provides high-quality content &amp; courses on AI, ML, Data Science, Data Engineering, Data Analytics, programming, Python, DSA, Android, Flutter, full stack web dev, MERN, and many latest technology.","url":"https:\/\/data-flair.training\/blogs\/author\/test001\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts\/123331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/users\/86671"}],"replies":[{"embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/comments?post=123331"}],"version-history":[{"count":9,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts\/123331\/revisions"}],"predecessor-version":[{"id":148699,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts\/123331\/revisions\/148699"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/media\/123985"}],"wp:attachment":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/media?parent=123331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/categories?post=123331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/tags?post=123331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}