<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stanislav Ilin</title>
    <description>The latest articles on DEV Community by Stanislav Ilin (@frezyx).</description>
    <link>https://dev.to/frezyx</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F701725%2Fb518c210-ec20-429a-9b45-9508c9b104ea.jpeg</url>
      <title>DEV Community: Stanislav Ilin</title>
      <link>https://dev.to/frezyx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frezyx"/>
    <language>en</language>
    <item>
      <title>Say Goodbye to Error Chaos in Flutter with Talker 3.0</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Mon, 05 Jun 2023 13:07:34 +0000</pubDate>
      <link>https://dev.to/frezyx/say-goodbye-to-error-chaos-in-flutter-with-talker-30-6a7</link>
      <guid>https://dev.to/frezyx/say-goodbye-to-error-chaos-in-flutter-with-talker-30-6a7</guid>
      <description>&lt;p&gt;Today I want to tell you about the major v3.0 update of &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;Talker&lt;/a&gt; and why this is the best solution to logging and error handling for your Flutter / dart project. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;- Wait, you're developing it yourself, is it right? It sounds somehow too narcissistic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;- I agree, but first read the article to understand the full power of Talker 😄&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Talker?
&lt;/h2&gt;

&lt;p&gt;But firstly I want to tell you about what is Talker?&lt;br&gt;
Therefore, I suggest you watch a &lt;a href="https://dev.to/frezyx/series/19668"&gt;series of articles&lt;/a&gt; that I wrote while creating this package&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhx795tjcbip1b4ec6pzm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhx795tjcbip1b4ec6pzm.gif" alt="Pokemon"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More users
&lt;/h2&gt;

&lt;p&gt;This project has a lot of functionality, but I thought its problem was excessive complexity.&lt;/p&gt;

&lt;p&gt;I saw the feedback from the community, a lot of engineers liked the package, but it seemed to me that the project could have many more users! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr7yds2jl8wly9jbqmz6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnr7yds2jl8wly9jbqmz6.gif" alt="More users"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I should start simplifying the project and cleaning it from the overhead logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Huge update
&lt;/h2&gt;

&lt;p&gt;I needed around three weeks for make changes in &lt;a href="https://github.com/Frezyx/talker/pull/108" rel="noopener noreferrer"&gt;this&lt;/a&gt; release pull-request &lt;/p&gt;

&lt;p&gt;It's really a lot of time, but all this time I kept releasing versions in the dev branch&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52j5sj6uov0vaag88t7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F52j5sj6uov0vaag88t7s.png" alt="Changelog"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Important point for those who create their own open source library: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always create separate releases in -dev versions to make ability for users to upgrade to the stable version and don't block the main version.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally result
&lt;/h2&gt;

&lt;p&gt;After reviewing all issues in the project, communicating with the community and a long development, we released &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;version 3.0.0&lt;/a&gt; of the package&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Ftalker%2Fraw%2Fdev%2Fdocs%2Fassets%2Fv3%2Ftalker_flutter%2Ftalker.jpg%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Ftalker%2Fraw%2Fdev%2Fdocs%2Fassets%2Fv3%2Ftalker_flutter%2Ftalker.jpg%3Fraw%3Dtrue" alt="Talker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And now I want to share the results. But I don't want to go into deep details so as not to make you bored.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Lightweight
&lt;/h3&gt;

&lt;p&gt;The library code was reduced more than by 700 lines! &lt;/p&gt;

&lt;p&gt;This is a really good result, because I was thinking of creating a lightweight solution that does not affect the performance and weight of the application build.&lt;/p&gt;

&lt;p&gt;And it is also important that the functionality of the project has not suffered at all from this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyagajbbbfwwb5v5fuue.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgyagajbbbfwwb5v5fuue.jpg" alt="Code count"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ New TalkerFlutter UI/UX
&lt;/h3&gt;

&lt;p&gt;After talking to the community, I realized that a separate page with filters is inconvenient within this package and that you can take the filter and search to the main page with all the logs&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk70e4n8eto9sz7vx7p8z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk70e4n8eto9sz7vx7p8z.jpg" alt="New UI/UX"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Remove overhead logic
&lt;/h3&gt;

&lt;p&gt;In the previous version, I experimented a lot. For instance, with a bridge between packages. I wanted to provide packages with the ability to communicate, without dependencies. However, I did it in not the best way.&lt;/p&gt;

&lt;p&gt;Now, for library logs in Talker, there is an enum called WellKnownTitles. It contains all the familiar types of Talker's log system. This allowed me to get rid of a lot of code.&lt;/p&gt;

&lt;p&gt;List of all deleted and deprecated code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Remove deprecated in constructor and configure() method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LoggerFormatter? loggerFormater&lt;/li&gt;
&lt;li&gt;LoggerFilter? loggerFilter&lt;/li&gt;
&lt;li&gt;TalkerLoggerSettings? loggerSettings Now you can setup this fields only in TalkerLogger constructor&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Remove deprecated methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;handleError &lt;strong&gt;Now handle() method used&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;handleException &lt;strong&gt;Now handle() method used&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;fine() log method Now you can use the handle() method to achieve the same functionality in both methods.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Add observer field instead of removed observers&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Fixes
&lt;/h3&gt;

&lt;p&gt;Also, with the release of 3.0.0, the errors that library users wrote about in issues were fixed.&lt;/p&gt;

&lt;p&gt;Like null error string in TalkerWrapper Snackbar's, new share_plus plugin version support, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwm79tkesqdzzqf3q4uad.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwm79tkesqdzzqf3q4uad.jpg" alt="Talker wrapper"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The future of the package
&lt;/h2&gt;

&lt;p&gt;I really hope that the package will continue to evolve and become even more convenient in the future. I also want to finally sort out the documentation and create a website with a convenient package description.&lt;/p&gt;

&lt;p&gt;So, if you also want to take part in the development of this package, you are more than welcome 🙌 &lt;/p&gt;

&lt;p&gt;And thank you for reading my articles, even though I began to appear here much less often 😌&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;https://github.com/Frezyx/talker&lt;/a&gt;&lt;br&gt;
Preview: &lt;a href="https://frezyx.github.io/talker/" rel="noopener noreferrer"&gt;https://frezyx.github.io/talker/&lt;/a&gt;&lt;br&gt;
Pub: &lt;a href="https://pub.dev/packages/talker" rel="noopener noreferrer"&gt;https://pub.dev/packages/talker&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>opensource</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Link headers pagination in Flutter</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Thu, 20 Apr 2023 22:17:35 +0000</pubDate>
      <link>https://dev.to/frezyx/link-headers-pagination-in-flutter-kcd</link>
      <guid>https://dev.to/frezyx/link-headers-pagination-in-flutter-kcd</guid>
      <description>&lt;p&gt;Pagination is a common technique used in web development to improve the performance of APIs and user experience when dealing with large amounts of data. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97vicg7dmv9xj268f0eh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97vicg7dmv9xj268f0eh.gif" alt="Scroll"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is link headers pagination ?
&lt;/h2&gt;

&lt;p&gt;Link headers pagination is one of the popular pagination methods used in APIs. In this article, we will discuss link headers pagination in Dart when building an app that works with APIs.&lt;/p&gt;

&lt;p&gt;Link headers pagination is a pagination method that is used to split a large amount of data into smaller portions that can be easily retrieved. This method uses HTTP link headers to provide information about the next and previous pages of data. In this way, clients can retrieve only the data they need, reducing the load on the server and improving performance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal584b4f4hb6zf4aam5d.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal584b4f4hb6zf4aam5d.gif" alt="What"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to make it in Flutter app ?
&lt;/h2&gt;

&lt;p&gt;When building an app that works with APIs, link headers pagination can be implemented in Dart using the &lt;a href="https://github.com/Frezyx/http_pagination" rel="noopener noreferrer"&gt;http_pagination&lt;/a&gt; package. &lt;/p&gt;

&lt;p&gt;This package provides a easy headers parsing from the box.&lt;/p&gt;

&lt;p&gt;Make an initial HTTP request to the API to retrieve the first page of data. The response should contain a Link header that includes information about the next page of data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http/http.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'https://example.com/api/data'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parse the Link header to extract the URL of the next page of data. The Link header can contain a URLs with a rel attribute set to &lt;strong&gt;"first", "next", "prev", "last"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This URLs can be used as links for getting next page.&lt;br&gt;
But what we should do if we work with API froms our service or repository with writted method like in example bellow ?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;listData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;somethingRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;page:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;perPage:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghut9xnuvm09djdd1br7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghut9xnuvm09djdd1br7.gif" alt="Cat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using http_pagination package
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://github.com/Frezyx/http_pagination" rel="noopener noreferrer"&gt;http_pagination&lt;/a&gt; in your pubspec.yaml file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;http_pagination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.2.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add this simple code line after your api call&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http/http.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'https://example.com/api/data'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;pagination&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PagesPagination&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PagesPagination&lt;/strong&gt; contains int fields [first, next, prev. last]&lt;br&gt;
And you can use any of this fileds to send as current loading page in your api call. &lt;/p&gt;

&lt;h3&gt;
  
  
  Working with GitHub api example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http_pagination/http_pagination.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s"&gt;'link'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;https://api.github.com/user/9287/repos?page=3&amp;amp;per_page=100&amp;gt;; rel="next", '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;https://api.github.com/user/9287/repos?page=1&amp;amp;per_page=100&amp;gt;; rel="prev", '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;https://api.github.com/user/9287/repos?page=5&amp;amp;per_page=100&amp;gt;; rel="last"'&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;pagination&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PagesPagination&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// PagesPagination(first: null, next: 3, prev: 1, last: 5)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make a new HTTP request to the URL of the next page of data. Repeat steps 2 and 3 until there are no more pages of data to retrieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor and Pages(offset) pagination
&lt;/h2&gt;

&lt;p&gt;CursorPagination is another pagination style with same logic.&lt;br&gt;
Link types is only one difference for cliend side code.&lt;/p&gt;

&lt;p&gt;Cursor typed pagination client recive links with String id of next or last content when Pages(offset) pagination recive int index of next or last pages&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor pagination example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http_pagination/http_pagination.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s"&gt;'link'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;http://example.com/items?cursor=a&amp;gt;; rel="first", '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;http://example.com/items?cursor=b&amp;gt;; rel="next", '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;http://example.com/items?cursor=c&amp;gt;; rel="prev", '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="s"&gt;'&amp;lt;http://example.com/items?cursor=d&amp;gt;; rel="last"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;pagination&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CursorPagination&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromHeaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// CursorPagination(first: a, next: b, prev: c, last: d)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Link headers pagination is a powerful technique that can help improve the performance of your app when working with APIs that return large amounts of data. By splitting the data into smaller portions and providing information about the next and previous pages of data, clients can retrieve only the data they need, reducing the load on the server and improving performance.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>api</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Error Handling in Dart and Flutter</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Sat, 18 Feb 2023 13:33:10 +0000</pubDate>
      <link>https://dev.to/frezyx/error-handling-in-dart-and-flutter-2gld</link>
      <guid>https://dev.to/frezyx/error-handling-in-dart-and-flutter-2gld</guid>
      <description>&lt;p&gt;Hi everyone! I won't even tell you how important to handle all errors and exceptions in your Flutter application.&lt;br&gt;
&lt;strong&gt;Let's start right now with the facts!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzzyme29rysto68nmzvq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzzyme29rysto68nmzvq.gif" alt="Friends" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Error types in Dart
&lt;/h2&gt;

&lt;p&gt;We have two basic error types in Flutter. &lt;br&gt;
&lt;strong&gt;Error and Exception&lt;/strong&gt;. But what's the difference?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0i0lp2hss7ipga7l4ii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0i0lp2hss7ipga7l4ii.png" alt="Spidermans" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In dart, an "error" is a runtime problem that can't be handled by the program, while an "exception" is a runtime problem that can be handled by the program.&lt;/p&gt;
&lt;h3&gt;
  
  
  Errors
&lt;/h3&gt;

&lt;p&gt;Errors are typically caused by conditions outside the control of the program, such as hardware failure or operating system issues, and they are not expected to be handled by the program. Examples of errors in Dart include OutOfMemoryError or StackOverflowError. When an error occurs, the program will usually terminate.&lt;/p&gt;
&lt;h3&gt;
  
  
  Exceptions
&lt;/h3&gt;

&lt;p&gt;On the other hand, exceptions are caused by conditions within the program's control, such as invalid user input or network errors. Exceptions can be caught and handled by the program using a try-catch block, allowing the program to recover from the error and continue execution. Examples of exceptions in Dart include FormatException or SocketException.&lt;/p&gt;

&lt;p&gt;In summary, errors are problems that can't be handled by the program, while exceptions are problems that can be handled by the program. It's important to differentiate between the two when developing your Dart applications and handling runtime problems.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to escape them?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Use Try-Catch Blocks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try-catch blocks are a fundamental aspect of handling errors in any programming language, including Flutter. They allow you to handle exceptions that may occur during the execution of your code. When you use a try-catch block in your application, you can catch exceptions and handle them appropriately. For example, you may want to display an error message to the user or log the error for debugging purposes.&lt;/p&gt;

&lt;p&gt;Here's an example of how you can use try-catch blocks in your Flutter application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// your code here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// handle the error here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Use assert&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assert is a tool that can be used to validate assumptions about the state of your application during development. If an assertion fails, an exception is thrown, which can help you catch and debug errors early on. You can use assert statements to check whether your code is behaving as expected and to identify errors before they become problematic.&lt;/p&gt;

&lt;p&gt;Here's an example of how you can use assert in your Flutter application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myValue&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'myValue cannot be null'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Handle Platform-Specific Errors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your Flutter application targets multiple platforms, handling platform-specific errors. For example, on iOS, you may need to handle errors related to permissions, while on Android, you may need to handle errors related to device compatibility. You can ensure that your application behaves consistently across different platforms by handling platform-specific errors.&lt;/p&gt;

&lt;p&gt;Here's an example of how you can handle platform-specific errors in your Flutter application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isIOS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// handle iOS-specific errors here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isAndroid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// handle Android-specific errors here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Use Third-Party Libraries&lt;/strong&gt;&lt;br&gt;
There are several third-party libraries available for Flutter that can help you handle errors in your application. &lt;/p&gt;

&lt;p&gt;One popular library is &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;Talker&lt;/a&gt;, which provides error tracking and monitoring for your application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcbl8kktf20abgd8g9cy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqcbl8kktf20abgd8g9cy.png" alt="Talker main screen" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The talker library was designed for saving your time with error-handling process. The main concept of talker is to collect errors and redirect them to the right pipeline. &lt;/p&gt;

&lt;p&gt;For example, something errors must be shown to user while others don't. You can configure this logic very simply using talker. Some errors should be reported to your tracking system, while others should not. &lt;/p&gt;

&lt;p&gt;For such cases, in &lt;a href="https://github.com/Frezyx/talker/releases/tag/2.2.0" rel="noopener noreferrer"&gt;the latest update&lt;/a&gt; of the package, there are settings available &lt;strong&gt;even from the application&lt;/strong&gt; itself&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1vquv5za7eae5xi3c4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1vquv5za7eae5xi3c4s.png" alt="Talker screens" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to spend even less your time - we have developed add-ons for some popular libraries, such as dio and BLoC. And we continue to develop this idea.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvoax23jeds8pncy3uf40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvoax23jeds8pncy3uf40.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect with me on GitHub and pls put ✨star✨ for the &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;talker&lt;/a&gt; package. &lt;br&gt;
It will be very pleasant for our team ❤️&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>motivation</category>
    </item>
    <item>
      <title>UI Framework for Flutter. What should be included in?</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Wed, 30 Nov 2022 11:56:14 +0000</pubDate>
      <link>https://dev.to/frezyx/ui-framework-for-flutter-what-should-be-included-in-3k38</link>
      <guid>https://dev.to/frezyx/ui-framework-for-flutter-what-should-be-included-in-3k38</guid>
      <description>&lt;p&gt;Hello everyone! &lt;br&gt;
I'm tired of doing the same type of things for each of my pet projects. &lt;/p&gt;

&lt;p&gt;And I thought about creating a UI microframework for Flutter with common and base widgets / theming and flows which are most often found in all applications.&lt;/p&gt;

&lt;p&gt;Flutter packages infrastructure already have solutions for this issue&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) &lt;a href="https://github.com/ionicfirebaseapp/getwidget" rel="noopener noreferrer"&gt;GetWidget&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkjkbvmdof1zg3bavaj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkjkbvmdof1zg3bavaj6.png" alt="GetWidget" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"GetWidget has 1000+ pre-build widgets that you can reuse to develop both Flutter mobile app and web app. Our motto is to provide the best Flutter UI library to the Flutter community to speed up their development process and build awesome apps with pre-build Flutter Library Components."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flw7alxbs0vd1gdfurfyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flw7alxbs0vd1gdfurfyw.png" alt="GetWidget preview" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This solution is cool!&lt;br&gt;
But for me, this package has overloaded functionality.&lt;/p&gt;

&lt;p&gt;When I talk about standard functions, I don't mean creating a million types of buttons on top of the standard Flutter buttons&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) &lt;a href="https://github.com/Rannie/flui" rel="noopener noreferrer"&gt;FLUI&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnp7vdlat8mew51nyo5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnp7vdlat8mew51nyo5x.png" alt="FLUI" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"A powerful UI framework for Google Flutter"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8nxyowb0ody67vtdpoe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8nxyowb0ody67vtdpoe.png" alt="FLUI example" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For me it is an similar library to the previous one.&lt;br&gt;
The components look very ordinary. And it won't speed up development time for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) &lt;a href="https://github.com/Idean/Flutter-Neumorphic" rel="noopener noreferrer"&gt;flutter_neumorphic&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiin8b9wpggm2mwi18la1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiin8b9wpggm2mwi18la1.png" alt="flutter_neumorphic" width="300" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"A complete, ready to use, Neumorphic ui kit for Flutter"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6m2qzfy5jighd6r9fm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6m2qzfy5jighd6r9fm0.png" alt="Image description" width="500" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A wonderful package that I have used a few times. But that's not what I need either. This package is useful when you need to make a neumorphic UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;As a result, I can either: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make up the functionality I need from scratch. &lt;br&gt;
⚠️ For a very long time for a pet project &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or take it from different packages. &lt;br&gt;
⚠️ What does it mean to expand the list of dependencies of your application to exorbitant sizes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What do I want?
&lt;/h2&gt;

&lt;p&gt;I will definitely create such a framework for my own purposes.&lt;br&gt;
But before that I want to hear your opinion&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What do you expect from such a solution in general and what would be a reason to use it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What kind of flows would you like to see in this framework?&lt;br&gt;
(Authorization, Menu, Products Cart, ...)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What widgets would you like to see in this framework ?&lt;br&gt;
(Buttons, TextForms, Modals, ...)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am waiting for your opinion to discuss in the comments !&lt;br&gt;
Thanks a lot for your reactions ❤️&lt;/p&gt;

</description>
      <category>docker</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Filtering application logs</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Mon, 14 Nov 2022 15:01:16 +0000</pubDate>
      <link>https://dev.to/frezyx/filtering-logs-with-talker-3j7e</link>
      <guid>https://dev.to/frezyx/filtering-logs-with-talker-3j7e</guid>
      <description>&lt;p&gt;🚀 New talker feature in 2.1.0 release is filtering logs, exceptions and errors. Now I want to tell you how it works.&lt;/p&gt;

&lt;p&gt;There can be a lot of logs in a large application. Working with network via http, local storage, controllers, exceptions, errors, verbose info, etc.&lt;/p&gt;

&lt;p&gt;👀 Sometimes it becomes difficult to track something very important. And at this moment, the talker update is rushing to your aid.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Filtering data with Talker
&lt;/h2&gt;

&lt;p&gt;Let's imagine that there are a lot of logs in your application&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44trmao51lpl81gpca42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44trmao51lpl81gpca42.png" alt="Talker logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But our interest is to see only navigation logs.&lt;br&gt;
How we can make it?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphgnylvhb452jwh8mlbo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphgnylvhb452jwh8mlbo.png" alt="Talker logs selected"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add filter to your Talker constructor, or set it by configure() method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Talker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;filter:&lt;/span&gt; &lt;span class="n"&gt;BaseTalkerFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;types:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TalkerRouteLog&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Talker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;filter:&lt;/span&gt; &lt;span class="n"&gt;BaseTalkerFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;types:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TalkerRouteLog&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;types:&lt;/strong&gt; - log types driven by Talker package or your custom logs that you create. &lt;a href="https://dev.to/frezyx/colored-logs-in-flutter-application-with-talker-2d25"&gt;How I can make custom log?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx7chqznzbdbtku3duugr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx7chqznzbdbtku3duugr.gif" alt="Logs gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, how can I make it if I do not know what type of log is it?&lt;br&gt;
Talker can do it 🙂 Use &lt;strong&gt;titles:&lt;/strong&gt; filed of filter&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Talker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;filter:&lt;/span&gt; &lt;span class="n"&gt;BaseTalkerFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;titles:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'ROUTE'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result will be same as of types: [TalkerRouteLog]&lt;/p&gt;

&lt;p&gt;Thank you for reading post!&lt;br&gt;
💻 Article &lt;a href="https://github.com/Frezyx/talker/tree/master/examples/shop_app_example" rel="noopener noreferrer"&gt;example&lt;/a&gt; source code here&lt;/p&gt;

&lt;p&gt;Show some ❤️ and &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;put a star&lt;/a&gt; on the GitHub to support the project! We are trying to make the best logs and errors manager for Flutter applications.&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>I create LinkedIn account 😄</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Mon, 31 Oct 2022 11:35:53 +0000</pubDate>
      <link>https://dev.to/frezyx/i-create-linkedin-account-44ii</link>
      <guid>https://dev.to/frezyx/i-create-linkedin-account-44ii</guid>
      <description>&lt;p&gt;For the past 5 years I have been ignoring the existence of Linkedin. And so I realized that it was time to register there and study it.&lt;/p&gt;

&lt;p&gt;❤️I will be glad to welcome you into the friends on&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/frezyx/"&gt;https://www.linkedin.com/in/frezyx/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>beginners</category>
      <category>career</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Http logs in Flutter app with talker is easy as possible</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Thu, 13 Oct 2022 20:08:17 +0000</pubDate>
      <link>https://dev.to/frezyx/http-logs-in-flutter-app-with-talker-is-easy-as-possible-37o4</link>
      <guid>https://dev.to/frezyx/http-logs-in-flutter-app-with-talker-is-easy-as-possible-37o4</guid>
      <description>&lt;p&gt;A major update of the talker package has recently been released. &lt;br&gt;
New release contains updated TalkerScreen with more actions and logs file sharing, fixed logs generation and etc.&lt;/p&gt;

&lt;p&gt;😳 But another one big thing in update is &lt;a href="https://pub.dev/packages/talker_dio_logger" rel="noopener noreferrer"&gt;talker_dio_logger&lt;/a&gt; package that &lt;strong&gt;can integrate http logs as simple as it can ever be done&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Let's take it in turns.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it will works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F147yt2nkptv3w8kz49i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F147yt2nkptv3w8kz49i9.png" alt="talker_dio_logger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;talker_dio_logger is a separate package that works on the basis of &lt;a href="https://pub.dev/packages/talker" rel="noopener noreferrer"&gt;talker&lt;/a&gt; error handler and logger package and &lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;dio&lt;/a&gt; most popular and powerful dart http client.&lt;/p&gt;

&lt;p&gt;When you connect it, all information about your work on the network gets into talker's history and the console of the running application.&lt;/p&gt;
&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Follow these steps to run talker_dio_logger in your project and see all http logs&lt;/p&gt;
&lt;h3&gt;
  
  
  Add dependency
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;talker_dio_logger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.1.3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;Just add &lt;strong&gt;TalkerDioLogger&lt;/strong&gt; to your dio instance and it will work&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dio&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;interceptors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TalkerDioLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;settings:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TalkerDioLoggerSettings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;printRequestHeaders:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;printResponseHeaders:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using with Talker
&lt;/h3&gt;

&lt;p&gt;You can add your talker instance for TalkerDioLogger if your app already uses Talker.&lt;/p&gt;

&lt;p&gt;In this case, all logs and errors will fall into your unified talker tracking system&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Talker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;dio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Dio&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;interceptors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TalkerDioLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;talker:&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;settings:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TalkerDioLoggerSettings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;printRequestHeaders:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;printResponseHeaders:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;😎 Go to the &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;GitHub repository page&lt;/a&gt;! &lt;br&gt;
🥵 Here you can see beautiful examples of usage and code snippets. &lt;/p&gt;

&lt;p&gt;Show some ❤️ and star the repo to support the project! &lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>api</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Flutter database inspector storage_view</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Mon, 12 Sep 2022 18:57:49 +0000</pubDate>
      <link>https://dev.to/frezyx/flutter-database-inspector-storageview-1p9e</link>
      <guid>https://dev.to/frezyx/flutter-database-inspector-storageview-1p9e</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbin6khi9b7aw764fi6wt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbin6khi9b7aw764fi6wt.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About package
&lt;/h2&gt;

&lt;p&gt;Flutter inspector tool for any database, storage and shared_preferences.&lt;br&gt;
Check and modify database values from UI of application.&lt;/p&gt;

&lt;p&gt;It's fast introduction of &lt;a href="https://github.com/Frezyx/storage_view" rel="noopener noreferrer"&gt;storage_view&lt;/a&gt; package.&lt;/p&gt;
&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;Create one tool to inspect and interact with any database is the main thing of package.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Add dependency
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;storage_view&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^0.1.0-dev.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Add import package
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:storage_view/storage_view.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Implement driver
&lt;/h3&gt;

&lt;p&gt;The package uses a driver &lt;a href="https://github.com/Frezyx/storage_view/blob/main/packages/storage_view/lib/src/models/storage_driver.dart" rel="noopener noreferrer"&gt;StorageDriver&lt;/a&gt; to interact with the database. &lt;br&gt;&lt;br&gt;
In order to connect your database you should use one of available drivers: &lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Frezyx/storage_view/tree/main/packages/shared_preferences_storage_view_driver" rel="noopener noreferrer"&gt;shared_preferences_storage_view_driver&lt;/a&gt; that works with &lt;a href="https://pub.dev/packages/shared_preferences" rel="noopener noreferrer"&gt;shared_preferences&lt;/a&gt;  See &lt;a href="https://github.com/Frezyx/storage_view/tree/main/packages/shared_preferences_storage_view_driver/example" rel="noopener noreferrer"&gt;example&lt;/a&gt; for more information&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Frezyx/storage_view/tree/main/packages/flutter_secure_storage_view_driver" rel="noopener noreferrer"&gt;flutter_secure_storage_view_driver&lt;/a&gt; that works with &lt;a href="https://pub.dev/packages/flutter_secure_storage" rel="noopener noreferrer"&gt;flutter_secure_storage&lt;/a&gt;  See &lt;a href="https://github.com/Frezyx/storage_view/tree/main/packages/flutter_secure_storage_view_driver/example" rel="noopener noreferrer"&gt;example&lt;/a&gt; for more information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or create your own StorageDriver implementation like there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MockStorageDriver&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;StorageDriver&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'test_id'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'test'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;FutureOr&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getKeys&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toSet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;FutureOr&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;FutureOr&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;({&lt;/span&gt;&lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;FutureOr&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional information
&lt;/h2&gt;

&lt;p&gt;The project is under development and ready for your pull-requests and issues.&lt;br&gt;
Thank you for support!&lt;/p&gt;

&lt;p&gt;⛔️ It is very important to get feedback about the project. Therefore, write your opinion in the comments. Will you use this in the future ?&lt;/p&gt;

&lt;p&gt;😎 Go to the &lt;a href="https://github.com/Frezyx/storage_view" rel="noopener noreferrer"&gt;GitHub repository page&lt;/a&gt;!&lt;br&gt;
Show some ❤️ and star the repo to support the project!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Colourful logs in Flutter application with Talker</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Mon, 05 Sep 2022 20:23:25 +0000</pubDate>
      <link>https://dev.to/frezyx/colored-logs-in-flutter-application-with-talker-2d25</link>
      <guid>https://dev.to/frezyx/colored-logs-in-flutter-application-with-talker-2d25</guid>
      <description>&lt;p&gt;Hello everyone 👋&lt;br&gt;
This is a long-awaited continuation of the series of articles about the &lt;strong&gt;&lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;Talker&lt;/a&gt;&lt;/strong&gt; library 😅&lt;/p&gt;

&lt;p&gt;In this post I will tell you how to &lt;strong&gt;customize colors and text&lt;/strong&gt; of your logs using this library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zy66yilzxth5ajqa73l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zy66yilzxth5ajqa73l.png" alt="Talker colored logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's do this 🚀&lt;/p&gt;
&lt;h2&gt;
  
  
  Base logs
&lt;/h2&gt;

&lt;p&gt;1) Create application or open an existed&lt;br&gt;
You can create dart console or flutter application.&lt;br&gt;
Talker is based only on dart without flutter sdk dependency therefore you can use this package everywhere 🙂&lt;/p&gt;

&lt;p&gt;For example I create default dart console application&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb5iqmedml3vesprtcy6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb5iqmedml3vesprtcy6.png" alt="Example flutter application"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) Add talker dependency in pubspec.yaml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;talker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.3.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmna5zr7tzch80igmhfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmna5zr7tzch80igmhfo.png" alt="Talker dependency"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3) Init talker in main file of application and make simple logs in main method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:talker/talker.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Talker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'It looks like this button is not working'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'The food for lunch has already arrived'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Something bad has happened, but the app is still working'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this code, the output will be as shown below&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vb8183nhrlx17abp9i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vb8183nhrlx17abp9i9.png" alt="Base talker logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It already looks good.&lt;br&gt;
Talker can display &lt;strong&gt;8 types of logs&lt;/strong&gt; by default.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folfcosuooja44j35yuhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folfcosuooja44j35yuhd.png" alt="All talker base logs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But that may not be enough 🧐&lt;br&gt;
Good, talker have solution for this cases too 🥳&lt;/p&gt;
&lt;h2&gt;
  
  
  Custom logs
&lt;/h2&gt;

&lt;p&gt;For example our application can work with server side backend code via http-requests. And we need to show http logs with different color to highlight them in the total list of messages. &lt;/p&gt;

&lt;p&gt;1) For make custom http logs talker have TalkerLog class that you can extends with your realization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpLog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;TalkerLog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;HttpLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) OK, but how to highlight this log with a specific color?&lt;br&gt;
You can override pen field of your TalkerLog heir class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpLog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;TalkerLog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;HttpLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;AnsiPen&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;pen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AnsiPen&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cyan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) And in main function call &lt;strong&gt;talker.logTyped()&lt;/strong&gt; method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logTyped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HttpLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Http response 200'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpLog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;TalkerLog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;HttpLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;AnsiPen&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;pen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AnsiPen&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cyan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will show message like example bellow&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba7oyalkm2zje31dnytb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba7oyalkm2zje31dnytb.png" alt="Custom first example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4) More customization! ⚙️&lt;br&gt;
Like simple example we can override &lt;strong&gt;title&lt;/strong&gt; field and &lt;strong&gt;generateTextMessage&lt;/strong&gt; method&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;title&lt;/strong&gt; - Default message title. That used for console output and messages filtering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;generateTextMessage()&lt;/strong&gt; - this method creates log messages before you see it in output console. With this method you can format your messages as you want. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's see in example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logTyped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;HttpLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s"&gt;'User id is loaded'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'userId'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HttpLog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;TalkerLog&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;HttpLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;AnsiPen&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;pen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AnsiPen&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cyan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;'HTTP'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;generateTextMessage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'[&lt;/span&gt;&lt;span class="si"&gt;$displayTitle&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;$message&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;prettyData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;encoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;DATA:&lt;/span&gt;&lt;span class="si"&gt;$prettyData&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will show message like example bellow&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqedbheanysnrd0cyy0pv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqedbheanysnrd0cyy0pv.png" alt="Custom second example"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With talker you can customize a lot of other things. The article format is not enough for the entire description. If you are interested, you can look at the &lt;a href="https://github.com/Frezyx/talker/tree/master/examples/" rel="noopener noreferrer"&gt;detailed examples in the project repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;❤️ Thank you for reading post &lt;br&gt;
💻 Article example source code &lt;a href="https://github.com/Frezyx/talker/tree/master/examples/custom_logs_example" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Show some ❤️ and &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;put a star on the GitHub&lt;/a&gt; to support the project!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>ios</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to handle dart application exceptions ?</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Tue, 30 Aug 2022 13:59:39 +0000</pubDate>
      <link>https://dev.to/frezyx/how-to-handle-dart-application-exceptions--2pdf</link>
      <guid>https://dev.to/frezyx/how-to-handle-dart-application-exceptions--2pdf</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;Talker&lt;/a&gt;&lt;/strong&gt; - package to handle dart application exceptions.&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/Frezyx/talker/blob/master/docs/assets/gifs/talker_big.gif?raw=true" rel="noopener noreferrer"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Ftalker%2Fblob%2Fmaster%2Fdocs%2Fassets%2Fgifs%2Ftalker_big.gif%3Fraw%3Dtrue"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;🚀  The main goal of the project provide ability to understand where the error occurs in a short time&lt;br&gt;
✅  Can work with different state managements&lt;br&gt;
✅  Can work with any crash reporting tool (Firebase Crashlytics, Sentry, Your own, etc)&lt;br&gt;
✅  Flutter app logs UI output at screen&lt;br&gt;
✅  Integrated logs and exceptions history&lt;br&gt;
✅  Showing UI exception alerts&lt;/p&gt;
&lt;h3&gt;
  
  
  Easy to use
&lt;/h3&gt;

&lt;p&gt;You can use Talker instance everywhere in your app&lt;br&gt;
Simple and concise syntax will help you with this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;talker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Talker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Handle exceptions and errors&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// your code...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kd"&gt;on&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Exception with'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Log your app info&lt;/span&gt;
&lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'App is started'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;critical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'❌ Houston, we have a problem!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;talker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'🚨 The service is not available'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More examples you can get &lt;a href="https://github.com/Frezyx/talker/blob/master/packages/talker/example/talker_example.dart" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Customization
&lt;/h2&gt;

&lt;p&gt;Talker package has a lot of customizations like:&lt;br&gt;
✅  Custom logs with any color and message &lt;br&gt;
✅  Logs history (contains all application info)&lt;br&gt;
✅  Custom Filters, Formatters, outputs&lt;br&gt;
✅  Observers for making custom logic&lt;br&gt;
✅  Data stream to handle logs in any point of code&lt;/p&gt;

&lt;p&gt;I am launching a series of articles about this technology.&lt;br&gt;
In each new article I will talk about a certain feature of this approach to error handling in the Flutter/dart application&lt;/p&gt;

&lt;p&gt;😎 Go to the &lt;a href="https://github.com/Frezyx/talker" rel="noopener noreferrer"&gt;GitHub repository page&lt;/a&gt;! &lt;br&gt;
🥵 Here you can see beautiful examples of usage and code snippets. &lt;/p&gt;

&lt;p&gt;Show some ❤️ and star the repo to support the project!&lt;/p&gt;

</description>
      <category>dart</category>
      <category>monitoring</category>
      <category>opensource</category>
      <category>testing</category>
    </item>
    <item>
      <title>Flutter multiplatform navigation sidebar / drawer widget</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Wed, 10 Aug 2022 11:37:00 +0000</pubDate>
      <link>https://dev.to/frezyx/flutter-multiplatform-navigation-sidebar-drawer-widget-4ecj</link>
      <guid>https://dev.to/frezyx/flutter-multiplatform-navigation-sidebar-drawer-widget-4ecj</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Frezyx/sidebarx" rel="noopener noreferrer"&gt;SidebarX&lt;/a&gt;&lt;/strong&gt; - package to create beautiful and convenient sidebar navigation widgets easy 🔥&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mobile&lt;/th&gt;
&lt;th&gt;Desktop&lt;/th&gt;
&lt;th&gt;Web&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fsidebarx%2Fblob%2Fmain%2Fexample%2Frepo%2Fexample_mobile_small.gif%3Fraw%3Dtrue" alt="Mobile"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fsidebarx%2Fblob%2Fmain%2Fexample%2Frepo%2Fexample.gif%3Fraw%3Dtrue" alt="Web"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fsidebarx%2Fblob%2Fmain%2Fexample%2Frepo%2Fexample_web.gif%3Fraw%3Dtrue" alt="Desktop"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The package is designed with maximum adaptation to large screens.&lt;br&gt;
Therefore, adding a widget to your screen will be very simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="n"&gt;SidebarX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;controller:&lt;/span&gt; &lt;span class="n"&gt;SidebarXController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;selectedIndex:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;items:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="n"&gt;SidebarXItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;icon:&lt;/span&gt; &lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;label:&lt;/span&gt; &lt;span class="s"&gt;'Home'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="n"&gt;SidebarXItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;icon:&lt;/span&gt; &lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;label:&lt;/span&gt; &lt;span class="s"&gt;'Search'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="c1"&gt;// Your app screen body&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Customization
&lt;/h2&gt;

&lt;p&gt;Package have huge customization fields list and by default can adjust to the theme of your application. &lt;/p&gt;

&lt;p&gt;For example - you can change colors, textStyles, add your custom builders for sidebar items and all what you need.&lt;/p&gt;

&lt;p&gt;😎 Go to the &lt;a href="https://github.com/Frezyx/sidebarx" rel="noopener noreferrer"&gt;GitHub repository page&lt;/a&gt;! &lt;br&gt;
🥵 Here you can see beautiful examples of usage and code snippets. &lt;/p&gt;

&lt;p&gt;Show some ❤️ and star the repo to support the project! &lt;/p&gt;

</description>
      <category>flutter</category>
      <category>webdev</category>
      <category>macos</category>
      <category>windows</category>
    </item>
    <item>
      <title>Non-standard Flutter custom bottom navigation bar</title>
      <dc:creator>Stanislav Ilin</dc:creator>
      <pubDate>Mon, 08 Aug 2022 12:09:11 +0000</pubDate>
      <link>https://dev.to/frezyx/non-standard-flutter-custom-bottom-navigation-bar-e0c</link>
      <guid>https://dev.to/frezyx/non-standard-flutter-custom-bottom-navigation-bar-e0c</guid>
      <description>&lt;p&gt;Are you tired of the usual navigation solutions in Flutter apps?&lt;br&gt;
I have something to show you 😎&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom bar with sheet
&lt;/h2&gt;

&lt;p&gt;💥Non-standard way to use more space of screens in your application💥&lt;br&gt;
😳Custom bottom Sheet under Bottom Navigation Bar😳&lt;br&gt;
😩Sounds sucks? 😉 First of all look at screens!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the near past, a new version of the package 2.4.0 was released.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fbottom_bar_with_sheet%2Fblob%2Fmaster%2Fexample%2Frep_files%2Fe1.gif%3Fraw%3Dtrue" alt="Image"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fbottom_bar_with_sheet%2Fblob%2Fmaster%2Fexample%2Frep_files%2Fe2.gif%3Fraw%3Dtrue" alt="Image"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fbottom_bar_with_sheet%2Fblob%2Fmaster%2Fexample%2Frep_files%2Fe3.gif%3Fraw%3Dtrue" alt="Image"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FFrezyx%2Fbottom_bar_with_sheet%2Fblob%2Fmaster%2Fexample%2Frep_files%2Fe4.gif%3Fraw%3Dtrue" alt="Image"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;😳Custom bottom Sheet under Bottom Navigation Bar😳&lt;br&gt;
😩Sounds sucks? 😉First of all look at screens in &lt;a href="https://github.com/Frezyx/bottom_bar_with_sheet" rel="noopener noreferrer"&gt;repository&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Show some ❤️ and star the repo to support the project!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>design</category>
      <category>android</category>
    </item>
  </channel>
</rss>
