<?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: Mathieu K</title>
    <description>The latest articles on DEV Community by Mathieu K (@niamtokik).</description>
    <link>https://dev.to/niamtokik</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%2F1302415%2Ff02d4ee9-14d9-45ec-966a-6bb53e0e3240.jpeg</url>
      <title>DEV Community: Mathieu K</title>
      <link>https://dev.to/niamtokik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/niamtokik"/>
    <language>en</language>
    <item>
      <title>Asynchronous Functions in Dart</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Mon, 25 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/asynchronous-functions-in-dart-i0a</link>
      <guid>https://dev.to/niamtokik/asynchronous-functions-in-dart-i0a</guid>
      <description>&lt;p&gt;In a previous post synchronous functions and iterators have been explained. Those functions are blocking, and in our daily busy life, we don't want our programs to block, we want a smooth experience. Well, if you are coding in C or C++, you should probably know &lt;a href="https://www.man7.org/linux/man-pages/man7/pthreads.7.html" rel="noopener noreferrer"&gt;pthreads&lt;/a&gt;, a library used to create threads, a way to create independent computation concurrently. The same exist in many other languages with sometimes different name, but doing mostly the same with just an interface and cool features.&lt;/p&gt;

&lt;p&gt;Dart is working a bit like JavaScript, it uses only one thread to do all the computation by default, but this "thread" can be split in many small part allowing the illusion of concurrent or parallel computation. To make that possible, one need to create asynchronous functions, marked with &lt;code&gt;async&lt;/code&gt; or &lt;code&gt;async*&lt;/code&gt; keywords.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A function is asynchronous if its body is marked with the &lt;code&gt;async&lt;/code&gt; or &lt;code&gt;async*&lt;/code&gt; modifier. Otherwise the function is synchronous. &lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 9, page 23&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What does it really mean? Well, like the very great &lt;a href="https://dart.dev/language/concurrency" rel="noopener noreferrer"&gt;Dart documentation part about Concurrency&lt;/a&gt; explains, when a function is asynchronous, the event loop will listen for some changes in "background". When the function returns some values, the event loop receive it and return it to the caller. Let have a look on &lt;code&gt;async&lt;/code&gt; keyword.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If f is marked &lt;code&gt;async&lt;/code&gt;, then a fresh instance is associated with the invocation, where the dynamic type of o implements &lt;code&gt;Future&amp;lt;T&amp;gt;&lt;/code&gt;, where &lt;code&gt;T&lt;/code&gt; is the actual type corresponding to the future value type of &lt;code&gt;f&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 17, Section 15, page 141&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In short, adding &lt;code&gt;async&lt;/code&gt; when declaring a new function will mark it as an asynchronous function returning a &lt;code&gt;Future&lt;/code&gt; object.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;async_int_addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&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="kd"&gt;async&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;async_int_addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&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="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;async_int_addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/async.dart 
&lt;span class="gp"&gt;Instance of 'Future&amp;lt;int&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'
&lt;/span&gt;&lt;span class="go"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If f is marked &lt;code&gt;async*&lt;/code&gt;, then a fresh instances implementing &lt;code&gt;Stream&amp;lt;U&amp;gt;&lt;/code&gt; is immediately returned, where &lt;code&gt;U&lt;/code&gt; is the actual type corresponding to the element type of &lt;code&gt;f&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 17, Section 15, page 141&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Stream&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;async_int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt;&lt;span class="o"&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;y&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s"&gt;"y&amp;lt;y"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&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="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;for&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;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;async_int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&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;i&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="mi"&gt;0&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;The previous piece of codes are also using a specific keyword: &lt;code&gt;await&lt;/code&gt;. Let check the specification to see what does this one is doing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An &lt;code&gt;await&lt;/code&gt; expression allows code to yield control until an asynchronous operation completes. [...] An &lt;code&gt;await&lt;/code&gt; expression can only occur in a function which is declared asynchronous. The &lt;code&gt;await&lt;/code&gt; identifier has has no special meaning in the context of a normal function [...] &lt;code&gt;await(e)&lt;/code&gt; can be a valid function invocation in non asynchronous functions.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 17, Section 34, page 182&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means if we are using asynchronous function and we want to get the result returned by it, one can use &lt;code&gt;await&lt;/code&gt; to get it. Bonus point: the value returned will not be a &lt;code&gt;Future&lt;/code&gt; anymore but the generic type defined. Here an 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="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&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="kd"&gt;async&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;t&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="k"&gt;await&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;t()&lt;/code&gt; function is straightforward, it returns simply an integer from an asynchronous call. The &lt;code&gt;main()&lt;/code&gt; function will print the returned value of this without &lt;code&gt;await&lt;/code&gt; and with it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/await.dart
&lt;span class="gp"&gt;Instance of '_Future&amp;lt;int&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'
&lt;/span&gt;&lt;span class="go"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the first one returns an instance of &lt;code&gt;Future&lt;/code&gt;, the "reference" of the execution, while the second would wait until the asynchronous function is done and return an integer.&lt;/p&gt;

&lt;p&gt;Asynchronous functions are more than critical in Dart environment and are the foundation of most of the ecosystem. Mastering this part is vital, and if the information provided in this article was not enough, one should probably wait for the next ones on &lt;code&gt;Future&lt;/code&gt; and &lt;code&gt;Stream&lt;/code&gt; classes. I underestimated the complexity of this part of the language and thought it could fit in one big post... It was not the case.&lt;/p&gt;

&lt;p&gt;Anyway, here more links I can highly recommend to understand how concurrency programming is working with Dart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/language/concurrency" rel="noopener noreferrer"&gt;Concurrency in Dart&lt;/a&gt; from the official Guide, an interesting publication talking a bit about the Dart event loop;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/language/async" rel="noopener noreferrer"&gt;Asynchronous programming&lt;/a&gt; from the official Guide where many examples using &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; can be studied;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Official Specification&lt;/a&gt; where you can find the expected behaviors of all previous keywords including &lt;code&gt;async&lt;/code&gt;, &lt;code&gt;async*&lt;/code&gt;, &lt;code&gt;yield&lt;/code&gt;, &lt;code&gt;yield*&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/libraries/dart-async" rel="noopener noreferrer"&gt;Dart Async Package Documentation&lt;/a&gt; where the &lt;code&gt;dart:async&lt;/code&gt; package is described, it contains a good introduction;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dartcounterapp.com/dart-yield-vs-yield/" rel="noopener noreferrer"&gt;Master Dart: Yield vs Yield* – Unlock Iterable Power&lt;/a&gt; by &lt;a href="https://dartcounterapp.com/author/dietermaes767hotmail-be/" rel="noopener noreferrer"&gt;Dieter&lt;/a&gt;. A nice article to understand how &lt;code&gt;yield&lt;/code&gt; and &lt;code&gt;yield*&lt;/code&gt; are working;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@jigejiaoxue/dart-lesson-13-asynchronous-programming-basics-future-and-async-await-c9704938121d" rel="noopener noreferrer"&gt;Dart Lesson 13: Asynchronous Programming Basics — Future and async/await&lt;/a&gt; by &lt;a href="https://medium.com/@jigejiaoxue" rel="noopener noreferrer"&gt;JiGe&lt;/a&gt; on Medium. Another great publication giving some use cases and lot of examples;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/18449846/how-can-i-sleep-a-dart-program" rel="noopener noreferrer"&gt;How can I "sleep" a Dart program&lt;/a&gt; on StackOverlow where I found the &lt;code&gt;sleep()&lt;/code&gt; function was blocking the whole Dart event loop...&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Image Cover by &lt;a href="https://unsplash.com/@jaruales?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Jose Ruales&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/assorted-color-paper-S1jxv58s0UE?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>asynchronous</category>
      <category>future</category>
      <category>stream</category>
    </item>
    <item>
      <title>Synchronous Functions in Dart</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Fri, 22 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/synchronous-functions-in-dart-3j08</link>
      <guid>https://dev.to/niamtokik/synchronous-functions-in-dart-3j08</guid>
      <description>&lt;p&gt;This series of post will try to explain a complex topic: concurrent and parallel programming, in Dart. I think the only way to deal with that is using the &lt;a href="https://www.erlang.org/" rel="noopener noreferrer"&gt;Erlang VM&lt;/a&gt; (BEAM), but &lt;a href="https://clojure.org/" rel="noopener noreferrer"&gt;Clojure&lt;/a&gt; and other functional languages are usually doing better job on this part. Unfortunately, to me, most of other languages using OOP don't offer a great abstraction to concurrency and parallelism, but during the last decade, things are changing a bit.&lt;/p&gt;

&lt;p&gt;Anyway, before talking about concurrency, parallelism, or even distributed systems, everything starts with synchronous call, the "standard" way to execute a function or a procedure on a computer. In dart, synchronous function call and generators functions need to me studied a little bit. &lt;/p&gt;

&lt;p&gt;Firstly, all function without any specific keyword are all defined as synchronous:&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;int&lt;/span&gt; &lt;span class="nf"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&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;If the keyword &lt;code&gt;sync&lt;/code&gt; was present in the language, the previous snippet would be equivalent to the one below. Don't try to compile it, it will fail.&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="c1"&gt;// could be equivalent to the following&lt;/span&gt;
&lt;span class="c1"&gt;// snippet with the sync keyword. But this&lt;/span&gt;
&lt;span class="c1"&gt;// function will not work, sync keyword is&lt;/span&gt;
&lt;span class="c1"&gt;// invalid during compilation&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;addition_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;sync&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&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;When adding the &lt;code&gt;addition()&lt;/code&gt; function inside the &lt;code&gt;main()&lt;/code&gt; entry-point, it will directly return the value. In fact, you can't really see this because it's quick, but the computer will block a little bit to wait the result of the computation.&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;int&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&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;A synchronous function will always wait for  any kind of return before continuing the execution of the program. For example, if an infinite loop is created, the function will never return, and the function will block the whole program. The following snippet, when executed, will never return because of the &lt;code&gt;while&lt;/code&gt; loop defined in the &lt;code&gt;infinite_loop()&lt;/code&gt; function. The only way to close this program is to kill it (for example using &lt;code&gt;Ctrl-C&lt;/code&gt; or sending another signal on UNIX systems).&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;int&lt;/span&gt; &lt;span class="nf"&gt;infinite_loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&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="c1"&gt;// do something&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;infinite_loop&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;Great, we know how to create synchronous functions. Now, let have a look on a specific keyword: &lt;code&gt;sync*&lt;/code&gt;. This one is a syntactic sugar to help developers creating &lt;a href="https://dart.dev/language/functions#generators" rel="noopener noreferrer"&gt;generators&lt;/a&gt;, a function that return many elements, one at a time. The best example is the &lt;a href="https://api.dart.dev/dart-core/List-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;List&lt;/code&gt;&lt;/a&gt; class (or &lt;code&gt;[]&lt;/code&gt;). This data type - a list - is seen as a generator, and more precisely an &lt;a href="https://api.dart.dev/dart-core/Iterable-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A function is a generator if its body is marked with the &lt;code&gt;sync*&lt;/code&gt; or &lt;code&gt;async*&lt;/code&gt; modifier. [...] Generator functions are a sugar for functions that produce collections in a systematic way, by lazily applying a function that generates individual elements of a collection. Dart provides such a sugar in both the synchronous case, where one returns an iterable, and in the asynchronous case, where one returns a stream. &lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 9, page 23&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let create our first generator from scratch, let call it &lt;code&gt;int_generator()&lt;/code&gt;. It will take 2 integers as arguments and will return the list of elements between them. You can see it as a kind of primitive range or sequence function.&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;Iterable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;sync&lt;/span&gt;&lt;span class="o"&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;y&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s"&gt;"y&amp;lt;x"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&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="kt"&gt;int&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="k"&gt;for&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;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&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;i&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="mi"&gt;0&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;In the first place, instead of returning a simple &lt;code&gt;int&lt;/code&gt; this function is returning an &lt;code&gt;Iterable&amp;lt;int&amp;gt;&lt;/code&gt;. Why? Because we are using &lt;code&gt;yield&lt;/code&gt;, but we will explain that a bit later. Next, the function definition looks like a classic one, but the &lt;code&gt;sync*&lt;/code&gt; keyword is added just after. It means this function will be a generator.&lt;/p&gt;

&lt;p&gt;Then, the body of the function where a first step is to avoid creating an infinite loop by creating a simple guard throwing an exception if the second argument is less than the first argument. Immediately after, a &lt;code&gt;while&lt;/code&gt; loop is created, where the first argument is incremented until the first argument is less or equal to the second one. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;yield&lt;/code&gt; statement adds an object to the result of a generator function.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 18, Section 16, page 213&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this loop, the keyword &lt;code&gt;yield&lt;/code&gt; followed by variable (or any valid terms) is used. This specific expression is important, because it will adds the object into the result of the generator. In other words, if another function is calling the previous function inside a loop, the sequence of integer will be printed to the screen.&lt;/p&gt;

&lt;p&gt;Let execute that from the console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/int_generator.dart
&lt;span class="go"&gt;0
1
2
3
4
5
6
7
8
9
10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;yield&lt;/code&gt; is not the only unique term here able to put an object inside a generator, &lt;code&gt;yield*&lt;/code&gt; (&lt;code&gt;yield-each&lt;/code&gt;) can also be used to push a series of objects, in fact a subtype of &lt;code&gt;Iterable&lt;/code&gt; class.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;yield-each&lt;/code&gt; statement adds a series of objects to the result of a generator  function.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 18, Section 17, page 214&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;sync&lt;/span&gt;&lt;span class="o"&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;y&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="s"&gt;"y&amp;lt;x"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
  &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;for&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;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;int_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&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;i&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="mi"&gt;0&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;Let execute this code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/int_each_generator.dart 
&lt;span class="go"&gt;(0, 10)
0
10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To be honest, I don't currently understand why it returns a record on the first part of the program. I was reading the specification but I was unable to find and answer. I will let this problem for future-me. A quick note though: a generator cannot return a value.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Case &lt;code&gt;⟨Generator functions⟩&lt;/code&gt;. It is a compile-time error if a &lt;code&gt;return&lt;/code&gt; statement of the form &lt;code&gt;return e&lt;/code&gt;; appears in a generator function.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Dart Language Specification&lt;/a&gt;, Chapter 18, Section 12, page 211&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Based on the documentation, it also seems &lt;code&gt;yield*&lt;/code&gt; can be used to improve recursive function performance. Here the one of the previous example implemented using recursive function 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="n"&gt;Iterable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;int_rec_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;sync&lt;/span&gt;&lt;span class="o"&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;x&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;int_rec_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&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="kt"&gt;int&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int_rec_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Let run it now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/int_recursive_generator.dart 
&lt;span class="go"&gt;(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same result than before, but it was using a recursive function. If I remember correctly, calling recursively a function in Dart with tail queue optimization and trampoline is a very bad idea (it will consume a lot of stack and memory). Anyway, let switch to another topic: &lt;code&gt;Iterable&lt;/code&gt; class.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;Iterable&lt;/code&gt; class
&lt;/h1&gt;

&lt;p&gt;We know how to create generators, and then &lt;code&gt;Iterable&lt;/code&gt; from scratch, but what we can do with this kind of objects? Let read the definition from the API documentation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A collection of values, or "elements", that can be accessed sequentially.&lt;/p&gt;

&lt;p&gt;-- Dart Language Documentation, &lt;a href="https://api.dart.dev/dart-core/Iterable-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable&lt;/code&gt; class&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not all features will be illustrated there, only the one looking interesting and useful for my own use cases.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/Iterable.generate.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterate.generate()&lt;/code&gt;&lt;/a&gt; constructor creates a new &lt;code&gt;Iterable&lt;/code&gt; object using Integer by default (like a Range/Sequence). The second argument offers a way to change the type returned based on the integer sequence produced (a bit like a &lt;code&gt;map()&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="s"&gt;"generate(10): &lt;/span&gt;&lt;span class="si"&gt;$x&lt;/span&gt;&lt;span class="s"&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;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;65&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="s"&gt;"generate(10, _): &lt;/span&gt;&lt;span class="si"&gt;$y&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/t.dart 
&lt;span class="go"&gt;generate(10): (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
generate(10, _): (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/contains.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.contains()&lt;/code&gt;&lt;/a&gt; method returns &lt;code&gt;true&lt;/code&gt; if the object passed in the first argument is present in the collection of objects managed by the &lt;code&gt;Iterable&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dart&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;65&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="s"&gt;'"A"? &lt;/span&gt;&lt;span class="si"&gt;${a.contains("A")}&lt;/span&gt;&lt;span class="s"&gt;'&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="s"&gt;'65? &lt;/span&gt;&lt;span class="si"&gt;${a.contains(65)}&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/contains.dart 
&lt;span class="go"&gt;"A"? true
65? false
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/elementAt.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.elementAt()&lt;/code&gt;&lt;/a&gt; method returns the element present at the position defined by the first argument. If the position does not exist, it throws a &lt;code&gt;RangeError&lt;/code&gt; exception.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;elementAt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dart&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;elementAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&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;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;elementAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&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;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;elementAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/elementAt.dart 
&lt;span class="go"&gt;0
9
Unhandled exception:
RangeError (index): Index out of range: index should be less than 10: 1024
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;0      IndexError.check &lt;span class="o"&gt;(&lt;/span&gt;dart:core/errors.dart:520:7&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;1      _GeneratorIterable.elementAt &lt;span class="o"&gt;(&lt;/span&gt;dart:core/iterable.dart:928:16&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;2      main &lt;span class="o"&gt;(&lt;/span&gt;file:///dart/t/bin/elementAt.dart:5:11&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;3      _delayEntrypointInvocation.&amp;lt;anonymous closure&amp;gt; &lt;span class="o"&gt;(&lt;/span&gt;dart:isolate-patch/isolate_patch.dart:314:19&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;4      _RawReceivePort._handleMessage &lt;span class="o"&gt;(&lt;/span&gt;dart:isolate-patch/isolate_patch.dart:193:12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/every.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.every()&lt;/code&gt;&lt;/a&gt; method returns true if the collection of items satisfies the anonymous function passed in argument.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;every&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dart&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&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;y&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&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;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&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;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kt"&gt;String&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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/every.dart 
&lt;span class="go"&gt;true
false
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/fold.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.fold()&lt;/code&gt;&lt;/a&gt; method reduces the collection of items using a combine function present in second argument and an initial value defined in the first argument.
&lt;/li&gt;
&lt;/ul&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;Iterable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&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="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&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;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&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="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromCharCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;65&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;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fold&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="s"&gt;"string: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&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="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${v}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;${e}&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/fold.dart 
&lt;span class="go"&gt;46
string:  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/forEach.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.forEach()&lt;/code&gt;&lt;/a&gt; method iterates of the collection of item. This method returns nothing.
&lt;/li&gt;
&lt;/ul&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"end"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/forEach.dart 
&lt;span class="go"&gt;1
2
3
4
end
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/join.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.join()&lt;/code&gt;&lt;/a&gt; method joins the collection of item with a &lt;code&gt;String&lt;/code&gt; and converts all object in the collection t  &lt;code&gt;String&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"end"&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;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/join.dart 
&lt;span class="go"&gt;start, 1, 2, 3, end
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.dart.dev/dart-core/Iterable/map.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.map()&lt;/code&gt;&lt;/a&gt; method modifies each element of the collection by calling a function defined in the first argument.
&lt;/li&gt;
&lt;/ul&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="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'a'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'b'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&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;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;first&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&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;first&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/map.dart 
&lt;span class="go"&gt;({1: a}, {2: b})
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt; &lt;a href="https://api.dart.dev/dart-core/Iterable/reduce.html" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable.reduce()&lt;/code&gt;&lt;/a&gt; methods is similar to &lt;code&gt;Iterable.fold()&lt;/code&gt; excepts it does not have an initial value defined.
&lt;/li&gt;
&lt;/ul&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;Iterable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Iterable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&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;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$a&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;$e&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;e&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;0&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;a&lt;/span&gt; &lt;span class="o"&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="k"&gt;else&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;a&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart bin/reduce.dart 
&lt;span class="go"&gt;0 1
0 2
2 3
2 4
6 5
6 6
12 7
12 8
20 9
20 10
30 11
30 12
42 13
42 14
56 15
56 16
72 17
72 18
90 19
90
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Way more methods are available, but it was not expected to go so deep in this post. If you want to go even deeper, you will need to read the test cases and the Dart implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/sdk/blob/main/tests/corelib/" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable&lt;/code&gt; test cases&lt;/a&gt; can be found in the files &lt;code&gt;tests/corelib/iterable*.dart&lt;/code&gt; from &lt;a href="https://github.com/dart-lang/sdk" rel="noopener noreferrer"&gt;Dart SDK&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/sdk/blob/main/sdk/lib/core/iterable.dart" rel="noopener noreferrer"&gt;&lt;code&gt;Iterable&lt;/code&gt; implementation source code&lt;/a&gt; can be found in &lt;code&gt;sdk/lib/core/iterable.dart&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these 2 links, you will have more than enough to understand how things are working.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@whmii?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Will H McMahan&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/red-and-white-give-way-signage-post-on-street-2s2GuevIqXA?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>synchronous</category>
      <category>iterator</category>
      <category>generator</category>
    </item>
    <item>
      <title>Upgrading OpenBSD 7.8 to OpenBSD 7.9</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Thu, 21 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/upgrading-openbsd-78-to-openbsd-79-18f</link>
      <guid>https://dev.to/niamtokik/upgrading-openbsd-78-to-openbsd-79-18f</guid>
      <description>&lt;p&gt;The &lt;a href="https://www.openbsd.org/79.html" rel="noopener noreferrer"&gt;lastest version of OpenBSD&lt;/a&gt; has been released this week and announced on the &lt;a href="https://marc.info/?l=openbsd-announce&amp;amp;m=177919671915512&amp;amp;w=2" rel="noopener noreferrer"&gt;Mailinglist&lt;/a&gt; (but also on &lt;a href="https://x.com/canadianbryan/status/2056740268171309263" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt; by Brian Steele). As usual, lot of improvement, this publication is just a quick summary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Read the &lt;a href="https://www.openbsd.org/79.html" rel="noopener noreferrer"&gt;release note&lt;/a&gt; and the upgrade procedure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure you have enough place on your partitions.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Be prepared to upgrade your database like PostgreSQL. Do a Backup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start with one device to see if everything is fine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade with &lt;a href="https://man.openbsd.org/sysupgrade" rel="noopener noreferrer"&gt;&lt;code&gt;sysupgrade&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sysupgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;After the reboot, upgrade the packages with &lt;a href="https://man.openbsd.org/pkg_add" rel="noopener noreferrer"&gt;&lt;code&gt;pkg_add&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pkg_add &lt;span class="nt"&gt;-uUra&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do a second reboot if necessary&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.postgresql.org/docs/current/pgupgrade.html" rel="noopener noreferrer"&gt;Upgrade PostgreSQL&lt;/a&gt; and other services which have been upgraded.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do a third reboot to check if all services are started correctly during boot (reboot proof servers)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And... It should be okay! No big deal for this upgrade on my side, everything worked without issues.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@famouswebsites?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;A Perry&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-bunch-of-strange-looking-objects-hanging-from-a-ceiling-vaU1IW6AHV8?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>openbsd</category>
      <category>migration</category>
      <category>upgrade</category>
      <category>unix</category>
    </item>
    <item>
      <title>Dealing with WebSocket in Dart</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Wed, 20 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/dealing-with-websocket-in-dart-2cmi</link>
      <guid>https://dev.to/niamtokik/dealing-with-websocket-in-dart-2cmi</guid>
      <description>&lt;p&gt;WebSocket is a protocol created more than 10 years ago offering a bidirectional communication channel between a client and a server. It fixes the HTTP polling issue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The WebSocket Protocol attempts to address the goals of existing bidirectional HTTP technologies in the context of the existing HTTP infrastructure; as such, it is designed to work over HTTP ports 80 and 443 as well as to support HTTP proxies and intermediaries, even if this implies some complexity specific to the current environment.  However, the design does not limit WebSocket to HTTP, and future implementations could use a simpler handshake over a    dedicated port without reinventing the entire protocol.  This last point is important because the traffic patterns of interactive messaging do not closely match standard HTTP traffic and can induce unusual loads on some components.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://datatracker.ietf.org/doc/html/rfc6455#section-1" rel="noopener noreferrer"&gt;RFC6455, section 1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today, let have some fun with WebSocket in Dart&lt;/p&gt;

&lt;h1&gt;
  
  
  WebSocket Server with &lt;code&gt;shelf&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Unfortunately, like most of the modern language, there is a framework war. Many different implementation exists for doing the same thing. I don't really have time to check all of them, so, I will just do quick table. All of them are supporting WebSockets.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;package&lt;/th&gt;
&lt;th&gt;version&lt;/th&gt;
&lt;th&gt;framework?&lt;/th&gt;
&lt;th&gt;deprecated?&lt;/th&gt;
&lt;th&gt;notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/shelf" rel="noopener noreferrer"&gt;&lt;code&gt;shelf&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.4.2&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;maintained by dart team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/http_server" rel="noopener noreferrer"&gt;&lt;code&gt;http_server&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.0.0&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;previous official http server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/dart_frog" rel="noopener noreferrer"&gt;&lt;code&gt;frog&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.2.6&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;minimalist backend framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/shelf_easy" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_easy&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5.2.0&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;lightweight framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/darto" rel="noopener noreferrer"&gt;&lt;code&gt;darto&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;0.0.35&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;micro-web framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/serinus" rel="noopener noreferrer"&gt;&lt;code&gt;serinus&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2.1.12&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;flexible framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/alfred" rel="noopener noreferrer"&gt;&lt;code&gt;alfred&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.1.3&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;expressjs like web server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/vania" rel="noopener noreferrer"&gt;&lt;code&gt;vania&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.1.5&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;high-performance framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pub.dev/packages/finch" rel="noopener noreferrer"&gt;&lt;code&gt;finch&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.3.2&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;lightweight framework (looks popular)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most of them are using &lt;code&gt;shelf&lt;/code&gt; or &lt;code&gt;http_server&lt;/code&gt; as backend, not sure if it's really necessary to test them all one by one. Anyway, I will use &lt;a href="https://pub.dev/packages/shelf" rel="noopener noreferrer"&gt;&lt;code&gt;shelf&lt;/code&gt;&lt;/a&gt; for one reason: this is not a framework, and it is maintained by the Dart team. I'm a bit sad though, because I can't find a lot of documentation, except the &lt;a href="https://pub.dev/documentation/shelf/latest/" rel="noopener noreferrer"&gt;official API&lt;/a&gt;. To use WebSocket with &lt;code&gt;shelf&lt;/code&gt;, the &lt;a href="https://pub.dev/packages/shelf_web_socket" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_web_socket&lt;/code&gt;&lt;/a&gt; handler is required, again, only the &lt;a href="https://pub.dev/documentation/shelf_web_socket/latest/shelf_web_socket/" rel="noopener noreferrer"&gt;API documentation&lt;/a&gt; can easily be found. A full example can be found in &lt;a href="https://github.com/dart-lang/samples/tree/main/server/simple" rel="noopener noreferrer"&gt;&lt;code&gt;server/simple&lt;/code&gt;&lt;/a&gt; directory from &lt;a href="https://github.com/dart-lang" rel="noopener noreferrer"&gt;dart source code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For this exercise, I would like to have something simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;long living foreground process&lt;/li&gt;
&lt;li&gt;listening on &lt;code&gt;127.0.0.0:8080&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;only one route: &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;all other routes are redirected to &lt;code&gt;/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;automatic support of web socket&lt;/li&gt;
&lt;li&gt;echo all message sent by the client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No authentication, no encryption, just a simple websocket echo server. First, let try to understand how to use &lt;code&gt;shelf&lt;/code&gt;. What kind of packages will be needed there?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/shelf/latest/shelf/" rel="noopener noreferrer"&gt;&lt;code&gt;shelf&lt;/code&gt;&lt;/a&gt; from the &lt;a href="https://pub.dev/packages/shelf" rel="noopener noreferrer"&gt;&lt;code&gt;shelf&lt;/code&gt;&lt;/a&gt; package. It includes different kind of helpful classes to deal with the server, like &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Cascade-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Cascade&lt;/code&gt;&lt;/a&gt; (managing handlers), &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Pipeline-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Pipeline&lt;/code&gt;&lt;/a&gt; to compose &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Middleware.html" rel="noopener noreferrer"&gt;Middleware&lt;/a&gt;s and &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Handler.html" rel="noopener noreferrer"&gt;Handler&lt;/a&gt;s, &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Request-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Request&lt;/code&gt;&lt;/a&gt; to give an abstract view of a request, &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Response-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Response&lt;/code&gt;&lt;/a&gt; to offers an interface for the HTTP response returned and finally &lt;a href="https://pub.dev/documentation/shelf/latest/shelf/Server-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Server&lt;/code&gt;&lt;/a&gt; as &lt;a href="https://github.com/dart-lang/shelf#adapters" rel="noopener noreferrer"&gt;adapter&lt;/a&gt;. We will see that probably later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/shelf/latest/shelf_io/" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_io&lt;/code&gt;&lt;/a&gt; from the &lt;a href="https://pub.dev/packages/shelf" rel="noopener noreferrer"&gt;&lt;code&gt;shelf&lt;/code&gt;&lt;/a&gt; package. This one is an adapter, mostly used to handle &lt;a href="https://api.dart.dev/stable/3.11.5/dart-io/HttpRequest-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;HttpRequest&lt;/code&gt;&lt;/a&gt;, if one wants to create a quick and dirty http server, one can use the &lt;a href="https://pub.dev/documentation/shelf/latest/shelf_io/serve.html" rel="noopener noreferrer"&gt;&lt;code&gt;server()&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/shelf_router/latest/" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_router&lt;/code&gt;&lt;/a&gt; from the &lt;a href="https://pub.dev/packages/shelf_router" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_router&lt;/code&gt;&lt;/a&gt; package. This is a routing library designed for &lt;code&gt;shelf&lt;/code&gt;, offering &lt;a href="https://pub.dev/documentation/shelf_router/latest/shelf_router/Route-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Route&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/shelf_router/latest/shelf_router/Router-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Router&lt;/code&gt;&lt;/a&gt; classes to deal with HTTP path routing. In our case, it will be only used to redirect all path to &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/shelf_web_socket/latest/" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_web_socket&lt;/code&gt;&lt;/a&gt; from the &lt;a href="https://pub.dev/packages/shelf_web_socket" rel="noopener noreferrer"&gt;&lt;code&gt;shelf_web_socket&lt;/code&gt;&lt;/a&gt; package. Well, it has already be described before, this is an handler to deal with WebSockets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/web_socket_channel/latest/" rel="noopener noreferrer"&gt;&lt;code&gt;web_socket_channel&lt;/code&gt;&lt;/a&gt; package, mostly used for few exposed classes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Knowing that, here the headers used to deal with a simple &lt;code&gt;shelf&lt;/code&gt; WebSocket server:&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;'dart:collection'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:convert'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:io'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:ws/ws.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:shelf/shelf.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:shelf/shelf_io.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;shelf_io&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:shelf_router/shelf_router.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;shelf_router&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:shelf_web_socket/shelf_web_socket.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:web_socket_channel/web_socket_channel.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To create a WebSocket handler, a callback function is required, it is called &lt;code&gt;onConnection&lt;/code&gt; in the implementation. This function is taking 2 arguments, the first one is a &lt;a href="https://pub.dev/documentation/web_socket_channel/latest/web_socket_channel/WebSocketChannel-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;WebSocketChannel&lt;/code&gt;&lt;/a&gt; object, and the second argument is a &lt;code&gt;String&lt;/code&gt; representing an eventual WebSocket subprotocol.&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;_onConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WebSocketChannel&lt;/span&gt; &lt;span class="n"&gt;webSocket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;subprotocol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;webSocket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&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="s"&gt;'{"msg":"ready"}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;webSocket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&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="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="s"&gt;'received: "&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="n"&gt;webSocket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&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="s"&gt;'{"msg":"&lt;/span&gt;&lt;span class="si"&gt;$message&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;'&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;The &lt;code&gt;WebSocketChannel&lt;/code&gt; object got 2 interesting properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/web_socket_channel/latest/web_socket_channel/WebSocketChannel/sink.html" rel="noopener noreferrer"&gt;&lt;code&gt;sink&lt;/code&gt;&lt;/a&gt; - an instance of the &lt;a href="https://api.dart.dev/dart-core/Sink-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Sink&lt;/code&gt;&lt;/a&gt; class - used to send value to the client, it can be used also to close the connection with the &lt;a href="https://pub.dev/documentation/web_socket_channel/latest/web_socket_channel/WebSocketChannel/sink.html" rel="noopener noreferrer"&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/a&gt; method. Then, in &lt;code&gt;onConnection()&lt;/code&gt; function, when the connection is ready, the server is sending a first message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/web_socket_channel/latest/web_socket_channel/WebSocketChannel/stream.html" rel="noopener noreferrer"&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/a&gt; - an instance of the &lt;a href="https://api.dart.dev/dart-async/Stream-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Stream&lt;/code&gt;&lt;/a&gt; class - used to receive the message emitted by the client. In &lt;code&gt;onConnection()&lt;/code&gt; function, every time a client is sending a message, the server will print the message locally on STDOUT and will return the same message to the client.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Handler&lt;/span&gt; &lt;span class="nf"&gt;_webSocketHandler1&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;webSocketHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;_onConnection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;protocols:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;allowedOrigins:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;pingInterval:&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;30&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;A dedicated function to start this first test is also required. Let call it &lt;code&gt;startShelfIO&lt;/code&gt; where &lt;code&gt;shelf_io&lt;/code&gt; will be used to start the server using &lt;a href="https://pub.dev/documentation/shelf/latest/shelf_io/serve.html" rel="noopener noreferrer"&gt;&lt;code&gt;serve()&lt;/code&gt;&lt;/a&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;startShelfIO&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;shelf_io&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;serve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_webSocketHandler1&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;'localhost'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;)&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="s"&gt;'server started'&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;Finally the &lt;code&gt;main()&lt;/code&gt; function, it will simply invoke &lt;code&gt;startShelfIO()&lt;/code&gt; function and do nothing more.&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="kt"&gt;List&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="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;startShelfIO&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;Hmm. We don't have a WebSocket client available right, it will be coded in the next part of this article. Unluckily, &lt;code&gt;curl&lt;/code&gt; does not have a full support for the WebSocket protocol (it can receive but not send data). Instead, we can install the &lt;a href="https://github.com/abeade/browser-websocket-client" rel="noopener noreferrer"&gt;&lt;code&gt;browser-websocket-client&lt;/code&gt;&lt;/a&gt; open-source plugin available on the &lt;a href="https://chromewebstore.google.com/detail/browser-websocket-client/mdmlhchldhfnfnkfmljgeinlffmdgkjo" rel="noopener noreferrer"&gt;Chrome Web Store&lt;/a&gt;. Are you Firefox friendly? You can use &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/websocket-weasel/" rel="noopener noreferrer"&gt;Weasel&lt;/a&gt; and its still &lt;a href="https://github.com/mhgolkar/Weasel" rel="noopener noreferrer"&gt;open-source&lt;/a&gt;. If you prefer a command line tool, you can also check &lt;a href="https://github.com/vi/websocat" rel="noopener noreferrer"&gt;&lt;code&gt;websocat&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://github.com/thehowl/claws" rel="noopener noreferrer"&gt;&lt;code&gt;claws&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run
&lt;span class="go"&gt;Building package executable... 
Built ws:ws.
server started
received: "{"client": "test"}"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Folrgs7s34yyt6himly67.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%2Folrgs7s34yyt6himly67.png" alt=" " width="800" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems to works... What if we want to close the connection from the server side? Simply &lt;a href="https://pub.dev/documentation/web_socket_channel/latest/web_socket_channel/WebSocketSink/close.html" rel="noopener noreferrer"&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/a&gt; the sink.&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;webSocket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To do something before closing the connection or if the client is closing it on its side, the &lt;code&gt;onDone&lt;/code&gt; attribute can be set while invoking the &lt;a href="https://api.dart.dev/stable/3.11.5/dart-async/Stream/listen.html" rel="noopener noreferrer"&gt;&lt;code&gt;listen()&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If this stream closes and sends a done event, the &lt;code&gt;onDone&lt;/code&gt; handler is called. If &lt;code&gt;onDone&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;, nothing happens.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://api.dart.dev/stable/3.11.5/dart-async/Stream/listen.html" rel="noopener noreferrer"&gt;listen abstract method&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Am I following the best practices here? Absolutely not! But if you want to fix my mess and add many layers of security, here a small list of references to do that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/WebSocket_Security_Cheat_Sheet.html" rel="noopener noreferrer"&gt;WebSocket Security Cheat Sheet&lt;/a&gt; by the OWASP Team;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ably.com/topic/websocket-architecture-best-practices" rel="noopener noreferrer"&gt;WebSocket architecture best practices: Designing scalable realtime systems&lt;/a&gt; by Ably&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://websocket.org/guides/best-practices/" rel="noopener noreferrer"&gt;WebSocket Best Practices for Production Applications&lt;/a&gt; from WebSocket.org&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@mahendra.mb06/websocket-security-testing-penetration-test-cases-best-practices-c34c22303275" rel="noopener noreferrer"&gt;WebSocket Security Testing: Penetration Test Cases &amp;amp; Best Practices&lt;/a&gt; by &lt;a href="https://medium.com/@mahendra.mb06" rel="noopener noreferrer"&gt;Mahendra Mb&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mangohost.net/blog/websocket-best-practices/" rel="noopener noreferrer"&gt;WebSocket: Best Practices&lt;/a&gt; by MongoHost&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you simply see other implementation or read more about WebSockets server on Dart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mojoauth.com/websocket/create-a-websocket-server-with-dart/#setting-up-the-websocket-server" rel="noopener noreferrer"&gt;Create a WebSocket Server with Dart&lt;/a&gt; by MojoAuth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/itzmeanjan/working-with-websocket-10gh"&gt;Working with WebSocket&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/itzmeanjan"&gt;@itzmeanjan&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  WebSocket Client with &lt;code&gt;web_socket&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;I will not do the same error twice and start to check all frameworks/implementations to deal with a WebSocket client in Dart. The first one available is the &lt;a href="https://pub.dev/packages/web_socket" rel="noopener noreferrer"&gt;&lt;code&gt;web_socket&lt;/code&gt;&lt;/a&gt; package. This one is directly maintained by the Dart team and the source code can be seen in &lt;a href="https://github.com/dart-lang/http/tree/master/pkgs/web_socket" rel="noopener noreferrer"&gt;&lt;code&gt;pkgs/web_socket&lt;/code&gt;&lt;/a&gt;. An unique &lt;a href="https://github.com/dart-lang/http/blob/master/pkgs/web_socket/example/web_socket_example.dart" rel="noopener noreferrer"&gt;example&lt;/a&gt; is also available. The previous package called &lt;a href="https://pub.dev/packages/web_socket_channel" rel="noopener noreferrer"&gt;&lt;code&gt;web_socket_channel&lt;/code&gt;&lt;/a&gt; was the one used by most of the project, but due to the complexity, a simpler one was required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart pub add web_socket
&lt;span class="go"&gt;Resolving dependencies... 
Downloading packages... 
  web_socket 1.0.1 (from transitive dependency to direct dependency)
Changed 1 dependency!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the &lt;code&gt;web_socket&lt;/code&gt; package will be required here. Note: to make things easier, just create a new dart file like &lt;code&gt;bin/wsc.dart&lt;/code&gt;.&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:web_socket/web_socket.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let create an isolated function called &lt;code&gt;webSocketClient&lt;/code&gt; to deal with the socket initialization.&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;webSocketClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;socket&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;WebSocket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'ws://localhost:8080/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'hello'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;TextDataReceived&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;text:&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$text&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;BinaryDataReceived&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$data&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;CloseReceived&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;code:&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;reason:&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$code&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;$reason&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="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&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;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/WebSocket/connect.html" rel="noopener noreferrer"&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/a&gt; static method is called with the URL of the server using an &lt;a href="https://api.dart.dev/dart-core/Uri-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Uri&lt;/code&gt;&lt;/a&gt; object. It returns a &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/WebSocket-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Future&amp;lt;WebSocket&amp;gt;&lt;/code&gt;&lt;/a&gt; object.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/WebSocket/sendText.html" rel="noopener noreferrer"&gt;&lt;code&gt;sendText()&lt;/code&gt;&lt;/a&gt; method is then invoked to send a text message to the server. If binaries are required, then use &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/WebSocket/sendBytes.html" rel="noopener noreferrer"&gt;&lt;code&gt;sendBytes()&lt;/code&gt;&lt;/a&gt; method. It returns nothing and in case of disconnection, the messages are silently discarded.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/WebSocketEvent-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;WebSocketEvent&lt;/code&gt;&lt;/a&gt; class is then used to deal with the events received on the socket. Those events are usually messages sent by the server, they can are defined in three different classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/TextDataReceived-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;TextDataReceived&lt;/code&gt;&lt;/a&gt; object is returned when the server is sending text message (e.g. &lt;a href="https://www.json.org/json-en.html" rel="noopener noreferrer"&gt;JSON&lt;/a&gt;). &lt;/li&gt;
&lt;li&gt;a &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/BinaryDataReceived-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;BinaryDataReceived&lt;/code&gt;&lt;/a&gt; object is returned when the server is sending binary message (e.g. &lt;a href="https://protobuf.dev/" rel="noopener noreferrer"&gt;protobuf&lt;/a&gt;, &lt;a href="https://cbor.io/" rel="noopener noreferrer"&gt;CBOR&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;a &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/CloseReceived-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;CloseReceived&lt;/code&gt;&lt;/a&gt; object is finally returned when the connection is closed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;a href="https://pub.dev/documentation/web_socket/latest/web_socket/WebSocket/close.html" rel="noopener noreferrer"&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/a&gt; method is called to explicitly close the connection from the client side.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The client side here is quite simple, and does not involve complex procedure. To invoke it, just execute the &lt;code&gt;webSocketClient()&lt;/code&gt; function in the &lt;code&gt;main()&lt;/code&gt; entry-point.&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="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;webSocketClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&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;Time to test if it is working correctly&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/wsc.dart
&lt;span class="go"&gt;{"msg":"ready"}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It seems to work. The client connects to the server, return the message received and simply close the connection.&lt;/p&gt;

&lt;p&gt;Another popular WebSocket client package called &lt;a href="https://pub.dev/packages/web_socket_client" rel="noopener noreferrer"&gt;&lt;code&gt;web_socket_client&lt;/code&gt;&lt;/a&gt; is also available at pub.dev. I'm not really sure if it adds more features or is more flexible than the default &lt;a href="https://pub.dev/packages/web_socket" rel="noopener noreferrer"&gt;WebSocket client&lt;/a&gt; maintained by the Dart team. If you are interested to see more implementations and examples, here a quick list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/http/blob/master/pkgs/web_socket/example/web_socket_example.dart" rel="noopener noreferrer"&gt;Official example&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.zetcode.com/dart/websocket/" rel="noopener noreferrer"&gt;Dart WebSocket&lt;/a&gt; on ZetCode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@punithsuppar7795/building-a-websocket-client-in-flutter-from-zero-to-hero-30d945dc7722" rel="noopener noreferrer"&gt;Building a WebSocket Client in Flutter: From Zero to Hero&lt;/a&gt; by &lt;a href="https://medium.com/@punithsuppar7795" rel="noopener noreferrer"&gt;Punith S Uppar&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/somnio-software-flutter-agency/real-time-apps-with-flutter-and-websockets-83b957a74d01" rel="noopener noreferrer"&gt;Real-time apps with Flutter and WebSockets&lt;/a&gt; by &lt;a href="https://medium.com/@gianfrancopapa" rel="noopener noreferrer"&gt;Gianfranco Papa&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Creating a WebSocket client and a WebSocket server was not so hard, even if the documentation is hard to find, and most of the examples are limited to simple use cases. The subprotocol feature present in WebSocket is kinda interesting and I think I will work on that on another post. Again, the code presented above was made for test purpose only, I can't recommend anyone to use it in production environment.&lt;/p&gt;

&lt;p&gt;Anyway, I think in a future publication, we will create something a bit more complex, like creating a custom communication protocol between a client and a server, using binary data.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@andknech?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Andrew Knechel&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/macro-view-of-lights-in-a-party-in-gettysburg-gG6yehL64fo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>websocket</category>
      <category>webdev</category>
      <category>http</category>
    </item>
    <item>
      <title>Discovering Swift</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Tue, 19 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/discovering-swift-3o94</link>
      <guid>https://dev.to/niamtokik/discovering-swift-3o94</guid>
      <description>&lt;p&gt;Is Swift one of those so called "modern" languages trying to fix what C gave us for good? Or just something else? Well, for the ones who know me a bit, "modern" languages like Rust or Go are not really my friends. Swift, in other hands, is trying something that annoys me: mobile application development. Mobile applications are generarily using Java/Kotlin or C++. In some rare case, other languages, and sometime C. If you want to create your own application on both iOS and Android, the two main OS competitors, you should probably start to learn Java/Kotlin. Since its latest release though, Swift can now create applications for iOS and for Android...&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%2Fr4ky670izkq51mj6eu4p.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%2Fr4ky670izkq51mj6eu4p.png" alt="A civilized programming language" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this first publication on Swift, I will publish only a list of resources. Indeed, after having tested it, this language currently does not fit all my requirements, and Dart/Flutter will be used instead. Anyway, it's always a good thing to have a place to list some good references on the topic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.swift.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Official Website&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.swift.org/blog/" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Official Blog&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://swift.org/documentation/" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Official Documentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/swiftlang/swift" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Source code&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://developer.apple.com/swift/" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift from Apple&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Books
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/swift-in-depth" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift in Depth&lt;/strong&gt;&lt;/a&gt; by Tjeerd in 't Veen&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/classic-computer-science-problems-in-swift" rel="noopener noreferrer"&gt;&lt;strong&gt;Classic Computer Science Problems in Swift&lt;/strong&gt;&lt;/a&gt; by David Kopec&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/hello-swift" rel="noopener noreferrer"&gt;&lt;strong&gt;Hello Swift!&lt;/strong&gt;&lt;/a&gt; by Tanmay Bakshi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/exploring-swift" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploring Swift&lt;/strong&gt;&lt;/a&gt; by Craig Grummitt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://iosdevelopmentwithswift.com" rel="noopener noreferrer"&gt;&lt;strong&gt;iOS Development with Swift&lt;/strong&gt;&lt;/a&gt; by Craig Grummitt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/beginning-swift-9781789538649" rel="noopener noreferrer"&gt;&lt;strong&gt;Beginning Swift&lt;/strong&gt;&lt;/a&gt; by Kåre Morstøl and Rob Kerr&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/mastering-swift-6-9781836203681" rel="noopener noreferrer"&gt;&lt;strong&gt;Mastering Swift 6&lt;/strong&gt;&lt;/a&gt; by Jon Hoffman&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/swift-cookbook-9781803239583" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Cookbook&lt;/strong&gt;&lt;/a&gt; by Keith Moon, Chris Barker, Daniel Bolella and Nathan Lawlor &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/learning-swift-3rd/9781491987568/" rel="noopener noreferrer"&gt;&lt;strong&gt;Learning Swift&lt;/strong&gt;&lt;/a&gt; by Jonathon Manning, Paris Buttfield-Addison and Tim Nugent&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leanpub.com/swiftuiin1day" rel="noopener noreferrer"&gt;&lt;strong&gt;SwiftUI in 1 Day&lt;/strong&gt;&lt;/a&gt; by Sagar Kale&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leanpub.com/swiftui-quickstart" rel="noopener noreferrer"&gt;&lt;strong&gt;SWIFTUI - Quick Start&lt;/strong&gt;&lt;/a&gt; by Ivor Online&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leanpub.com/swift23" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift From Two to Three&lt;/strong&gt;&lt;/a&gt; by Erica Sadun&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Publications
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://danielskatz.org/papers/PARCO2035.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift: A language for distributed parallel scripting&lt;/strong&gt;&lt;/a&gt; by Michael Wilde, Mihael Hategan, Justin M. Wozniak, Ben Clifford, Daniel S. Katz and Ian Foster&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.pure.ed.ac.uk/ws/portalfiles/portal/37070024/IJCAI_Swift_Logic_1.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Logic for Big Data and Knowledge Graphs&lt;/strong&gt;&lt;/a&gt; by Luigi Bellomarini, Georg Gottlob1, Andreas Pieris and Emanuel Sallinger&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Rostislav-Fojtik/publication/338081271_Swift_a_New_Programming_Language_for_Development_and_Education/links/5e7e3630299bf1a91b826ace/Swift-a-New-Programming-Language-for-Development-and-Education.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift a new programming language for development and education&lt;/strong&gt;&lt;/a&gt; by Rostislav Fojtik&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://scholarship.claremont.edu/cgi/viewcontent.cgi?article=2148&amp;amp;context=cmc_theses" rel="noopener noreferrer"&gt;&lt;strong&gt;The Future of iOS Development: Evaluating the Swift Programming Language&lt;/strong&gt;&lt;/a&gt; by Garrett Wells&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3289595.3289599" rel="noopener noreferrer"&gt;&lt;strong&gt;The Swift Language from a Reverse Engineering Perspective&lt;/strong&gt;&lt;/a&gt; by Malte Kraus and Vincent Haupert&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/matteocrippa/awesome-swift" rel="noopener noreferrer"&gt;&lt;strong&gt;Awesome Swift&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://kevincamp.github.io/swift/update/2025/01/27/swift-best-practices.html" rel="noopener noreferrer"&gt;&lt;strong&gt;Swift Best Practices in 2025&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@pawel_czerwinski?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Pawel Czerwinski&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/orange-and-black-abstract-painting-fmIukY9HMQw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>beginners</category>
      <category>tooling</category>
      <category>ios</category>
    </item>
    <item>
      <title>Flashing a Xiaomi Mi A3 Phone</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Mon, 18 May 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/flashing-a-xiaomi-mi-a3-phone-1bcc</link>
      <guid>https://dev.to/niamtokik/flashing-a-xiaomi-mi-a3-phone-1bcc</guid>
      <description>&lt;p&gt;This post is coming from my unpublished archive. It's quite an old one, but I think it would be interesting to share it. This is a summary of the different steps used to flash a Xiaomi Mi A3 phone and install another Android version (e.g. Lineage OS, Kali, /e/...). A part of the links are gone unfortunately, but I think the most important ones are still available. Have fun!&lt;/p&gt;

&lt;h1&gt;
  
  
  Bootstrapping
&lt;/h1&gt;

&lt;p&gt;This installation was done on Ubuntu 21.04 due to compatibility with other system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;install latest android sdk from official website from &lt;a href="https://developer.android.com/studio/#downloads" rel="noopener noreferrer"&gt;https://developer.android.com/studio/#downloads&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download all required assets to flash your phone&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Procedure
&lt;/h1&gt;

&lt;p&gt;This image is open-source but was built by &lt;a href="https://xdaforums.com/t/rom-11-unofficial-laurel_sprout-oss-lineageos-18-1.4240953/" rel="noopener noreferrer"&gt;Harukey&lt;/a&gt;. This is a good method to root your android phone though.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ensure ADB is correctly installed on your PC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure Fastboot is correctly installed on your PC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable developer mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable debugging throught USB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect your USB cable to your phone&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reboot your phone and press volume down&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When fastboot prompt appears you can flash your phone with the &lt;a href="https://sourceforge.net/projects/harukeys-roms/files/laurel/LineageOS18/LinageOSRecovery20210917.img" rel="noopener noreferrer"&gt;recovery image&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://downloads.sourceforge.net/project/harukeys-roms/laurel/LineageOS18/LinageOSRecovery20210917.img
fastboot flash boot LinageOSRecovery20210917.img
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Reboot into normal mode and check if everything was correctly set and configured. You should have your old Android version. (unplug your phone).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fastboot reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Reboot in recovery mode
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb reboot recovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;In recovery mode apply the latest partitions an update with ADB
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb sideload copy-partitions-20200903_1329.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do a factory reset (present at the first menu page)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply another update, this time, with the lineageOS rom&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://downloads.sourceforge.net/project/harukeys-roms/laurel/LineageOS18/lineage-18.1-20211128-UNOFFICIAL-laurel_sprout.zip
adb sideload lineage-18.1-20211128-UNOFFICIAL-laurel_sprout.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reboot in normal mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reboot in recovery mode&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb reboot recovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Download and install &lt;a href="https://github.com/topjohnwu/Magisk/" rel="noopener noreferrer"&gt;Magisk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://github.com/topjohnwu/Magisk/releases/download/v24.3/Magisk-v24.3.apk
&lt;span class="nb"&gt;cp &lt;/span&gt;Magisk-v24.3.apk Magisk-v24.3.zip
adb sideload Magisk-v24.3.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reboot in normal mode and check if you can have access to LineageOS and Magisk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure your system as desired (set developer mode and USB debugging).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reboot in recovery mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Download and install &lt;a href="https://kali.download/nethunter-images/kali-2022.1/nethunter-2022.1-laurel_sprout-eleven-kalifs-full.zip" rel="noopener noreferrer"&gt;nethunter&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb sideload nethunter-2022.1-laurel_sprout-eleven-kalifs-full.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;reboot your system and configure nethunter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The procedure to install this image is available on xda-developer forum: &lt;a href="https://forum.xda-developers.com/t/rom-11-unofficial-laurel_sprout-oss-lineageos-18-1.4240953/" rel="noopener noreferrer"&gt;https://forum.xda-developers.com/t/rom-11-unofficial-laurel_sprout-oss-lineageos-18-1.4240953/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Unbrick Xiaomi Mi A3
&lt;/h1&gt;

&lt;p&gt;Shit happens sometime. Xiaomi Mi A3 can be bricked if you do a wrong configuration or don't follow the good process when trying to install LineageOS or any kind of alternative to android. Fortunately, this phone can easily be unbricked by using few tools. Here the requirement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;windows 10 (at this time, it's a requirement unfortunately)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://androidmtk.com/download-qpst-flash-tool" rel="noopener noreferrer"&gt;qpsttool&lt;/a&gt; (version I used was &lt;a href="https://qpsttool.com/qpst-tool-v2-7-480/" rel="noopener noreferrer"&gt;2.7.480&lt;/a&gt; but the latest was &lt;a href="https://qpsttool.com/qpst-tool-v2-7-496/" rel="noopener noreferrer"&gt;2.7.496&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mega.nz/file/Fh1k2RjZ#t1gmUVReLaNJTOVyQlCRHIvVYcJgNoJKZDpNdYd1Nws" rel="noopener noreferrer"&gt;service rom&lt;/a&gt; by @nullby&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other steps are explained in depth in Mi A3 unbrick guide by @nullby. It takes around 30/45 minutes to unbrick your phone, and start with a fresh version of android one installed.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fixing a bootloop
&lt;/h1&gt;

&lt;p&gt;You can use TWPRP image, in my case &lt;code&gt;twrp-3.3.1-17-laurel_sprout-Q-mauronofrio.img&lt;/code&gt; worked. Go into advanced settings and "fix bootloop".&lt;/p&gt;

&lt;h1&gt;
  
  
  References and Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://forum.xda-developers.com/t/rom-12-1-crdroid-for-xiaomi-mi-a3-laurel_sprout-official-beta.4443071/" rel="noopener noreferrer"&gt;https://forum.xda-developers.com/t/rom-12-1-crdroid-for-xiaomi-mi-a3-laurel_sprout-official-beta.4443071/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.getdroidtips.com/how-to-unlock-bootloader-of-xiaomi-mi-a3/" rel="noopener noreferrer"&gt;https://www.getdroidtips.com/how-to-unlock-bootloader-of-xiaomi-mi-a3/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://forum.xda-developers.com/t/recovery-3-3-1-17-laurel_sprout-unofficial-twrp-recovery-for-xiaomi-mi-a3-test.3963428/" rel="noopener noreferrer"&gt;https://forum.xda-developers.com/t/recovery-3-3-1-17-laurel_sprout-unofficial-twrp-recovery-for-xiaomi-mi-a3-test.3963428/&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://androidmtk.com/download-qpst-flash-tool" rel="noopener noreferrer"&gt;https://androidmtk.com/download-qpst-flash-tool&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://c.mi.com/forum.php?mod=viewthread&amp;amp;tid=3527044" rel="noopener noreferrer"&gt;https://c.mi.com/forum.php?mod=viewthread&amp;amp;tid=3527044&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://forum.xda-developers.com/t/mi-a3-bricked-blackscreen-not-turning-on.4214225/" rel="noopener noreferrer"&gt;https://forum.xda-developers.com/t/mi-a3-bricked-blackscreen-not-turning-on.4214225/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://forum.xda-developers.com/t/rom-official-fastboot-xiaomi-mi-a3-laurel_sprout.3962489/" rel="noopener noreferrer"&gt;https://forum.xda-developers.com/t/rom-official-fastboot-xiaomi-mi-a3-laurel_sprout.3962489/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://forum.xda-developers.com/t/rom-stable-lineageos-18-0-mi-a3-laurel_sprout.4174895/" rel="noopener noreferrer"&gt;https://forum.xda-developers.com/t/rom-stable-lineageos-18-0-mi-a3-laurel_sprout.4174895/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://germowp.blogspot.com/2021/01/mi-m1803e6g-test-point-7reboot-device.html" rel="noopener noreferrer"&gt;https://germowp.blogspot.com/2021/01/mi-m1803e6g-test-point-7reboot-device.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/pixelExperience-Devices/kernel_xiaomi_laurel_sprout" rel="noopener noreferrer"&gt;https://github.com/pixelExperience-Devices/kernel_xiaomi_laurel_sprout&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mirror.codebucket.de/firmware/laurel_sprout/" rel="noopener noreferrer"&gt;https://mirror.codebucket.de/firmware/laurel_sprout/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://qfiltool.com/" rel="noopener noreferrer"&gt;https://qfiltool.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://qpsttool.com/qpst-tool-v2-7-480" rel="noopener noreferrer"&gt;https://qpsttool.com/qpst-tool-v2-7-480&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://qpsttool.com/qpst-tool-v2-7-496" rel="noopener noreferrer"&gt;https://qpsttool.com/qpst-tool-v2-7-496&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mobilerdx.com/2019/07/xiaomi-mi-a3-edl-mode-pinout-mi-a3-test-point.html" rel="noopener noreferrer"&gt;https://www.mobilerdx.com/2019/07/xiaomi-mi-a3-edl-mode-pinout-mi-a3-test-point.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://xiaomitools.com/how-to-use-qualcomm-flash-image-loader-tool-qfil/" rel="noopener noreferrer"&gt;https://xiaomitools.com/how-to-use-qualcomm-flash-image-loader-tool-qfil/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=8EAZwCivOCA" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=8EAZwCivOCA&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=KTXo91KlpWc" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=KTXo91KlpWc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=hKtWUALCZXE" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=hKtWUALCZXE&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=BlLqaRrHm-Y" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=BlLqaRrHm-Y&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@madeyes?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Eric Han&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/bokeh-light-Gc4wAF09JZY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>flashing</category>
      <category>firmware</category>
      <category>security</category>
    </item>
    <item>
      <title>Raw VM Image Mounting with losetup</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Sun, 17 May 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/raw-vm-image-mounting-with-losetup-2gl5</link>
      <guid>https://dev.to/niamtokik/raw-vm-image-mounting-with-losetup-2gl5</guid>
      <description>&lt;p&gt;I use Qemu/KVM for most of my custom virtual machine, and sometime, I need to do some backup or to check the filesystem from the host point of view. The process is quite simple, the virtual disk is used as a virtual storage device and then we mount the partition on the host. On FreeBSD, we use &lt;a href="https://man.freebsd.org/cgi/man.cgi?query=mdconfig" rel="noopener noreferrer"&gt;&lt;code&gt;mdconfig&lt;/code&gt;&lt;/a&gt;, on OpenBSD we use &lt;a href="https://man.openbsd.org/vnconfig" rel="noopener noreferrer"&gt;&lt;code&gt;vmconfig&lt;/code&gt;&lt;/a&gt; and on Linux, we are using &lt;a href="https://manpages.debian.org/trixie/mount/losetup.8.en.html" rel="noopener noreferrer"&gt;&lt;code&gt;losetup&lt;/code&gt;&lt;/a&gt;. Both of these commands have the same goal: allocate a special device pointing to a file present on a filesystem. Here an example with &lt;code&gt;losetup&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First we want to mount the image &lt;code&gt;/path/to/your/image.raw&lt;/code&gt; on a free &lt;code&gt;losetup&lt;/code&gt; device (usually present in &lt;code&gt;/dev/loop*&lt;/code&gt;). The &lt;code&gt;--find&lt;/code&gt; flag will look for the next available loop device, the &lt;code&gt;--show&lt;/code&gt; will print it to stdout and &lt;code&gt;-P&lt;/code&gt; will reload the partition table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# use available loop device, and attach image.raw to it&lt;/span&gt;
&lt;span class="nv"&gt;loop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;losetup &lt;span class="nt"&gt;--find&lt;/span&gt; &lt;span class="nt"&gt;--show&lt;/span&gt; &lt;span class="nt"&gt;-P&lt;/span&gt; /path/to/your/image.raw&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we can check if the partitions are present (or not). The attached device has been put into the &lt;code&gt;loop&lt;/code&gt; variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# check the loop devices partition&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;loop&lt;/span&gt;&lt;span class="k"&gt;}*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are using lvm (it was my case for this note), simply use &lt;a href="https://manpages.debian.org/trixie/lvm2/lvscan.8.en.html" rel="noopener noreferrer"&gt;&lt;code&gt;lvscan&lt;/code&gt;&lt;/a&gt; command and automatically enable the logical volume found.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lvscan &lt;span class="nt"&gt;-a&lt;/span&gt; y 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://manpages.debian.org/trixie/mount/mount.8.en.html" rel="noopener noreferrer"&gt;&lt;code&gt;mount&lt;/code&gt;&lt;/a&gt; the logical volume on your and do what you have to do.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mount /dev/vg/lv /mnt

&lt;span class="c"&gt;# Do your stuff here.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you have done, you can simply &lt;code&gt;umount&lt;/code&gt; the partition...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;umount /mnt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;... and finally detach the loop device.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;losetup &lt;span class="nt"&gt;--detach&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;loop&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: this procedure can be used only for raw qemu image. If you are using qcow format or another one, you will first need to convert it with &lt;a href="https://manpages.debian.org/trixie/qemu-utils/qemu-img.1.en.html" rel="noopener noreferrer"&gt;&lt;code&gt;qemu-img&lt;/code&gt;&lt;/a&gt; or use a tool like &lt;a href="https://www.baeldung.com/linux/mount-qcow2-image" rel="noopener noreferrer"&gt;&lt;code&gt;mount-qcow2-image&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@5tep5?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Aleksandr Popov&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-roller-coaster-lit-up-at-night-with-red-lights-aW50su5Dwek?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>qemu</category>
      <category>filesystem</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Discovering Flutter Ecosystem and Community</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Sat, 16 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/discovering-flutter-ecosystem-and-community-578l</link>
      <guid>https://dev.to/niamtokik/discovering-flutter-ecosystem-and-community-578l</guid>
      <description>&lt;p&gt;Flutter is a framework used by Dart, and most of the projects are using Dart because of Flutter. Most of the links you'll find here are also present in the &lt;a href=""&gt;Flutter Awesome List&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flutter.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter website&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.flutter.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Guide/Tutorial&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://api.flutter.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter API documentation&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/flutter/flutter/blob/master/docs/README.md" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Developer Wiki&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://discord.com/invite/N7Yshp4" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Discord Server&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://x.com/flutterdev" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter X/Twitter Account&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="**https://forum.itsallwidgets.com/"&gt;&lt;strong&gt;Official Flutter Forum&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://fluttercommunity.slack.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Slack Channel&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackoverflow.com/tags/flutter" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter on StackOverflow&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://groups.google.com/g/flutter-announce" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Announcement&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@flutterdev" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Youtube Channel&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Sources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/flutter/flutter" rel="noopener noreferrer"&gt;Official Flutter Git Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Books
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.fluttercompletereference.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Complete Reference 2.0&lt;/strong&gt;&lt;/a&gt; by Alberto Miola&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.syncfusion.com/succinctly-free-ebooks/flutter-succinctly" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Succinctly&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.syncfusion.com/succinctly-free-ebooks/flutter-ui-succinctly" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter UI Succinctly&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.tutorialspoint.com/flutter/flutter_tutorial.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Tutorials&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://blog.codemagic.io/flutter-libraries-ebook-by-codemagic/ebook-flutter-libraries-we-love-by-codemagic.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Libraries We Love&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pragprog.com/titles/czflutr/programming-flutter/" rel="noopener noreferrer"&gt;&lt;strong&gt;Programming Flutter&lt;/strong&gt;&lt;/a&gt; by Carmine Zaccagnino&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://link.springer.com/book/10.1007/979-8-8688-2105-9" rel="noopener noreferrer"&gt;&lt;strong&gt;Advanced Flutter - Build High-Performance, Cross-Platform Apps for Mobile, Web and Desktop&lt;/strong&gt;&lt;/a&gt; by Sivaraj Selvaraj&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://link.springer.com/book/10.1007/979-8-8688-0485-4" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter App Development - How to Write for iOS and Android at Once&lt;/strong&gt;&lt;/a&gt; by Rap Payne&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/flutter-in-action" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter in Action&lt;/strong&gt;&lt;/a&gt; by Eric Windmill&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/exploring-cross-platform-development" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploring Cross-Platform Development with Flutter, React Native, and Xamarin&lt;/strong&gt;&lt;/a&gt; by Eric Windmill&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/flutter-design-patterns-and-best-practices-9781801074551" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Design Patterns and Best Practices: Build scalable, maintainable, and production-ready apps using effective architectural principles&lt;/strong&gt;&lt;/a&gt; by Daria Orlova, Esra Kadah and Jaime Blasco&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/flutter-cookbook-9781803232638" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Cookbook: 100+ step-by-step recipes for building cross-platform, professional-grade apps with Flutter 3.10.x and Dart 3.x , Second Edition&lt;/strong&gt;&lt;/a&gt; by Simone Alessandria&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/flutter-projects-9781838642532" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Projects: A practical, project-based guide to building real-world cross-platform mobile applications and games&lt;/strong&gt;&lt;/a&gt; by Simone Alessandria&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/building-games-with-flutter-9781801813662" rel="noopener noreferrer"&gt;&lt;strong&gt;Building Games with Flutter: The ultimate guide to creating multiplatform games using the Flame engine in Flutter 3&lt;/strong&gt;&lt;/a&gt; by Paul Teale&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/taking-flutter-to-the-web-9781801819138" rel="noopener noreferrer"&gt;&lt;strong&gt;Taking Flutter to the Web: Learn how to build cross-platform UIs for web and mobile platforms using Flutter for Web&lt;/strong&gt;&lt;/a&gt; by Damodar Lohani&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/managing-state-in-flutter-pragmatically-9781801072090" rel="noopener noreferrer"&gt;&lt;strong&gt;Managing State in Flutter Pragmatically: Discover how to adopt the best state management approach for scaling your Flutter app&lt;/strong&gt;&lt;/a&gt; by Waleed Arshad&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/mobile-deep-learning-with-tensorflow-lite-ml-kit-and-flutter-9781789613995" rel="noopener noreferrer"&gt;&lt;strong&gt;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter: Build scalable real-world projects to implement end-to-end neural networks on Android and iOS&lt;/strong&gt;&lt;/a&gt; by Anubhav Singh and Rimjhim Bhadani&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/cross-platform-uis-with-flutter-9781801814669" rel="noopener noreferrer"&gt;&lt;strong&gt;Cross-Platform UIs with Flutter: Unlock the ability to create native multiplatform UIs using a single code base with Flutter 3&lt;/strong&gt;&lt;/a&gt; by Ryan Edge and Alberto Miola&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/flutter-and-dart/9781098119508/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter and Dart Cookbook&lt;/strong&gt;&lt;/a&gt; by Richard Rose&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leanpub.com/getting-started-flutter" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter 3 From Scratch: A Practical Guide with Real Projects&lt;/strong&gt;&lt;/a&gt; by Andres Cruz Yoris&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://leanpub.com/beginningflutterwithdart" rel="noopener noreferrer"&gt;&lt;strong&gt;Beginning Flutter 3.0 with Dart&lt;/strong&gt;&lt;/a&gt; by Sanjib Sinha&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Communication Channels
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gitter.im/flutter/flutter" rel="noopener noreferrer"&gt;Gitter&lt;/a&gt; - Exchange channel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.reddit.com/r/FlutterDev/" rel="noopener noreferrer"&gt;r/FlutterDev&lt;/a&gt; - Reddit community by &lt;a href="https://www.reddit.com/user/JaapVermeulen" rel="noopener noreferrer"&gt;u/JaapVermeulen&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://discord.gg/N7Yshp4" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; - Discord server to discuss and get help by &lt;a href="https://twitter.com/AndrewPritykin" rel="noopener noreferrer"&gt;Pritykin&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/fluttercommunity" rel="noopener noreferrer"&gt;Flutter Community&lt;/a&gt; - Central place for community made packages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/OpenFlutter" rel="noopener noreferrer"&gt;OpenFlutter&lt;/a&gt; - Make it easier 让 Flutter 更简单.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://hashnode.com/n/flutter" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt; - Read and write posts, participate in discussions or ask questions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Courses
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=3kaGC_DrUnw&amp;amp;pp=ygUOZmx1dHRlciBjb3Vyc2XSBwkJBAsBhyohjO8%3D" rel="noopener noreferrer"&gt;&lt;strong&gt;The Ultimate Flutter Tutorial for Beginners 2025&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=j_rCDc_X-k8&amp;amp;list=PL4cUxeGkcC9giLVXCHSQmWqlHc9BLXdVx" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Crash Course&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1ukSR1GRtMU&amp;amp;list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Tutorial for Beginners&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=gbHK4dN7xJc&amp;amp;list=PL5jb9EteFAODi35jPznP37hnR2sTHOOTU&amp;amp;pp=0gcJCcsEOCosWNin" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Crash Course for Absolute Beginners&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VA7gK0ZWZsw&amp;amp;list=PLYc47fHwMjU0Csn6eVQP2FvfBaGne7SZj" rel="noopener noreferrer"&gt;&lt;strong&gt;Full Stack Flutter App Development&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Publications
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.academia.edu/download/64302984/APPLICATION%20DEVELOPMENT%20USING%20FLUTTER%20.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Application development using flutter&lt;/strong&gt;&lt;/a&gt; by Aakanksha Tashildar, Nisha Shah, Rushabh Gala, Trishul Giri and Pranali Chavhan &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.wosjournals.com/index.php/shokh/article/download/5684/6107" rel="noopener noreferrer"&gt;&lt;strong&gt;THE ROLE OF FLUTTER IN MOBILE PROGRAMMING&lt;/strong&gt;&lt;/a&gt; by Tursunbek SadriddinovichJalolov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://oulurepo.oulu.fi/handle/10024/54358" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter in cross platform development: tools, performance and optimization&lt;/strong&gt;&lt;/a&gt; by Väänänen Teemu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://arxiv.org/abs/2408.11209" rel="noopener noreferrer"&gt;&lt;strong&gt;Assisting Novice Developers Learning in Flutter Through Cognitive-Driven Development&lt;/strong&gt;&lt;/a&gt; by Ronivaldo Ferreira, Victor H. S. Pinto, Cleidson R. B. de Souza and Gustavo Pinto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://jisom.rau.ro/Vol.16%20No.2%20-%202022/JISOM%2016.2_250-262.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Technology and Mobile Software Applications&lt;/strong&gt;&lt;/a&gt; by Alexandru TĂBUȘCĂ, Cristina COCULESCU and Mironela PÎRNĂU&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/abs/10.1145/3652620.3688330" rel="noopener noreferrer"&gt;&lt;strong&gt;Low-code flutter application development solution&lt;/strong&gt;&lt;/a&gt; by Atefeh Nirumand, Iván Alfonso and Jordi Cabot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://webthesis.biblio.polito.it/secure/19111/1/tesi.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;The Flutter framework: Analysis in a mobile enterprise environment&lt;/strong&gt;&lt;/a&gt; by Daniele PALUMBO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/336980" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter native performance and expressive ui/ux&lt;/strong&gt;&lt;/a&gt; by Thanh Thanh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.academia.edu/download/82865460/1.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Examining the Usage of Flutter to Design a Yatch in 3D&lt;/strong&gt;&lt;/a&gt; by Mohammed Kpannah Fahnbulleh, Xu SHUOBO&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.ir.juit.ac.in:8080/jspui/handle/123456789/9921" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Mobile Application Development&lt;/strong&gt;&lt;/a&gt; by Abhishek Samar Yadav&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mdpi.com/2078-2489/15/10/614" rel="noopener noreferrer"&gt;&lt;strong&gt;An Independent Learning System for Flutter Cross-Platform Mobile Programming with Code Modification Problems&lt;/strong&gt;&lt;/a&gt; by Safira Adine Kinari, Nobuo Funabiki, Soe Thandar Aung, Khaing Hsu Wai, Mustika Mentari and Pradini Puspitaningayu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://iopscience.iop.org/article/10.1088/1742-6596/1530/1/012020/pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;A freights status management system based on Dart and Flutter programming language&lt;/strong&gt;&lt;/a&gt; by Ghusoon Idan Arb and Kadhum Al-Majdi &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mdpi.com/2078-2489/15/8/464" rel="noopener noreferrer"&gt;&lt;strong&gt;An image-based user interface testing method for Flutter programming learning assistant system&lt;/strong&gt;&lt;/a&gt; by Soe Thandar Aung, Nobuo Funabiki, Lynn Htet Aung and Safira Adine Kinari.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mdpi.com/2078-2489/15/4/191" rel="noopener noreferrer"&gt;&lt;strong&gt;A study of learning environment for initiating Flutter app development using Docker&lt;/strong&gt;&lt;/a&gt; by Soe Thandar Aung, Nobuo Funabiki, Lynn Htet Aung, Safira Adine Kinari, Mustika Mentari and Khaing Hsu Wai&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mdpi.com/2079-9292/13/24/4878" rel="noopener noreferrer"&gt;&lt;strong&gt;An implementation of web-based answer platform in the Flutter programming learning assistant system using Docker Compose&lt;/strong&gt;&lt;/a&gt; by by Lynn Htet Aung, Soe Thandar Aung, Nobuo Funabiki, Htoo Htoo Sandi Kyaw  and Wen-Chung Kao&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://ojs.ikm.mk/index.php/kij/article/download/5597/5519" rel="noopener noreferrer"&gt;&lt;strong&gt;The use of the flutter framework in the development process of hybrid mobile applications&lt;/strong&gt;&lt;/a&gt; by Slavimir Stošović, Dušan Stefanović, Milan Bogdanović and Nikola Vukotić&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.academia.edu/download/79005461/Review_on_Mobile_Application_Development_Based_on_Flutter_Platform.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Review on mobile application development based on flutter platform&lt;/strong&gt;&lt;/a&gt; by Shreya A. Bhagat, Sakshi G. Dudhalkar, Prathmesh D. Kelapure, Aniket S. Kokare and Prof. Sudesh A. Bachwani&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/bitstream/handle/10024/355086/Dmitrii_Slepnev.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;State management approaches in Flutter&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.politesi.polimi.it/handle/10589/186288" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of a large-scale flutter app&lt;/strong&gt;&lt;/a&gt; by ALEJANDRO FERRERO LIGORRED&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://journal.msti-indonesia.com/index.php/jms/article/view/646" rel="noopener noreferrer"&gt;&lt;strong&gt;Design and Development of a Mobile Application Using Android Studio and Flutter&lt;/strong&gt;&lt;/a&gt; by ALEJANDRO FERRERO LIGORRED&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5207299" rel="noopener noreferrer"&gt;&lt;strong&gt;What Do Flutter Developers Ask About? An Empirical Study on Stack Overflow Posts&lt;/strong&gt;&lt;/a&gt; by Anthony Wambua&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ph.pollub.pl/index.php/jcsi/article/view/3007" rel="noopener noreferrer"&gt;&lt;strong&gt;Evaluation of Flutter framework time efficiency in context of user interface tasks&lt;/strong&gt;&lt;/a&gt; by Damian Białkowski and Jakub Smołka&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ar.iub.edu.bd/handle/11348/770" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Development at Dorao&lt;/strong&gt;&lt;/a&gt; by Nibrash Kazi Subah&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://trepo.tuni.fi/bitstream/handle/10024/133362/TuominenJoni.pdf?sequence=2" rel="noopener noreferrer"&gt;&lt;strong&gt;Evaluation of flutter as a migration target&lt;/strong&gt;&lt;/a&gt; by Joni Tuominen&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Ghifari-Munawar/publication/355476480_Performance_Analysis_of_BLoC_and_Provider_State_Management_Library_on_Flutter/links/61729861a767a03c149218fc/Performance-Analysis-of-BLoC-and-Provider-State-Management-Library-on-Flutter.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Performance analysis of BLoC and provider state management library on flutter&lt;/strong&gt;&lt;/a&gt; by Regawa Rama Prayoga, Ghifari Munawar, Rahil Jumiyani and Alifia Syalsabila&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://journal.iba-suk.edu.pk:8089/index.php/sjet/article/view/1192" rel="noopener noreferrer"&gt;&lt;strong&gt;Mobile apps development: Towards incorporating regional and national languages in flutter app&lt;/strong&gt;&lt;/a&gt; by Kamran Khan Rajput, Salahuddin Saddar, Hina Hussain, Umair Ayaz and Sadaquat Ali Ruk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://matheo.uliege.be/bitstream/2268.2/17386/6/Master_Thesis_Report.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of a Flutter module for ATHLETin&lt;/strong&gt;&lt;/a&gt; by Ahmed Alakhir&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://aaltodoc.aalto.fi/items/054f53f6-127f-4f07-a1ca-b33bcd888170" rel="noopener noreferrer"&gt;&lt;strong&gt;Expanding Flutter Framework: generative art with alternative tools&lt;/strong&gt;&lt;/a&gt; by Samuli Ristimäki&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/499862" rel="noopener noreferrer"&gt;&lt;strong&gt;A flashcard mobile application development with Flutter&lt;/strong&gt;&lt;/a&gt; by Tung Huynh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://unram.sgp1.digitaloceanspaces.com/simlitabmas/kinerja/penelitian/prosiding/198209042010121001-1611190842-wiriasto2020_icvee_.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Design and development of attendance system application using android-based flutter&lt;/strong&gt;&lt;/a&gt; by Giri Wahyu Wiriasto, Ramadan Wibi Surya Aji and Djul Fikry Budiman &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.cs.utep.edu/cheon/techreport/tr20-95.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Creating Flutter Apps from Native Android Apps&lt;/strong&gt;&lt;/a&gt; by Yoonsik Cheon and Carlos Chavez&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Bhavik-Dindor/publication/379194424_XXX-X-XXXX-XXXX-XXXXX00_C20XX_IEEE_Opportunities_with_Flutter_Development/links/65fecfc4d3a08551424503fb/XXX-X-XXXX-XXXX-X-XX-XX00-C20XX-IEEE-Opportunities-with-Flutter-Development.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Opportunities with Flutter Development&lt;/strong&gt;&lt;/a&gt; by Ambrish Dewangan, Bhavik Dindor, Shikhar Prakash Mahobia and Dr. Vinod Patidar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ejournal.seaninstitute.or.id/index.php/InfoSains/article/view/3554" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter framework mobile application development of gamified automotive reseller team management&lt;/strong&gt;&lt;/a&gt; by  Edmund Johnson and Gunawan Wang&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.scitepress.org/Papers/2020/94116/94116.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;State Management and Software Architecture Approaches in Cross-platform Flutter Applications&lt;/strong&gt;&lt;/a&gt; by Michał Szczepanik and Michał Kędziora&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://thesis.unipd.it/handle/20.500.12608/65953" rel="noopener noreferrer"&gt;&lt;strong&gt;Integration of Flutter Framework in Real-Life Applications: Technical and Development Practices&lt;/strong&gt;&lt;/a&gt; by YESIM UZUN&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Mahsa-Fischer/publication/370230001_Evaluation_of_the_Cross-Platform_Framework_Flutter_Using_the_Example_of_a_Cancer_Counselling_App/links/64a93716c41fb852dd5d6bea/Evaluation-of-the-Cross-Platform-Framework-Flutter-Using-the-Example-of-a-Cancer-Counselling-App.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Evaluation of the Cross-Platform Framework Flutter Using the Example of a Cancer Counselling App&lt;/strong&gt;&lt;/a&gt; by Leon Lovrić, Mahsa Fischer, Natalie Röderer and Alexander Wünsch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://elib.uni-stuttgart.de/server/api/core/bitstreams/4608bbe3-b1a8-4168-b6a2-7ffb1b4c1c87/content" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter on Windows Desktop: a use case based study&lt;/strong&gt;&lt;/a&gt; by Stefan Zindl&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/267674" rel="noopener noreferrer"&gt;&lt;strong&gt;State Management Analyses of the Flutter Application&lt;/strong&gt;&lt;/a&gt; by Avaa tiedosto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://matheo.uliege.be/handle/2268.2/19580" rel="noopener noreferrer"&gt;&lt;strong&gt;Master thesis: Integrating Wayland with Flutter&lt;/strong&gt;&lt;/a&gt; by Alex-Manuel Rosca&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://webthesis.biblio.polito.it/22858/?template=default" rel="noopener noreferrer"&gt;&lt;strong&gt;Review and testing of plugins in Flutter for Android and IOS&lt;/strong&gt;&lt;/a&gt; by Guido Albertengo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3867569" rel="noopener noreferrer"&gt;&lt;strong&gt;Over-The-Top (OTT) Media Application using Flutter&lt;/strong&gt;&lt;/a&gt; by Linda M. John, Nehal Mistry, Ritu Patel and Dipti Nagvekar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://files.eric.ed.gov/fulltext/ED638044.pdf#page=218" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter: The future of application development?&lt;/strong&gt;&lt;/a&gt; by Dieter Meiller&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://research-reels.com/wp-content/uploads/2024/05/Design-and-Development-of-a-Boundary-Alert-System-for-Fishermen.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Design and development of a boundary alert system for fishermen&lt;/strong&gt;&lt;/a&gt; by Zalak Thakrar and Atul Gonsai&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://arxiv.org/abs/2006.11904" rel="noopener noreferrer"&gt;&lt;strong&gt;The CARP mobile sensing framework - A cross-platform, reactive, programming framework and runtime environment for digital phenotyping&lt;/strong&gt;&lt;/a&gt; by Jakob E. Bardram&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ciir.in/doc/publication/Intelligent%20Electrical%20Systems_978-81-962236-9-4.pdf#page=41" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter in smart energy metering&lt;/strong&gt;&lt;/a&gt; by Ms. Priyanka Ray&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Mh-Suhartono/publication/387577312_Quick_sort_and_merge_sort_performance_comparison_in_the_flutter_framework_1/links/67747c2f00aa3770e0ccc450/Quick-sort-and-merge-sort-performance-comparison-in-the-flutter-framework-1.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Quick sort and merge sort performance comparison in the flutter framework&lt;/strong&gt;&lt;/a&gt; by Achmad Fahreza Alif Pahlevi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/499717" rel="noopener noreferrer"&gt;&lt;strong&gt;Mobile real-time object detection with Flutter&lt;/strong&gt;&lt;/a&gt; by Daniel Kusnetsoff &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.atlantis-press.com/proceedings/atasec-22/125982310" rel="noopener noreferrer"&gt;&lt;strong&gt;Qrcode recognition on flutter framework mobile application implemented on entrance security system&lt;/strong&gt;&lt;/a&gt; by Rosa Andrie Asmara, Rizky Putra Pradhana Budiman, Mungki Astiningrum, Brian Sayudha, Anik Nur Handayani and Cahya Rahmad&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://is.muni.cz/th/on45r/bachelors_thesis_Archive.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Using Flutter framework in multi-platform application implementation&lt;/strong&gt;&lt;/a&gt; by Miroslav Mikolaj&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://scholarworks.gvsu.edu/cistechlib/346/" rel="noopener noreferrer"&gt;&lt;strong&gt;Backdrop: An Exploration of Flutter&lt;/strong&gt;&lt;/a&gt; by Austin D. Latture&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.frontiersin.org/journals/virtual-reality/articles/10.3389/frvir.2022.1021932/pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Cloud-based cross-platform collaborative augmented reality in flutter&lt;/strong&gt;&lt;/a&gt; by Lars Carius, Christian Eichhorn, Linda Rudolph, David A. Plecher and Gudrun Klinker&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.scitepress.org/PublishedPapers/2022/107815/107815.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of a Platform-independent Renderer for the Rendering of OpenStreetMap Indoor Maps in Flutter&lt;/strong&gt;&lt;/a&gt; by Julia Richter, Robin Thomas, David Lange, Thomas Graichen and Ulrich Heinkel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.diva-portal.org/smash/record.jsf?pid=diva2:1981755" rel="noopener noreferrer"&gt;&lt;strong&gt;A Comprehensive Evaluation of Cloud Storage Access in Flutter Applications–Direct and API Based&lt;/strong&gt;&lt;/a&gt; by A Javed and Z Ghalioun&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ceur-ws.org/Vol-3171/paper94.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Specifics of Designing and Construction of the System for Deep Neural Networks Generation&lt;/strong&gt;&lt;/a&gt; by Oleksandr Mediakov and Taras Basyuk&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dergipark.org.tr/en/pub/iuyd/article/888243" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparison of flutter and react native platforms&lt;/strong&gt;&lt;/a&gt; by Ekrem Gülcüoğlu, Ahmet Berk Ustun and Neşet Seyhan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.politesi.polimi.it/handle/10589/217498" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparative analysis of scalable mobile app implementations: a case study with Flutter and Jetpack Compose&lt;/strong&gt;&lt;/a&gt; by Bendinelli Marco&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://webofproceedings.org/proceedings_series/ESSP/MEEIT%202024/T27.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;A Study of UI Construction in Android and Flutter: Comparative &amp;amp; Analysis&lt;/strong&gt;&lt;/a&gt; by Donglan Zou1 and Mohamad Yusof Darus&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://digitalcommons.ncf.edu/theses_etds/5863/" rel="noopener noreferrer"&gt;&lt;strong&gt;Analyzing The Difference In Development Between Flutter And Native Android Development&lt;/strong&gt;&lt;/a&gt; by Selena Goods&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.diva-portal.org/smash/record.jsf?pid=diva2:1768521" rel="noopener noreferrer"&gt;&lt;strong&gt;React Native vs. Flutter: A performance comparison between cross-platform mobile application development frameworks&lt;/strong&gt;&lt;/a&gt; by G Tollin and L Marcus &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://repository.tudelft.nl/file/File_8cec19dd-d987-42d9-9f3d-f2406b477654?preview=1" rel="noopener noreferrer"&gt;&lt;strong&gt;An Empirical Evaluation of the User Interface Energy Consumption of React Native and Flutter&lt;/strong&gt;&lt;/a&gt; by Erik Blokland&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/148975" rel="noopener noreferrer"&gt;&lt;strong&gt;Native-like cross-platform mobile development: Multi-os engine &amp;amp; kotlin native vs flutter&lt;/strong&gt;&lt;/a&gt; by Fayzullaev, Jakhongir&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Hina-Hussain-2/publication/361208165_Comparative_Study_of_Android_Native_and_Flutter_App_Development/links/635a857c12cbac6a3efff6b6/Comparative-Study-of-Android-Native-and-Flutter-App-Development.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparative study of Android Native and Flutter app development&lt;/strong&gt;&lt;/a&gt; by Hina Hussain, Kamran Khan, Faiza Farooqui, Dr. Qasim Ali Arain and Dr. Isma Farah Siddiqui&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cyberleninka.ru/article/n/performance-analysis-of-flutter-applications-vs-native-ios-and-android-apps" rel="noopener noreferrer"&gt;&lt;strong&gt;Performance analysis of Flutter applications vs. native iOS and Android apps&lt;/strong&gt;&lt;/a&gt; by Evgenii Mozharovski&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://aaltodoc.aalto.fi/items/3ddc2600-0e11-4468-8747-17cf27c3d9aa" rel="noopener noreferrer"&gt;&lt;strong&gt;Challenges and solutions in cross-platform mobile development: a qualitative study of Flutter and React Native&lt;/strong&gt;&lt;/a&gt; by Zhou Changkong&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.diva-portal.org/smash/get/diva2:1349917/FULLTEXT01.pdf." rel="noopener noreferrer"&gt;&lt;strong&gt;Performance comparison between react native and flutter&lt;/strong&gt;&lt;/a&gt; by J Jagiello&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ir.uitm.edu.my/id/eprint/105190/" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparative analysis of UI construction and performance in android and flutter frameworks&lt;/strong&gt;&lt;/a&gt; by Zou Donglan, Mohamad Yusof Darus, Maslina Abdul Aziz and Suzana Zambri&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.doria.fi/handle/10024/192774" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparative Analysis of React Native, Kotlin, and Flutter for Cross-Platform Mobile Development&lt;/strong&gt;&lt;/a&gt; by Muhammad Usama Riaz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Emre-Erturk-3/publication/354463054_2021_Proceedings_Book_of_the_12th_Annual_CITRENZ_Conference/links/6139cb90a3a397270a8fb280/2021-Proceedings-Book-of-the-12th-Annual-CITRENZ-Conference.pdf#page=68" rel="noopener noreferrer"&gt;&lt;strong&gt;A comparative study of cross-platform mobile application development&lt;/strong&gt;&lt;/a&gt; by Dongliang You&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://pratibodh.org/index.php/pratibodh/article/download/118/129" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparison study of React Native Versus Flutter&lt;/strong&gt;&lt;/a&gt; by Chintan Grover, Opal Jain, Aman Kaushik and Dr. Vinita Mathur&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.doria.fi/handle/10024/180002" rel="noopener noreferrer"&gt;&lt;strong&gt;Evaluation of React Native and Flutter for cross-platform mobile application development&lt;/strong&gt;&lt;/a&gt; by Elin Hjort&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/abs/10.1145/3590837.3590897" rel="noopener noreferrer"&gt;&lt;strong&gt;Cross-platform empirical analysis of mobile application development frameworks: Kotlin, react native and flutter&lt;/strong&gt;&lt;/a&gt; by Dr Bhawna Suri, Dr Shweta Taneja, Isha Bhanot, Himanshi Sharma and Aanchal Raj&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jyx.jyu.fi/jyx/Record/jyx_123456789_70969" rel="noopener noreferrer"&gt;&lt;strong&gt;Cross platform mobile application development: a comparison study of React Native Vs Flutter&lt;/strong&gt;&lt;/a&gt; by Fentaw Awel Eshetu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ijaims.smiu.edu.pk/index.php/AIMS/article/view/19" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparative analysis between flutter and react native&lt;/strong&gt;&lt;/a&gt; by Sharjeel Moqrab Khan, Aftab ul Nabi and Tahir Hussain Bhanbhro&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.diva-portal.org/smash/get/diva2:1442804/FULLTEXT01.pdf." rel="noopener noreferrer"&gt;&lt;strong&gt;A comparison of performance and looks between flutter and native applications&lt;/strong&gt;&lt;/a&gt; by M Olsson&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage Report
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jsret.knpub.com/index.php/jrest/article/view/593" rel="noopener noreferrer"&gt;&lt;strong&gt;Utilization of Flutter Framework in Developing an Android-Based Cooking Recipe Application&lt;/strong&gt;&lt;/a&gt; by Saniah Evatri Algadrie and Enny Itje Sela&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://jurnal-tmit.com/index.php/home/article/view/1718" rel="noopener noreferrer"&gt;&lt;strong&gt;Design, integration, and deployment of a Flutter–Firebase mobile commerce application at Berlian Tech&lt;/strong&gt;&lt;/a&gt; by Labib Falah Athallah, Achmad Habib and Geri Kusnanto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/752366" rel="noopener noreferrer"&gt;&lt;strong&gt;E-Commerce application with Flutter framework&lt;/strong&gt;&lt;/a&gt; by Adnan Naseer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://proceedings.stis.ac.id/icdsos/article/download/404/150" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of FASIH Application for the Badan Pusat Statistisk using flutter framework&lt;/strong&gt;&lt;/a&gt; by R Prasetia and L R Maghfiroh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/handle/10024/855652" rel="noopener noreferrer"&gt;&lt;strong&gt;Building a fullstack mobile application with flutter and stable diffusion model&lt;/strong&gt;&lt;/a&gt; by Luan Nguyen and Minh Hoang&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Suhas-Kulkarni-12/publication/394234381_INDIAN_SOCIETY_FOR_TECHNICAL_EDUCATION/links/688dd1274b43d744fa6eb03b/INDIAN-SOCIETY-FOR-TECHNICAL-EDUCATION.pdf#page=71" rel="noopener noreferrer"&gt;&lt;strong&gt;CakeMeup App-Investigating the use of Flutter and Firebase for Developing E-Commerce Solution for a Cake Shop&lt;/strong&gt;&lt;/a&gt; by Sprooha Athalye, Sanika Pawar, Gaurav Vaze, Sakshi Kadam and Manali Jangale&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://journal.msti-indonesia.com/index.php/jms/article/view/133" rel="noopener noreferrer"&gt;&lt;strong&gt;Reimbursement Application Using Rest API Methods and Android-Based Flutter Framework&lt;/strong&gt;&lt;/a&gt; by Febby Renardi, NM Faizah and Lucky Koryanto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pubs.aip.org/aip/acp/article-abstract/2946/1/040006/2920584" rel="noopener noreferrer"&gt;&lt;strong&gt;Implementation of crop disease detection system using flutter&lt;/strong&gt;&lt;/a&gt; by Sunny Bhatt and Shivam Hingu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://transplantation.cureus.com/articles/374325-design-and-implementation-of-a-dental-english-learning-application-using-flutter.pdf?email=" rel="noopener noreferrer"&gt;&lt;strong&gt;Design and Implementation of a Dental English Learning Application Using Flutter&lt;/strong&gt;&lt;/a&gt; by &lt;br&gt;
Yuta Otsuka, Tadahiro Higashinakao, Fumiko Nishio and Hiroshi Kono&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://journal.binus.ac.id/index.php/EMACS/article/view/10921" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of Mobile QR Warehouse Management Apllication Based on Flutter and Firebase&lt;/strong&gt;&lt;/a&gt; by Irma Kartika Wairooy, Ignatius Dillwyn, Kevin Putra Yonathan and Andre Lay&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://journal.yaumil.org/index.php/ijsr/article/view/5" rel="noopener noreferrer"&gt;&lt;strong&gt;Building a Worship Demand Application with The Waterfall Method Using Flutter Framework at The Al-Muttaqin Mosque Suralaga, Indonesia&lt;/strong&gt;&lt;/a&gt; by Ahmad Subki, Muhamad Masjun Efendi and Erfan Wahyudi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5184492" rel="noopener noreferrer"&gt;&lt;strong&gt;Cross-platform campus news flutter app&lt;/strong&gt;&lt;/a&gt; by David Osei Opoku&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://oa.upm.es/id/eprint/82457" rel="noopener noreferrer"&gt;&lt;strong&gt;Developing a cross-platform mobile application for health data integration and capture from multi devices using Flutter&lt;/strong&gt;&lt;/a&gt; by A Farmanesh&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pdfs.semanticscholar.org/8ea4/cd5463a21a927bd8b3b02210094b1f0110bc.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;The Development Of A Mobile Application For Fruit Garden Tourism Information System In Sidoarjo Using Flutter&lt;/strong&gt;&lt;/a&gt; by Mohammad Fadli Zaka1, Ade Eviyanti and Yulian Findawati&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.academia.edu/download/112037224/JETIR2105692.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;E-commerce application for local stores&lt;/strong&gt;&lt;/a&gt; by Marya Anwar, Nuzhat Saba, Isha Admane, Saloni Khandelwal, &lt;br&gt;
Vipul Tembhurne and Jyoti C. Kolte&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://journals.telkomuniversity.ac.id/cepat/article/download/4852/1827" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of Course Booking System (Front-end &amp;amp; Back-end) Based on Mobile Application to Help Tutoring Elementary and Junior High School in Indonesia&lt;/strong&gt;&lt;/a&gt; by Elsa Febrianti, Kamilia Luthfiyyah, Septi Hidayah, Aji SasongkoBurhanuddin Dirgantoro and Umar Ali Ahmad&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://fileserver-az.core.ac.uk/download/547377926.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;SocialBook: a social network for sharing books built with Flutter and Firebase&lt;/strong&gt;&lt;/a&gt; by Veselin Radoslavov Solenkov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://matheo.uliege.be/handle/2268.2/19541" rel="noopener noreferrer"&gt;&lt;strong&gt;Master thesis: Development of a Flutter module for ATHLETin&lt;/strong&gt;&lt;/a&gt; by Stephan Bulut&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://journal-isi.org.adsii.or.id/index.php/isi/article/view/650" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploration of Modernity: Worship Reservation System at Rose of Sharon Church Salatiga Utilizing Flutter Framework&lt;/strong&gt;&lt;/a&gt; by Davin Kurnia Hiuredhy and Henoch Juli Christanto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.mdpi.com/2073-431X/14/10/417" rel="noopener noreferrer"&gt;&lt;strong&gt;A Guided Self-Study Platform of Integrating Documentation, Code, Visual Output, and Exercise for Flutter Cross-Platform Mobile Programming&lt;/strong&gt;&lt;/a&gt; by by Safira Adine Kinari, Nobuo Funabiki, Soe Thandar Aung and Htoo Htoo Sandi Kyaw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.theseus.fi/bitstream/handle/10024/703550/Ala-aho_Joel_Karjalainen_Ossi.pdf?sequence=2" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of a Flutter Mobile Application Using Spotify's Application Programming Interface&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ieeexplore.ieee.org/abstract/document/9429595/" rel="noopener noreferrer"&gt;&lt;strong&gt;Design and development of mobile healthcare application prototype using flutter&lt;/strong&gt;&lt;/a&gt; by Ragda Mamoun, Mohamed Nasor and Sahar H. Abulikailik&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jurnal.kdi.or.id/index.php/bt/article/view/423" rel="noopener noreferrer"&gt;&lt;strong&gt;Online learning service application design using Flutter and Laravel framework&lt;/strong&gt;&lt;/a&gt; by Yusuf Kurnia and Geraldi Aditya&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jurnal.kdi.or.id/index.php/bt/article/view/2890" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of an Android Application for Recipe Management Using Flutter and API&lt;/strong&gt;&lt;/a&gt; by  Eko Sutono,  Adam Muiz and  Muhammad Hafiz Pratama &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jcrinn.com/index.php/jcrinn/article/view/369" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of Employee Attendance Management System using Flutter&lt;/strong&gt;&lt;/a&gt; by Muhamad Faiz Akmal Mohamad Noor, Alif Faisal Ibrahim and Muhammad Nabil Fikri Jamaluddin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://prosiding.umy.ac.id/grace/index.php/pgrace/article/view/594" rel="noopener noreferrer"&gt;&lt;strong&gt;Implementation of Prototype Method on Online Fruit Store Service Application Using Flutter Framework&lt;/strong&gt;&lt;/a&gt; by  Wahyu Aji Suryantoro,  Setiya Nugroho and  Ardhin Primadewi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Shatha-Abdullah-5/publication/359337292_Designing_an_Android_application_using_the_software_platform_FLUTTER_to_alert_the_times_of_medical_treatments_MT/links/62358f99d545b77294032927/Designing-an-Android-application-using-the-software-platform-FLUTTER-to-alert-the-times-of-medical-treatments-MT.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Designing an Android application using the software platform (FLUTTER) to alert the times of medical treatments (MT)&lt;/strong&gt;&lt;/a&gt; by Layla Esam Mohammed and Shatha Abdullah Mohammed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://jurnal.sttmcileungsi.ac.id/index.php/tekno/article/view/2087" rel="noopener noreferrer"&gt;&lt;strong&gt;Implementation of flutter in the development of an Android E-Commerce furniture application using the Sdlc Waterfall Method&lt;/strong&gt; (A case study of mandiri furniture)&lt;/a&gt; by Umar Tsani Abdurrahman and Kuncoro Adin Nugraha&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://publisher.uthm.edu.my/periodicals/index.php/aitcs/article/view/12380" rel="noopener noreferrer"&gt;&lt;strong&gt;The Development of Mobile Application of Organ Donation Using Flutter&lt;/strong&gt;&lt;/a&gt; by Kai Sian Ong&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://is.muni.cz/th/goqzu/The_Security_of_Flutter_s_Architecture_Archive.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;The Security of Flutter's Architecture&lt;/strong&gt;&lt;/a&gt; by MARO S ZELENAK &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jurnal.umsu.ac.id/index.php/jcositte/article/view/26969" rel="noopener noreferrer"&gt;&lt;strong&gt;Secure Data Management: An Implementation of Advanced Encryption Standard in a Flutter-Based Notes App&lt;/strong&gt;&lt;/a&gt; by Adetokunbo Abayomi Adenowo, Mary A. Adedoyin and Oluwasegun J. Adebiyi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://is.muni.cz/th/dkmwp/Thesis___Safety_Widget_Archive.pdf" rel="noopener noreferrer"&gt;Safety Widget&lt;/a&gt; by TOMÁŠ PSOTA &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Saifalmajd-Almassri/publication/375456009_Enhancing_Mobile_Security_through_a_Comprehensive_Development_Package/links/654b0925b1398a779d6e42cd/Enhancing-Mobile-Security-through-a-Comprehensive-Development-Package.pdf" rel="noopener noreferrer"&gt;Enhancing Mobile Security through a Comprehensive Development Package&lt;/a&gt; by SaifAlmajd M. H. Almassri&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Talks
&lt;/h1&gt;

&lt;p&gt;Too many interesting talks can be found on Youtube, Flutter is way more popular than Dart itself. So, it was kinda hard to select few talks from the long list of choice I got.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=""&gt;&lt;strong&gt;Flutter Plugins - From Method Channels to Native Interop - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Dominik Roszkowski&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oMkseVnj0oE" rel="noopener noreferrer"&gt;&lt;strong&gt;Advanced Memory Management in Flutter - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Maher Jaafar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Vca0NipZWdA" rel="noopener noreferrer"&gt;&lt;strong&gt;Let’s Talk About Memory Leaks In Dart And Flutter - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Majid Hajian&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=vBzOtyq4ltA" rel="noopener noreferrer"&gt;&lt;strong&gt;Hack My App: Learn Flutter Security by Breaking It - Fluttercon India 2025&lt;/strong&gt;&lt;/a&gt; by Gauri Panse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=J_1g8CQbWhY" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter with WebRTC for real-time screen sharing - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Stanislav Sydorenko&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=n6sD2Jp-zLY" rel="noopener noreferrer"&gt;&lt;strong&gt;Crash-Proof Flutter: Building Apps That Refuse to Die - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Pawan Kumar &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=9RpHFg9UdNU" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Performance: No Silver Bullet, Only Smart Engineering - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Mikhail Zotyev&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=cr5rIn_KbQI" rel="noopener noreferrer"&gt;&lt;strong&gt;No touch. No gestures. Can you still build a Great UX? - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Vadym Pinchuk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=wQLy2VlxN2Y" rel="noopener noreferrer"&gt;&lt;strong&gt;Fearless Flutter Debugging: When All Else Fails, Hack the Tools! - Fluttercon EU 2025&lt;/strong&gt;&lt;/a&gt; by Mateusz Wojtczak&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=SMzlGSJuQVg" rel="noopener noreferrer"&gt;&lt;strong&gt;Using Dart FFI for Compute-Heavy Tasks in Flutter Apps - Robert | Fluttercon India 2025&lt;/strong&gt;&lt;/a&gt; by Robert Odrowaz-Sypniewski&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=C09dsxrOIaQ" rel="noopener noreferrer"&gt;&lt;strong&gt;Easy state restoration with Flutter - Fluttercon EU 2024&lt;/strong&gt;&lt;/a&gt; by Lucas Goldner&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=74bwXTc8FiU" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploring Static Code Analysis techniques in Flutter - Fluttercon EU 2024&lt;/strong&gt;&lt;/a&gt; by Daria Orlova&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=iiFs4UfEUys" rel="noopener noreferrer"&gt;&lt;strong&gt;The art of Flutter testing - Fluttercon USA 2024&lt;/strong&gt;&lt;/a&gt; by Matt Carroll&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=MqZlsAmAF70" rel="noopener noreferrer"&gt;&lt;strong&gt;Code Meets Art: Flutter for Creative Coding - Fluttercon EU 2024&lt;/strong&gt;&lt;/a&gt; by Roaa Khaddam&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=CnTHL8mbv7k" rel="noopener noreferrer"&gt;&lt;strong&gt;real world use cases in Flutter with GoRouter and GoRouterBuilder -  Fluttercon EU 2024&lt;/strong&gt;&lt;/a&gt; by Max Weber&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=rAoN_WMyywk" rel="noopener noreferrer"&gt;&lt;strong&gt;Building a package with assets - Fluttercon USA 2024&lt;/strong&gt;&lt;/a&gt; by Moritz Sümmermann &amp;amp; Daco Harkes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=p6zTVJKQ660" rel="noopener noreferrer"&gt;&lt;strong&gt;Realtime Communications with Flutter - Fluttercon EU 2024&lt;/strong&gt;&lt;/a&gt; by Simon Lightfoot &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=dPPRS-GimgI" rel="noopener noreferrer"&gt;*&lt;em&gt;Debugging performance issues with the Flutter DevTools - Fluttercon EU 2024&lt;br&gt;
*&lt;/em&gt;&lt;/a&gt; by Alexandre Moureaux&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=y23PsvpSx5A" rel="noopener noreferrer"&gt;**Securing Flutter Apps - droidcon London 2022&lt;/a&gt; by Majid Hajian&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=hXKfvQrbSeo" rel="noopener noreferrer"&gt;&lt;strong&gt;KarmaApp - Why we choose flutter and Firebase - droidcon London 2022&lt;/strong&gt;&lt;/a&gt; by  Sumith Damodaran&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Tn4Pp5ny7S4" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter on Desktop: End to end from build to distribution - droidcon London 2022&lt;/strong&gt;&lt;/a&gt; by Teresa Wu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Ei4ucoeUbu0" rel="noopener noreferrer"&gt;&lt;strong&gt;How Flutter Can Change the Future of Urban Communities - StrangeLoop 2021&lt;/strong&gt;&lt;/a&gt; by Edward Thornton&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=stoJpMeS5aY" rel="noopener noreferrer"&gt;&lt;strong&gt;Material Theming with Flutter - Flutter Interact 2019&lt;/strong&gt;&lt;/a&gt; by Yasmine Evjen&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=d_m5csmrf7I" rel="noopener noreferrer"&gt;&lt;strong&gt;Pragmatic State Management in Flutter - Google I/O 2019&lt;/strong&gt;&lt;/a&gt; by Filip Hracek and Matt Sullivan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://youtu.be/BfU4u_5N95M" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter for Business - Mobile World Congress 2019&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=X-4LJSqCPzM" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Meets the Physical World at OSCON 2019&lt;/strong&gt;&lt;/a&gt; by Emily Fortuna and Matt Sullivan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=YSULAJf6R6M" rel="noopener noreferrer"&gt;Beyond Mobile: Material Design, Adaptable UIs, and Flutter - Google I/O 2019&lt;/a&gt; by Anthony Robledo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VUiVkDpikDI" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter: How we're building a UI framework for tomorrow at Google - StrangeLoop 2017&lt;/strong&gt;&lt;/a&gt; by Eric Seidel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1BXg4wfB9pA&amp;amp;pp=ygUMR09UTyBmbHV0dGVy" rel="noopener noreferrer"&gt;*&lt;em&gt;Flutter: The Best Way to Build for Mobile? -GOTO 2017&lt;br&gt;
*&lt;/em&gt;&lt;/a&gt; by Kasper Lund&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conferences
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.fluttertechsummit.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Tech Summit&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flutterheroes.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Heroes&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flutterconnection.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Connection&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.flutterconusa.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Fluttercon&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Orzvd1boCbs&amp;amp;list=PL9Pfzam3fFdeWOBXQ9JFwa63VMcVy8SWr" rel="noopener noreferrer"&gt;Fluttercon USA 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=zNtp-ba9DmI&amp;amp;list=PL9Pfzam3fFdd9B9H_VO90jyJ0OZKXHaGk" rel="noopener noreferrer"&gt;Fluttercon EU 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=UELHA6XFvNU&amp;amp;list=PL9Pfzam3fFddOEzlOzjP0JBXQnuhJlz_l" rel="noopener noreferrer"&gt;Fluttercon India 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=u_seFWyVRTc&amp;amp;list=PL9Pfzam3fFdekLltkxypRRLUavhcKsEUk" rel="noopener noreferrer"&gt;Fluttercon USA 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qOOvt2R1l6s&amp;amp;list=PL9Pfzam3fFdc2DGdR0PcLewAdMje4gP5e" rel="noopener noreferrer"&gt;Fluttercon EU 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=t38dEZfrgLs&amp;amp;list=PLvik14IzME-iIkfC6xLh6EzwHvV2HDW6b" rel="noopener noreferrer"&gt;Fluttercon 2023&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@flutterconf" rel="noopener noreferrer"&gt;&lt;strong&gt;FlutterConf&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@FlutterNFriends" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter &amp;amp; Friends&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@mDevCamp" rel="noopener noreferrer"&gt;&lt;strong&gt;mDevCamp&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@AllThingsOpen" rel="noopener noreferrer"&gt;&lt;strong&gt;All Things Open&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@FlutterCommunity" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Community&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@flutterkaigi" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Kaigi&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Tools and Other Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Solido/awesome-flutter" rel="noopener noreferrer"&gt;&lt;strong&gt;Awesome Flutter List&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/azam-izm/flutter-from-zero-to-hero" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter From Zero to Hero&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@kharaoke?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Khara Woods&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/brown-and-white-abstract-painting-PSxo7estxBs?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>documentation</category>
      <category>resources</category>
    </item>
    <item>
      <title>Using dio HTTP Client in Dart</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Fri, 15 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/using-dio-http-client-in-dart-29ic</link>
      <guid>https://dev.to/niamtokik/using-dio-http-client-in-dart-29ic</guid>
      <description>&lt;p&gt;The low-level HTTP Client and a higher level implementation with the http package have been tested previously. This time, we will try another high level implementation of an HTTP client in Dart called &lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;&lt;code&gt;dio&lt;/code&gt;&lt;/a&gt;. This client seems way more flexible than the previous clients, and embed great features. Furthermore, based on pub.dev, it looks like it's a popular choice. If you are interested to see some examples, you can look into &lt;a href="https://github.com/cfug/dio/blob/main/example_dart/lib/" rel="noopener noreferrer"&gt;&lt;code&gt;example_dart/lib&lt;/code&gt;&lt;/a&gt; directory from their &lt;a href="https://github.com/cfug/dio" rel="noopener noreferrer"&gt;official repository&lt;/a&gt;. Anyway the first step to use it is to add it in the dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;dart pub add dio
dart pub get
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time, instead of of using our own quick and dirty HTTP server using &lt;a href="https://man.openbsd.org/nc.1" rel="noopener noreferrer"&gt;&lt;code&gt;netcat&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://docs.python.org/3/library/http.server.html" rel="noopener noreferrer"&gt;Python &lt;code&gt;http.server&lt;/code&gt; module&lt;/a&gt;, let use the free &lt;a href="https://beeceptor.com/resources/http-echo/" rel="noopener noreferrer"&gt;HTTP Echo Server service&lt;/a&gt;. The idea is to simply creates some requests to this server and print the data returned.&lt;/p&gt;

&lt;p&gt;As usual, the first step is to import the package in &lt;code&gt;bin/httpcat.dart&lt;/code&gt;.&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:dio/dio.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, let create/configure a &lt;code&gt;dio&lt;/code&gt; client object using the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio-class.html" rel="noopener noreferrer"&gt;Dio&lt;/a&gt; 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;final&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'https://echo.free.beeceptor.com'&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;BaseOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;baseUrl:&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;connectTimeout:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;receiveTimeout:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;contentType:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;followRedirects:&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;maxRedirects:&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;persistentConnection:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;preserveHeaderCase:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// receiveDataWhenStatusError; ...&lt;/span&gt;
    &lt;span class="c1"&gt;// requestEncoder: ...&lt;/span&gt;
    &lt;span class="c1"&gt;// responseDecoder: ...&lt;/span&gt;
    &lt;span class="c1"&gt;// responseType: ...                            &lt;/span&gt;
    &lt;span class="c1"&gt;// sendTimeout: ...                             &lt;/span&gt;
    &lt;span class="c1"&gt;// validateStatus: ...&lt;/span&gt;
    &lt;span class="nl"&gt;headers:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;HttpHeaders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userAgentHeader&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'dio'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'x-custom'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'custom'&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;The &lt;code&gt;Dio&lt;/code&gt; class constructor accepts a &lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;BaseOptions&lt;/code&gt;&lt;/a&gt; object, containing the options to configure for the HTTP client. As you can already see in the previous snippet, plenty of attributes are available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/OptionsMixin/baseUrl.html" rel="noopener noreferrer"&gt;&lt;code&gt;baseUrl&lt;/code&gt;&lt;/a&gt;: set the URL target as &lt;code&gt;String&lt;/code&gt;. It must be a valid URL;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/OptionsMixin/connectTimeout.html" rel="noopener noreferrer"&gt;&lt;code&gt;connectTimeout&lt;/code&gt;&lt;/a&gt;: the connection timeout out as &lt;code&gt;int&lt;/code&gt;, when the client is opening a new connection to the remote server. Setting it to &lt;code&gt;null&lt;/code&gt; or to &lt;code&gt;Duration.zero&lt;/code&gt; will wait for the connection forever;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/contentType.html" rel="noopener noreferrer"&gt;&lt;code&gt;contentType&lt;/code&gt;&lt;/a&gt;: set the &lt;code&gt;Content-Type&lt;/code&gt; HTTP header as a String;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/followRedirects.html" rel="noopener noreferrer"&gt;&lt;code&gt;followRedirects&lt;/code&gt;&lt;/a&gt;: a Boolean value to define if the client should follow the redirection returned by the server;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/maxRedirects.html" rel="noopener noreferrer"&gt;&lt;code&gt;maxRedirects&lt;/code&gt;&lt;/a&gt;: the maximum number of redirection the client is allowed to follow defined as &lt;code&gt;int&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/persistentConnection.html" rel="noopener noreferrer"&gt;&lt;code&gt;persistentConnection&lt;/code&gt;&lt;/a&gt;: define if the client should use a persistent connection or not as boolean;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/preserveHeaderCase.html" rel="noopener noreferrer"&gt;&lt;code&gt;preserveHeaderCase&lt;/code&gt;&lt;/a&gt;: keep the header case unmodified during the request, defined as boolean;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/OptionsMixin/queryParameters.html" rel="noopener noreferrer"&gt;&lt;code&gt;queryParameters&lt;/code&gt;&lt;/a&gt;: set the query parameters of the request as &lt;code&gt;Map&amp;lt;String, dynamic&amp;gt;&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/receiveDataWhenStatusError.html" rel="noopener noreferrer"&gt;&lt;code&gt;receiveDataWhenStatusError&lt;/code&gt;&lt;/a&gt;: I will need to check the code for this one, but I assume when an error is returned, the data received is dropped, if we set this property to &lt;code&gt;true&lt;/code&gt;, we should then be able to receive the data from the error;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/receiveTimeout.html" rel="noopener noreferrer"&gt;&lt;code&gt;receiveTimeout&lt;/code&gt;&lt;/a&gt;: set the timeout as a &lt;code&gt;Duration&lt;/code&gt; for the data sent by the server;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/requestEncoder.html" rel="noopener noreferrer"&gt;&lt;code&gt;requestEncoder&lt;/code&gt;&lt;/a&gt;: define a custom request encoder using &lt;a href="https://pub.dev/documentation/dio/latest/dio/RequestEncoder.html" rel="noopener noreferrer"&gt;&lt;code&gt;RequestEncoder&lt;/code&gt;&lt;/a&gt; type as function callback. A way to use it, like defined in the tests:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestEncoder&lt;/span&gt; &lt;span class="o"&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;_&lt;/span&gt;&lt;span class="p"&gt;)&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;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;utf8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&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="c1"&gt;// or&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestEncoder&lt;/span&gt; &lt;span class="o"&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;_&lt;/span&gt;&lt;span class="p"&gt;)&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;utf8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/responseDecoder.html" rel="noopener noreferrer"&gt;&lt;code&gt;responseDecoder&lt;/code&gt;&lt;/a&gt;: define a custom response decoder using &lt;a href="https://pub.dev/documentation/dio/latest/dio/ResponseDecoder.html" rel="noopener noreferrer"&gt;&lt;code&gt;ResponseDecoder&lt;/code&gt;&lt;/a&gt; type as function callback. It can be used like the following snippet from the test suite.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt; &lt;span class="n"&gt;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;responseDecoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;___&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// or&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;responseDecoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;___&lt;/span&gt;&lt;span class="p"&gt;)&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;Future&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'example'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// or&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;responseDecoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;___&lt;/span&gt;&lt;span class="p"&gt;)&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;'example'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/responseType.html" rel="noopener noreferrer"&gt;&lt;code&gt;responseType&lt;/code&gt;&lt;/a&gt;: set the kind of response wanted by the client. For example, it can be set to &lt;code&gt;ResponseType.stream&lt;/code&gt;, &lt;code&gt;ResponseType.plain&lt;/code&gt; or &lt;code&gt;ResponseType.bytes&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/sendTimeout.html" rel="noopener noreferrer"&gt;&lt;code&gt;sendTimeout&lt;/code&gt;&lt;/a&gt;: set the client send timeout, when data is being uploaded to the server;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/validateStatus.html" rel="noopener noreferrer"&gt;&lt;code&gt;validateStatus&lt;/code&gt;&lt;/a&gt;: set a custom function callback defining if a request status is good or not, using &lt;a href="https://pub.dev/documentation/dio/latest/dio/ValidateStatus.html" rel="noopener noreferrer"&gt;&lt;code&gt;ValidateStatus&lt;/code&gt;&lt;/a&gt; type. Here an example of usage from the test suite, the &lt;code&gt;status&lt;/code&gt; parameter is an integer representing the HTTP status code.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="nl"&gt;validateStatus:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// or&lt;/span&gt;
&lt;span class="nl"&gt;validateStatus:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/BaseOptions/headers.html" rel="noopener noreferrer"&gt;&lt;code&gt;headers&lt;/code&gt;&lt;/a&gt;: configure a &lt;code&gt;Map&amp;lt;String, dynamic&amp;gt;&lt;/code&gt; as HTTP Headers. Standardized HTTP Headers keys can be found in &lt;a href="https://api.dart.dev/dart-io/HttpHeaders-class.html#constants" rel="noopener noreferrer"&gt;&lt;code&gt;HttpHeaders&lt;/code&gt;&lt;/a&gt; class, defined as constants, for example &lt;a href="https://api.dart.dev/dart-io/HttpHeaders/acceptEncodingHeader-constant.html" rel="noopener noreferrer"&gt;&lt;code&gt;acceptEncodingHeader&lt;/code&gt;&lt;/a&gt; contains the string &lt;code&gt;accept-encoding&lt;/code&gt;. The code in charge of this part can be seen in &lt;a href="https://github.com/cfug/dio/blob/main/dio/lib/src/headers.dart" rel="noopener noreferrer"&gt;&lt;code&gt;dio/lib/src/headers.dart&lt;/code&gt;&lt;/a&gt;, it contains some constants;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After having created a &lt;code&gt;Dio&lt;/code&gt; object, one can use different way to execute a request, but usually, two conventions can be used, using the &lt;code&gt;baseUrl&lt;/code&gt; attribute set in the object, or pass it an &lt;code&gt;Uri&lt;/code&gt; object.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET Method

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/get.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.get(path)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;path&lt;/code&gt; is a &lt;code&gt;String&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/getUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.getUri(uri)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;uri&lt;/code&gt; is an &lt;code&gt;Uri&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;HEAD Method

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/head.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.head(path)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;path&lt;/code&gt; is a &lt;code&gt;String&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/headUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.headUri(uri)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;uri&lt;/code&gt; is an &lt;code&gt;Uri&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;POST Method

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/post.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.post(path)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;path&lt;/code&gt; is a &lt;code&gt;String&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/postUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.postUri(uri)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;uri&lt;/code&gt; is an &lt;code&gt;Uri&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;PUT Method

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/put.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.put(path)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;path&lt;/code&gt; is a &lt;code&gt;String&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/putUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.putUri(uri)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;uri&lt;/code&gt; is an &lt;code&gt;Uri&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;DELETE Method

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/delete.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.delete(path)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;path&lt;/code&gt; is a &lt;code&gt;String&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/deleteUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;dio.deleteUri(uri)&lt;/code&gt;&lt;/a&gt; where &lt;code&gt;uri&lt;/code&gt; is an &lt;code&gt;Uri&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;PATCH Method

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/patch.html" rel="noopener noreferrer"&gt;dio.patch(path)&lt;/a&gt; where &lt;code&gt;path&lt;/code&gt; is a &lt;code&gt;String&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/patchUri.html" rel="noopener noreferrer"&gt;dio.patchUri(uri)&lt;/a&gt; where &lt;code&gt;uri&lt;/code&gt; is an &lt;code&gt;Uri&lt;/code&gt; object&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;So, before starting, the &lt;code&gt;main()&lt;/code&gt; function will be modified to add a &lt;code&gt;switch&lt;/code&gt; statement, and then, easily test each method from the CLI.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&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="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&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;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&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="s"&gt;"Usage: httpcat TARGET"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"get"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;getRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"head"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;headRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;postRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"put"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;putRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"delete"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;deleteRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"patch"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;patchRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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;url&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="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&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;ret&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;Then, the code will be called like that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart run ./bin/httpcat.dart get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another quick modification is required to help seeing the answers from the server. Let create a function called &lt;code&gt;printResponse()&lt;/code&gt; to print the data from the response.&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;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&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="s"&gt;'status'&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;statusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'status_msg'&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;statusMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'uri'&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;realUri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&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;span class="s"&gt;'data'&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;data&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;It will simply print to STDOUT the attributes available in a &lt;a href="https://pub.dev/documentation/dio/latest/dio/Response-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Response&lt;/code&gt;&lt;/a&gt; object.&lt;/p&gt;

&lt;h1&gt;
  
  
  GET Method
&lt;/h1&gt;

&lt;p&gt;Probably one of the most used HTTP request is the &lt;a href="https://www.rfc-editor.org/rfc/rfc2616#section-9.3" rel="noopener noreferrer"&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/a&gt; one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the entity in the response and not the source text of the process, unless that text happens to be the output of the process.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://www.rfc-editor.org/rfc/rfc2616#section-9.3" rel="noopener noreferrer"&gt;RFC2616, section 9.3&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;getRequest()&lt;/code&gt; will use &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/get.html" rel="noopener noreferrer"&gt;&lt;code&gt;get()&lt;/code&gt;&lt;/a&gt; method to fetch &lt;code&gt;/&lt;/code&gt;:&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;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;dio&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;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                                            
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Let run this code to see what it will return from the CLI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart get
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://echo.free.beeceptor.com/, headers: connection: close
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;transfer-encoding: chunked
access-control-allow-origin: *
date: Wed, 13 May 2026 12:39:47 GMT
vary: Accept-Encoding
content-type: application/json
via: 1.1 Caddy
, data: {method: GET, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:38247, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Accept-Encoding: gzip, Via: 1.1 Caddy, X-Custom: custom}, parsedQueryParams: {}}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer from the server is printed alongside with the status and other information. The return data is a JSON object, containing my - modified - IP address, the headers and so on.&lt;/p&gt;

&lt;h1&gt;
  
  
  HEAD Method
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request. This method can be used for obtaining metainformation about the entity implied by the request without transferring the entity-body itself. This method is often used for testing hypertext links for validity, accessibility, and recent modification.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://&amp;lt;br&amp;gt;%0Awww.rfc-editor.org/rfc/rfc2616#section-9.4" rel="noopener noreferrer"&gt;RFC2616, section 9.4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;headerRequest()&lt;/code&gt; function will use &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/head.html" rel="noopener noreferrer"&gt;&lt;code&gt;head()&lt;/code&gt;&lt;/a&gt; method and print the response.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;headRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Let execute this function now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://echo.free.beeceptor.com/, headers: connection: close
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;access-control-allow-origin: *
date: Wed, 13 May 2026 12:48:48 GMT
vary: Accept-Encoding
content-type: application/json
via: 1.1 Caddy
, data: null}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No data is returned there, it's normal. HTTP Head method does not return any data, like defined in the specifications.&lt;/p&gt;

&lt;h1&gt;
  
  
  POST Method
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. POST is designed to allow a uniform method to cover the following functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Annotation of existing resources;&lt;/li&gt;
&lt;li&gt;Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles;&lt;/li&gt;
&lt;li&gt;Providing a block of data, such as the result of submitting a form, to a data-handling process;&lt;/li&gt;
&lt;li&gt;Extending a database through an append operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-- &lt;a href="https://&amp;lt;br&amp;gt;%0Awww.rfc-editor.org/rfc/rfc2616#section-9.5" rel="noopener noreferrer"&gt;RFC2616, section 9.5&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;postRequest()&lt;/code&gt; function will use &lt;code&gt;post()&lt;/code&gt; method from the client. A POST request can pass some data, to do that, the string &lt;code&gt;test_data&lt;/code&gt; is passed to the &lt;code&gt;data&lt;/code&gt; parameter. The &lt;code&gt;contentType&lt;/code&gt; attribute must also be updated, because &lt;code&gt;dio&lt;/code&gt; is intercepting the POST request and will set it to JSON. Let set this to &lt;code&gt;text/plain&lt;/code&gt;.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;postRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'text/plain'&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="s"&gt;'test_data'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;We can now invoke the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart post
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://echo.free.beeceptor.com/, headers: connection: close
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;transfer-encoding: chunked
access-control-allow-origin: *
date: Wed, 13 May 2026 14:27:11 GMT
vary: Accept-Encoding
content-type: application/json
via: 1.1 Caddy
, data: {method: POST, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:40459, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Content-Length: 9, Accept-Encoding: gzip, Content-Type: text/html, Via: 1.1 Caddy, X-Custom: custom}, parsedQueryParams: {}, rawBody: test_data}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the data we have sent is stored in the &lt;code&gt;rawBody&lt;/code&gt; field. POST, PUT and PATCH methods are really important, and another publication on this topic will be required, especially for the serialization part.&lt;/p&gt;

&lt;h1&gt;
  
  
  PUT Method
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://&amp;lt;br&amp;gt;%0Awww.rfc-editor.org/rfc/rfc2616#section-9.6" rel="noopener noreferrer"&gt;RFC2616, section 9.6&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The PUT method is similar to the POST method. Here a &lt;code&gt;putRequest()&lt;/code&gt; function is created, the content type is updated and the string &lt;code&gt;test_data&lt;/code&gt; is sent to the server via the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/post.html" rel="noopener noreferrer"&gt;&lt;code&gt;post()&lt;/code&gt;&lt;/a&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="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;putRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'text/plain'&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="s"&gt;'test_data'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Similar result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart put
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://echo.free.beeceptor.com/, headers: connection: close
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;transfer-encoding: chunked
access-control-allow-origin: *
date: Wed, 13 May 2026 14:32:18 GMT
vary: Accept-Encoding
content-type: application/json
via: 1.1 Caddy
, data: {method: PUT, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:44886, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Content-Length: 9, Accept-Encoding: gzip, Content-Type: text/plain, Via: 1.1 Caddy, X-Custom: custom}, parsedQueryParams: {}, rawBody: test_data}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  DELETE Method
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The DELETE method requests that the origin server delete the resource identified by the Request-URI. This method MAY be overridden by human intervention (or other means) on the origin server. The client cannot be guaranteed that the operation has been carried out, even if the status code returned from the origin server indicates that the action has been completed successfully. However, the server SHOULD NOT indicate success unless, at the time the response is given, it intends to delete the resource or move it to an inaccessible location.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://&amp;lt;br&amp;gt;%0Awww.rfc-editor.org/rfc/rfc2616#section-9.7" rel="noopener noreferrer"&gt;RFC2616, section 9.7&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The DELETE method is closer to the GET method. &lt;code&gt;deleteRequest()&lt;/code&gt; function is created, and the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/delete.html" rel="noopener noreferrer"&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/a&gt; method is called.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;deleteRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Here the returned data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart delete
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://echo.free.beeceptor.com/, headers: connection: close
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;transfer-encoding: chunked
access-control-allow-origin: *
date: Wed, 13 May 2026 14:32:49 GMT
vary: Accept-Encoding
content-type: application/json
via: 1.1 Caddy
, data: {method: DELETE, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:40520, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Accept-Encoding: gzip, Via: 1.1 Caddy, X-Custom: custom}, parsedQueryParams: {}}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  PATCH Method
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The PATCH method requests that a set of changes described in the request entity be applied to the resource identified by the Request-URI.  The set of changes is represented in a format called a "patch document" identified by a media type.  If the Request-URI does not point to an existing resource, the server MAY create a new resource, depending on the patch document type (whether it can logically modify a null resource) and permissions, etc.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://www.rfc-editor.org/rfc/rfc5789#section-2" rel="noopener noreferrer"&gt;RFC5789, section 2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The PATCH method is a recent addition to HTTP, but act similarly like the PUT and POST methods. &lt;code&gt;patchRequest()&lt;/code&gt; function is created, the content type is updated and  &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/patch.html" rel="noopener noreferrer"&gt;&lt;code&gt;patch()&lt;/code&gt;&lt;/a&gt; method is called.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;patchRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'text/plain'&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;data:&lt;/span&gt; &lt;span class="s"&gt;'test_data'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Again, here the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart patch
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://echo.free.beeceptor.com/, headers: connection: close
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;transfer-encoding: chunked
access-control-allow-origin: *
date: Wed, 13 May 2026 14:33:28 GMT
vary: Accept-Encoding
content-type: application/json
via: 1.1 Caddy
, data: {method: PATCH, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:34690, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Content-Length: 9, Accept-Encoding: gzip, Content-Type: text/plain, Via: 1.1 Caddy, X-Custom: custom}, parsedQueryParams: {}, rawBody: test_data}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Downloading Files
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;dio&lt;/code&gt; is also offering two helpers to download file and store save locally via &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/download.html" rel="noopener noreferrer"&gt;&lt;code&gt;download()&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/downloadUri.html" rel="noopener noreferrer"&gt;&lt;code&gt;downloadURI()&lt;/code&gt;&lt;/a&gt; methods. Let try to download the latest &lt;a href="https://www.openbsd.org/images/puffy78.gif" rel="noopener noreferrer"&gt;official OpenBSD banner&lt;/a&gt; locally using the &lt;code&gt;downloadUri()&lt;/code&gt; method this time.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;downloadRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'https://www.openbsd.org/images/puffy78.gif'&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;downloadUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&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;'./puffy78.gif'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;code&gt;downloadRequest()&lt;/code&gt; function is creating a new &lt;a href="https://api.dart.dev/stable/3.11.5/dart-core/Uri-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Uri&lt;/code&gt;&lt;/a&gt; object from a valid URL, in this case, from the OpenBSD website. Then, the url and an anonymous function is passed to the &lt;code&gt;downloadUri()&lt;/code&gt; method. Finally, the response is displayed on STDOUT and the function return &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The anonymous function is taking one argument, a &lt;a href="https://pub.dev/documentation/dio/latest/dio/Headers-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Headers&lt;/code&gt;&lt;/a&gt; object and must return a &lt;code&gt;String&lt;/code&gt; representing where the file will be stored.&lt;/p&gt;

&lt;p&gt;Let execute that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart download
&lt;span class="go"&gt;{status: 200, status_msg: OK, uri: https://www.openbsd.org/images/puffy78.gif, headers: content-type: image/gif
connection: close
last-modified: Wed, 22 Oct 2025 07:18:46 GMT
date: Thu, 14 May 2026 03:50:12 GMT
server: OpenBSD httpd
content-length: 56669
redirects: 0
uri: https://www.openbsd.org/images/puffy78.gif
, data: Instance of 'ResponseBody'}

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lhart&lt;/span&gt; puffy78.gif 
&lt;span class="go"&gt;-rw-rw-r-- 1 user user 56K 14 mai   05:50 puffy78.gif
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It seems the function correctly downloaded the file, and when opening it with &lt;code&gt;feh&lt;/code&gt;, the gif looks good.&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%2Fx6xpslle1cmj3whae06b.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%2Fx6xpslle1cmj3whae06b.png" alt=" " width="599" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What about OPTIONS, TRACE and/or custom HTTP Methods?
&lt;/h1&gt;

&lt;p&gt;At this time, OPTIONS and TRACE HTTP methods have not been implemented in &lt;code&gt;dio&lt;/code&gt;, but it could be possible to craft them using the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/request.html" rel="noopener noreferrer"&gt;&lt;code&gt;request()&lt;/code&gt;&lt;/a&gt; method and setting the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Options/method.html" rel="noopener noreferrer"&gt;&lt;code&gt;method&lt;/code&gt;&lt;/a&gt; attribute from the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Options-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Options&lt;/code&gt;&lt;/a&gt; class to the correct &lt;code&gt;String&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;OPTIONS method can be useful when using CORS and then, can be sometime used by developers or administrator to check if everything is right.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The OPTIONS HTTP method requests permitted communication options for a given URL or server. This can be used to test the allowed HTTP methods for a request, or to determine whether a request would succeed when making a CORS preflighted request.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/OPTIONS" rel="noopener noreferrer"&gt;Mozilla Developer website&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This time, the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Dio/request.html" rel="noopener noreferrer"&gt;&lt;code&gt;request()&lt;/code&gt;&lt;/a&gt; method can be used. This one permits to modify the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Options-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Options&lt;/code&gt;&lt;/a&gt; object containing the &lt;a href="https://pub.dev/documentation/dio/latest/dio/Options/method.html" rel="noopener noreferrer"&gt;&lt;code&gt;method&lt;/code&gt;&lt;/a&gt; attribute, defined as String.&lt;/p&gt;

&lt;p&gt;Unfortunately, the echo service does not support OPTIONS nor TRACE HTTP method, we will need to use &lt;code&gt;nc -kl 8080&lt;/code&gt; for this test.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;customRequest&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;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&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;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;method&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;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;dio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'http://localhost:8080/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;We are not really interested of the response here, but more about what the client will send to the server. From the netcat side, here the raw output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nc &lt;span class="nt"&gt;-kl&lt;/span&gt; 8080
&lt;span class="go"&gt;OPTIONS / HTTP/1.1
user-agent: dio
connection: close
x-custom: custom
accept-encoding: gzip
content-length: 0
host: localhost:8080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client is correctly using the method we have manually set. The same procedure can also be applied for the TRACE method.&lt;/p&gt;

&lt;h1&gt;
  
  
  What about HTTP/2?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7540" rel="noopener noreferrer"&gt;HTTP/2&lt;/a&gt; is more a recent protocol upgrading HTTP/1.1 by adding multiplexed connection and use binary format (instead of text) for headers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;HTTP/2 provides an optimized transport for HTTP semantics.  HTTP/2 supports all of the core features of HTTP/1.1 but aims to be more efficient in several ways. The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each frame type serves a different purpose. [...] Multiplexing of requests is achieved by having each HTTP request/response exchange associated with its own stream. [...] Flow control and prioritization ensure that it is possible to efficiently use multiplexed streams. [...] HTTP/2 adds a new interaction mode whereby a server can push responses to a client. [...] Because HTTP header fields used in a connection can contain large amounts of redundant data, frames that contain them are compressed.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://www.rfc-editor.org/rfc/rfc7540#section-2" rel="noopener noreferrer"&gt;RFC7549, section 2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What kind of advantage to use HTTP/2 instead of HTTP/1.1? Better performance, especially when it comes to send multiple requests in parallel. Unfortunately, it does not fix everything, like slow connections issues, or a way for the server to easily close a connection, those issues are still relevant with HTTP/2, mainly due to the network layer above it: TCP.&lt;/p&gt;

&lt;p&gt;Most - if not all - modern HTTP servers are supporting it (&lt;a href="https://nginx.org/en/docs/http/ngx_http_v2_module.html" rel="noopener noreferrer"&gt;nginx&lt;/a&gt;, &lt;a href="https://httpd.apache.org/docs/2.4/howto/http2.html" rel="noopener noreferrer"&gt;apache2&lt;/a&gt;, &lt;a href="https://ninenines.eu/docs/en/cowboy/2.14/manual/cowboy_http2/" rel="noopener noreferrer"&gt;cowboy&lt;/a&gt;...) , the same happens for modern clients. &lt;code&gt;dio&lt;/code&gt; needs the &lt;a href="https://github.com/cfug/dio/tree/main/plugins/http2_adapter" rel="noopener noreferrer"&gt;&lt;code&gt;http2_adapter&lt;/code&gt;&lt;/a&gt; plugin to support this protocol though.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub add dio_http2_adapter
dart pub get
&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="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:dio_http2_adapter/dio_http2_adapter.dart'&lt;/span&gt;&lt;span class="o"&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="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;http2Request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;httpClientAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Http2Adapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ConnectionManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;idleTimeout:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;10&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;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;dio&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;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart http2
&lt;span class="go"&gt;{status: 200, status_msg: null, uri: https://echo.free.beeceptor.com/, headers: access-control-allow-origin: *
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;content-type: application/json
date: Thu, 14 May 2026 07:52:12 GMT
vary: Accept-Encoding
via: 1.1 Caddy
, data: {method: GET, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:34174, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Via: 2.0 Caddy, X-Custom: custom, Accept-Encoding: gzip}, parsedQueryParams: {}}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm not really sure if it correctly using HTTP/2 protocol while using the echo service. Let add a logging feature to see if we can know a bit more there. To do that, we can add a new &lt;a href="https://pub.dev/documentation/dio/latest/dio/LogInterceptor-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;LogInterceptor&lt;/code&gt;&lt;/a&gt; object in the current &lt;a href="https://pub.dev/documentation/dio/latest/dio/Interceptor-class.html" rel="noopener noreferrer"&gt;interceptor&lt;/a&gt; queue.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;http2Request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;async&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;httpClientAdapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Http2Adapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ConnectionManager&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;idleTimeout:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;seconds:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)),&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;LogInterceptor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;logPrint:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
      &lt;span class="nl"&gt;request:&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;requestBody:&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;requestHeader:&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;requestUrl:&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;responseBody:&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;responseHeader:&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;responseUrl:&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="kd"&gt;var&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;dio&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;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;printResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&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;Execute the code a second time with the logs now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart http2
&lt;span class="go"&gt;*** Request ***
uri: https://echo.free.beeceptor.com/
method: GET
responseType: ResponseType.json
followRedirects: true
persistentConnection: false
connectTimeout: 0:00:05.000000
sendTimeout: null
receiveTimeout: 0:00:05.000000
receiveDataWhenStatusError: true
extra: {}
headers:
 user-agent: dio
 x-custom: custom
data:
null

*** Response ***
uri: https://echo.free.beeceptor.com/
statusCode: 200
headers:
 access-control-allow-origin: *
&lt;/span&gt;&lt;span class="gp"&gt; alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt; content-type: application/json
 date: Thu, 14 May 2026 08:00:36 GMT
 vary: Accept-Encoding
 via: 1.1 Caddy
Response Text:
{"method":"GET","protocol":"https","host":"echo.free.beeceptor.com","path":"/","ip":"1.2.3.4:50442","headers":{"Host":"echo.free.beeceptor.com","User-Agent":"dio","Via":"2.0 Caddy","X-Custom":"custom","Accept-Encoding":"gzip"},"parsedQueryParams":{}}

{status: 200, status_msg: null, uri: https://echo.free.beeceptor.com/, headers: access-control-allow-origin: *
&lt;/span&gt;&lt;span class="gp"&gt;alt-svc: h3=":443";&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2592000
&lt;span class="go"&gt;content-type: application/json
date: Thu, 14 May 2026 08:00:36 GMT
vary: Accept-Encoding
via: 1.1 Caddy
, data: {method: GET, protocol: https, host: echo.free.beeceptor.com, path: /, ip: 1.2.3.4:50442, headers: {Host: echo.free.beeceptor.com, User-Agent: dio, Via: 2.0 Caddy, X-Custom: custom, Accept-Encoding: gzip}, parsedQueryParams: {}}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yeah, still not really sure if we are using HTTP/2 there. Let use &lt;code&gt;netcat&lt;/code&gt; instead, just to be certain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nc &lt;span class="nt"&gt;-kl&lt;/span&gt; | hexdump &lt;span class="nt"&gt;-C&lt;/span&gt;
&lt;span class="go"&gt;00000000  50 52 49 20 2a 20 48 54  54 50 2f 32 2e 30 0d 0a  |PRI * HTTP/2.0..|
00000010  0d 0a 53 4d 0d 0a 0d 0a  00 00 06 04 00 00 00 00  |..SM............|
00000020  00 00 02 00 00 00 00 00  00 5b 01 04 00 00 00 01  |.........[......|
00000030  00 07 3a 6d 65 74 68 6f  64 03 47 45 54 00 05 3a  |..:method.GET..:|
00000040  70 61 74 68 01 2f 00 07  3a 73 63 68 65 6d 65 04  |path./..:scheme.|
00000050  68 74 74 70 00 0a 3a 61  75 74 68 6f 72 69 74 79  |http..:authority|
00000060  09 6c 6f 63 61 6c 68 6f  73 74 00 0a 75 73 65 72  |.localhost..user|
00000070  2d 61 67 65 6e 74 03 64  69 6f 00 08 78 2d 63 75  |-agent.dio..x-cu|
00000080  73 74 6f 6d 06 63 75 73  74 6f 6d 00 00 00 00 01  |stom.custom.....|
00000090  00 00 00 01 00 00 04 03  00 00 00 00 01 00 00 00  |................|
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, HTTP/2.0 is printed on the netcat side and a part of the data received are in binary format, not text like in HTTP/1.1 version. So, it looks good!&lt;/p&gt;

&lt;p&gt;Other examples can be found in &lt;code&gt;dio_http2_adapter&lt;/code&gt; &lt;a href="https://github.com/cfug/dio/tree/main/plugins/http2_adapter" rel="noopener noreferrer"&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/a&gt; and in the &lt;a href="https://github.com/cfug/dio/blob/main/plugins/http2_adapter/example" rel="noopener noreferrer"&gt;&lt;code&gt;example/&lt;/code&gt;&lt;/a&gt; directory.&lt;/p&gt;

&lt;h1&gt;
  
  
  What about HTTP/3?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;HTTP/3 provides a transport for HTTP semantics using the QUIC transport protocol and an internal framing layer similar to HTTP/2. Once a client knows that an HTTP/3 server exists at a certain endpoint, it opens a QUIC connection. QUIC provides protocol negotiation, stream-based multiplexing, and flow control. Within each stream, the basic unit of HTTP/3 communication is a frame. Each frame type serves a different purpose. Multiplexing of requests is performed using the QUIC stream abstraction. Each request-response pair consumes a single QUIC stream. Streams are independent of each other, so one stream that is blocked or suffers packet loss does not prevent progress on other streams. [...] As in HTTP/2, request and response fields are compressed for transmission.&lt;/p&gt;

&lt;p&gt;-- &lt;a href="https://datatracker.ietf.org/doc/html/rfc9114#section-2" rel="noopener noreferrer"&gt;RFC9114, Section 2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, it seems QUIC and HTTP/3 are not currently supported everywhere, it will depend of the platform used. The package &lt;a href="https://pub.dev/packages/pure_dart_quic" rel="noopener noreferrer"&gt;&lt;code&gt;pure_dart_quic&lt;/code&gt;&lt;/a&gt; seems to be the solution here. I don't think the solution was currently very stable, and in fact, the addition of this protocol in nginx for example is from the &lt;a href="https://github.com/nginx/nginx/releases/tag/release-1.25.0" rel="noopener noreferrer"&gt;1.25.0&lt;/a&gt; version (released May 2023). The cowboy server is also offering its implementation but not by default since the beginning of 2025 (version &lt;a href="https://ninenines.eu/articles/cowboy-2.13.0/" rel="noopener noreferrer"&gt;2.13.0&lt;/a&gt;). So, it will be the main subject for another article, outside of &lt;code&gt;dio&lt;/code&gt; (or perhaps to extend it).&lt;/p&gt;

&lt;h1&gt;
  
  
  Want More About &lt;code&gt;dio&lt;/code&gt;?
&lt;/h1&gt;

&lt;p&gt;If you are here, that means you enjoyed these notes... And you probably want to know even more about &lt;code&gt;dio&lt;/code&gt;. Perhaps having a small glimpse of its usage in real world? You can easily find few open source projects using it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/namanshergill/diohub" rel="noopener noreferrer"&gt;&lt;strong&gt;Diohub&lt;/strong&gt;&lt;/a&gt;:  open-source unofficial GitHub mobile client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/salvadordeveloper/flutter-crypto-app" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Crypto APP&lt;/strong&gt;&lt;/a&gt;: Complete Flutter Application with Riverpod &amp;amp; Freezed + Dio for API REST.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/VB10/vexana" rel="noopener noreferrer"&gt;&lt;strong&gt;Vexana&lt;/strong&gt;&lt;/a&gt;: Vexana is easy to use network process with dio. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jhomlala/randomuser" rel="noopener noreferrer"&gt;&lt;strong&gt;randomuser&lt;/strong&gt;&lt;/a&gt;: Example project to present Dio, RxDart and Bloc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/SinaSys/flutter_go_rest_app" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter User Management App with Multi-Source Backend Support&lt;/strong&gt;&lt;/a&gt;:  Flutter-based user management application that demonstrates full CRUD (Create, Read, Update, Delete) operations. The app interacts with a RESTful API to manage users and their associated data, including posts, todos, and comments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rrifafauzikomara/youtube_video" rel="noopener noreferrer"&gt;&lt;strong&gt;youtube_video&lt;/strong&gt;&lt;/a&gt;: a Flutter application built to demonstrate the use of Modern development tools with best practices implementation like Clean Architecture, Modularization, Dependency Injection, BLoC, etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And to end this section, a list of interesting &lt;code&gt;dio&lt;/code&gt; plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio_file_uploader" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;dio_file_uploader&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A en_file_uploader plugin to handle the file upload using dio package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/datadome_flutter_dio" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;datadome_flutter_dio&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;:  provides an interceptor that filters and validates all requests to ensure your app networking layer is protected with DataDome.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio_builder" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;dio_builder&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: a builder pattern for configuring and creating instances of the Dio HTTP client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/embrace_dio" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;embrace_dio&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: enable the embrace plugin to capture network requests made with the Dio package.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/alice_dio" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;alice_dio&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: Alice is an HTTP Inspector tool for Flutter which helps debugging http requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio_http_logger" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;dio_http_logger&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A powerful network interceptor for Dio, providing comprehensive logging of requests, responses and errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio_retry_plus" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;dio_retry_plus&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A plugin for dio that retries failed requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/chunked_uploader" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;chunked_uploader&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A plugin to upload files to server in chunks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/oauth_dio" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;oauth_dio&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A customizable oauth client with token storage and interceptors for dio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio_ansi_logger" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;dio_ansi_logger&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A beautiful, Postman-style Dio interceptor that logs HTTP requests and responses with ANSI colors, structured formatting, and fully customizable themes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/aloisdeniel/dio_cache" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;dio_cache&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: A plugin for dio that caches responses in a database for better optimization and offline data access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/NexPlugs/pl_api_helper" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;code&gt;pl_api_helper&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: pl_api_helper is a Flutter plugin that simplifies API calls, caching, and data management with support for both Dio and HTTP clients. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  References and Resources
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;&lt;strong&gt;dio Package on pub.dev&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/documentation/dio/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;dio API Reference&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/cfug/dio" rel="noopener noreferrer"&gt;&lt;strong&gt;dio Official Repository&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://github.com/cfug/dio/tree/main/example_flutter_app" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Flutter Application Example with dio&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/cfug/dio/tree/main/plugins" rel="noopener noreferrer"&gt;&lt;strong&gt;Official dio Plugins&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/bitecode/use-dio-in-flutter-dart-307o"&gt;&lt;strong&gt;Use dio in Flutter/Dart&lt;/strong&gt;&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/bitecode"&gt;@bitecode&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/heyroziq/dio-vs-http-in-flutter-a-practical-clear-comparison-2id8"&gt;&lt;strong&gt;Dio vs HTTP in Flutter: A practical, Clear Comparison&lt;/strong&gt;&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/heyroziq"&gt;@heyroziq&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/ahmed2hamy/flutter-dio-http-client-5d1d"&gt;&lt;strong&gt;Flutter Dio HTTP Client&lt;/strong&gt;&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/ahmed2hamy"&gt;@ahmed2hamy&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/stephane_couget_54f540812/flutter-dart-api-rest-with-dio-5784"&gt;&lt;strong&gt;Flutter dart API REST with Dio&lt;/strong&gt;&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/stephane_couget_54f540812"&gt;@stephane_couget_54f540812&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/nikki_eke/efficient-crud-operations-in-flutter-a-guide-to-implementing-http-requests-with-clean-architecture-and-dio-4baj"&gt;&lt;strong&gt;Efficient CRUD Operations in Flutter: A Guide to Implementing HTTP Requests with Clean Architecture and Dio&lt;/strong&gt;&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/nikki_eke"&gt;@nikki_eke&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@ilonaivanova?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ilona Ivanova&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/a-close-up-of-a-bug-p5KVcvZ6XGk?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>http</category>
      <category>client</category>
      <category>dio</category>
    </item>
    <item>
      <title>Extracting Publication Data from Substack</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Thu, 14 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/extracting-publication-data-from-substack-22nf</link>
      <guid>https://dev.to/niamtokik/extracting-publication-data-from-substack-22nf</guid>
      <description>&lt;p&gt;If you have a substack account, like me, you are probably wondering how the articles are stored and how to fetch them manually, right? Well, it will be a short post trying to explain that.&lt;/p&gt;

&lt;p&gt;The end-point to get the JSON object describing the post is &lt;code&gt;/api/v1/drafts/${post_id}&lt;/code&gt; where &lt;code&gt;post_id&lt;/code&gt; is an integer (a reference to your post).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;account_name&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.substack.com/api/v1/drafts/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;post_id&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The headers used for doing this request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Accept: */*
Accept-Encoding: gzip, delfate, br, zstd
Accept-Language: en-US
Cookie: ${your_cookie}
Priority: u=1, i
sec-ch-ua: 
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Linux"
sec-fetch-dest: 
sec-fetch-mode: cors
sec-fetch-site: same-origin
sec-gpc: 1
User-Agent: ${your_user_agent}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, a JSON should be returned containing a huge amount of fields. Your post is stored in &lt;code&gt;draft_body&lt;/code&gt; as stringified JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"draft_body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The body of your post can be extracted now, it's a JSON object using the SubstackPost Document Model, if you want more information about it, you can check the &lt;a href="https://deepwiki.com/marcomoauro/substack-mcp/2.4-substackpost-document-model" rel="noopener noreferrer"&gt;DeepWiki page&lt;/a&gt; on that or &lt;a href="https://github.com/can3p/substack-api-notes/blob/master/doc_format.md" rel="noopener noreferrer"&gt;&lt;code&gt;Substack document format&lt;/code&gt;&lt;/a&gt; from &lt;a href="https://github.com/can3p/substack-api-notes" rel="noopener noreferrer"&gt;&lt;code&gt;can3p/substack-api-notes&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, I need to extract few values from that recently, I thought maybe it would help someone one day.&lt;/p&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@timwildsmith?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Tim Wildsmith&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/brown-wooden-book-shelf-with-books-o2fc-C-Uotw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>web</category>
      <category>substack</category>
      <category>browser</category>
      <category>api</category>
    </item>
    <item>
      <title>Using the http Package in Dart</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Wed, 13 May 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/using-the-http-package-in-dart-5641</link>
      <guid>https://dev.to/niamtokik/using-the-http-package-in-dart-5641</guid>
      <description>&lt;p&gt;The previous publication was talking about the low-level HTTP Client interface &lt;a href="https://api.dart.dev/dart-io/HttpClient-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;HttpClient&lt;/code&gt;&lt;/a&gt; offered by &lt;a href="https://api.dart.dev/dart-io" rel="noopener noreferrer"&gt;&lt;code&gt;dart:io&lt;/code&gt;&lt;/a&gt;. This package does the job, but even the documentation recommends to use &lt;a href="https://pub.dev/packages/http" rel="noopener noreferrer"&gt;&lt;code&gt;package:http&lt;/code&gt;&lt;/a&gt; instead. This is a higher-level implementation dealing with all the portability for different platforms and adding a lot of cool features. Instead of recreating a new project from scratch, we will improve the previous one created: &lt;code&gt;httpcat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First, we need to know how to install a package with Dart. Using an external package requires adding a new dependency in &lt;a href="https://dart.dev/tools/pub/pubspec" rel="noopener noreferrer"&gt;&lt;code&gt;pubspec.yaml&lt;/code&gt;&lt;/a&gt; file present at the root of the project.&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpcat&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;A sample command-line application.&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="c1"&gt;# repository: https://github.com/my_org/my_repo&lt;/span&gt;

&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^3.11.5&lt;/span&gt;

&lt;span class="c1"&gt;# Add regular dependencies here.&lt;/span&gt;
&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.9.0&lt;/span&gt;
  &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.6.0&lt;/span&gt;

&lt;span class="na"&gt;dev_dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;lints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^6.0.0&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^1.25.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The new line added is &lt;code&gt;http: ^1.6.0&lt;/code&gt; in the &lt;code&gt;dependencies&lt;/code&gt; section. The command &lt;a href="https://dart.dev/tools/pub/cmd/pub-get" rel="noopener noreferrer"&gt;&lt;code&gt;dart pub get&lt;/code&gt;&lt;/a&gt; needs to be called to fetch the package locally.&lt;/p&gt;

&lt;p&gt;Another method is to use &lt;a href="https://dart.dev/tools/pub/cmd/pub-add" rel="noopener noreferrer"&gt;&lt;code&gt;dart pub add&lt;/code&gt;&lt;/a&gt; subcommand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub add http:^1.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will directly adds the dependency in &lt;code&gt;pubspec.yaml&lt;/code&gt; without editing with a text editor (and valid it at the same time). Now, we can import this package in our program.&lt;/p&gt;

&lt;h1&gt;
  
  
  Importing &lt;code&gt;http&lt;/code&gt; package
&lt;/h1&gt;

&lt;p&gt;To import a package in Dart, &lt;a href="https://dart.dev/tools/pub/packages" rel="noopener noreferrer"&gt;&lt;code&gt;import&lt;/code&gt; keyword&lt;/a&gt; followed by the package URL is needed. The package can also be locally renamed using &lt;code&gt;as&lt;/code&gt; keyword followed by the local namespace to use. In our case, importing &lt;code&gt;http&lt;/code&gt; package will look like that:&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From Dart specification:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An &lt;strong&gt;import&lt;/strong&gt; specifies a library whose exported namespace (or a subset of its mappings) is made available in the current library. An &lt;strong&gt;import&lt;/strong&gt; specifies a URI s where the declaration of an imported library is to be found. It is a compile-time error if the specified URI of an import does not refer to a library declaration. The current library is the library currently being compiled. The &lt;strong&gt;import&lt;/strong&gt; modifies the &lt;strong&gt;namespace&lt;/strong&gt; of the current library in a manner that is determined by the imported library and by the optional elements of the &lt;strong&gt;import&lt;/strong&gt;. [...] Imports may be &lt;code&gt;deferred&lt;/code&gt; or &lt;code&gt;immediate&lt;/code&gt;. [...] An immediate import directive &lt;code&gt;I&lt;/code&gt; may optionally include a prefix clause of the form &lt;strong&gt;&lt;code&gt;as&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;id&lt;/code&gt; used to prefix names imported by &lt;code&gt;I&lt;/code&gt;. In this case we say that id is an import prefix, or simply a prefix.&lt;br&gt;
-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Latest Dart (3.0+) Programming Language Specification Draft&lt;/a&gt; Chapter 19, page 218&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Refactoring &lt;code&gt;httpcat&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;A big part of &lt;code&gt;httpcat&lt;/code&gt; will be rewritten, even if the logic will stay the same. Let start with &lt;code&gt;getUrl()&lt;/code&gt;.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Uri&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;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="n"&gt;url&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;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"outch. something bad happened. &lt;/span&gt;&lt;span class="si"&gt;$e&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;code&gt;getUrl()&lt;/code&gt; function will now accept an already parsed &lt;code&gt;String&lt;/code&gt; as &lt;a href="https://api.dart.dev/dart-core/Uri-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Uri&lt;/code&gt;&lt;/a&gt;. Indeed, &lt;a href="https://pub.dev/documentation/http/latest/http/get.html" rel="noopener noreferrer"&gt;&lt;code&gt;http.get()&lt;/code&gt;&lt;/a&gt; method is acception &lt;code&gt;Uri&lt;/code&gt; object as parameter, so, instead of doing all the parsing logic inside the same function, this already parsed string can be passed directly to it. &lt;code&gt;getUrl()&lt;/code&gt; will also return an &lt;code&gt;int&lt;/code&gt; based on the result of the http request, in case of success, it will return &lt;code&gt;0&lt;/code&gt; (zero), in case of failure, it will return &lt;code&gt;1&lt;/code&gt;. Because this function is asynchronous, the returned value will be wrapped around a &lt;a href="https://api.dart.dev/dart-async/Future-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Future&lt;/code&gt;&lt;/a&gt;.&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;Uri&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;parseUrl&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;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;scheme:&lt;/span&gt; &lt;span class="s"&gt;'http'&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;host:&lt;/span&gt; &lt;span class="s"&gt;'localhost'&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;port&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="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;port:&lt;/span&gt; &lt;span class="mi"&gt;80&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&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;url&lt;/span&gt;&lt;span class="p"&gt;;&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bad url"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;parseUrl()&lt;/code&gt; is a new function in charge of parsing a &lt;code&gt;String&lt;/code&gt;. In case of success it will return an &lt;code&gt;Uri&lt;/code&gt; object and in case of failure it will return &lt;code&gt;null&lt;/code&gt;. We will have a small discussion at the end of this article about &lt;a href="https://dart.dev/null-safety/understanding-null-safety" rel="noopener noreferrer"&gt;&lt;code&gt;null&lt;/code&gt; safety&lt;/a&gt;.&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;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&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="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&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;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&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="s"&gt;"Usage: httpcat TARGET"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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;url&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="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&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;ret&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;code&gt;main()&lt;/code&gt; function - our entry-point - will now be asynchronous because we are returning &lt;code&gt;getUrl()&lt;/code&gt; value.&lt;/p&gt;

&lt;p&gt;The final result can be seen below. Dealing with &lt;code&gt;null&lt;/code&gt; annoys me a lot, it's a bit like dealing with errors in Go, and I hate that. I suppose &lt;a href="https://pub.dev/packages/dartz/versions" rel="noopener noreferrer"&gt;&lt;code&gt;dartz&lt;/code&gt;&lt;/a&gt; or another package implementing functional programming features could fix that.&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:httpcat/httpcat.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;httpcat&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:io'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:async'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:convert'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:core'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&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="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&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="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&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;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&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="s"&gt;"Usage: httpcat TARGET"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parseUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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;url&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="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&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;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;parseUrl&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;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;scheme:&lt;/span&gt; &lt;span class="s"&gt;'http'&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;host:&lt;/span&gt; &lt;span class="s"&gt;'localhost'&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;port&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="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;port:&lt;/span&gt; &lt;span class="mi"&gt;80&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;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s"&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;url&lt;/span&gt;&lt;span class="p"&gt;;&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bad url"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Uri&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;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="n"&gt;url&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;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&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="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"outch. something bad happened. &lt;/span&gt;&lt;span class="si"&gt;$e&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&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;The code is still dirty, but it works. If someone is passing bad URL, it can fail. Let start a small HTTP server using &lt;a href="https://docs.python.org/3/library/http.server.html" rel="noopener noreferrer"&gt;Python HTTP server module&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /tmp/t
&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/t
python &lt;span class="nt"&gt;-m&lt;/span&gt; http.server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let have some fun with this program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart &lt;span class="s1"&gt;'http://localhost:8000'&lt;/span&gt;
&lt;span class="gp"&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;html lang="en"&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;meta charset="utf-8"&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Directory listing &lt;span class="k"&gt;for&lt;/span&gt; /&amp;lt;/title&amp;gt;
&lt;span class="gp"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Directory listing &lt;span class="k"&gt;for&lt;/span&gt; /&amp;lt;/h1&amp;gt;
&lt;span class="gp"&gt;&amp;lt;hr&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;hr&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dart run bin/httpcat.dart &lt;span class="s1"&gt;'localhost:8080'&lt;/span&gt;
&lt;span class="go"&gt;outch. something bad happened. Invalid argument(s): Unsupported scheme 'localhost' in URI localhost://localhost/8080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the first call is returning what we want, the HTML page returned by default by the HTTP server. But when calling it a second time without the scheme defined in the URL, it fails. So, that's a bug we will fix in another iteration.&lt;/p&gt;

&lt;h1&gt;
  
  
  Asynchronous call
&lt;/h1&gt;

&lt;p&gt;A quick note on asynchronous programming, more publications will come on this part of Dart, but you can see that part as a kind of reminder. Let start with the - very small - concurrency section from Dart specification.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dart code is always single threaded. There is no shared-state concurrency in Dart. Concurrency is supported via actor-like entities called isolates.&lt;br&gt;
-- &lt;a href="https://storage.googleapis.com/dart-specification/DartLangSpecDraft.pdf" rel="noopener noreferrer"&gt;Latest Dart (3.0+) Programming Language Specification Draft&lt;/a&gt; Chapter 6, page 15&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Dart VM is dealing with concurrency via an &lt;a href="https://dart.dev/language/concurrency#event-loop" rel="noopener noreferrer"&gt;event loop&lt;/a&gt; on one thread. Applications require to do tasks in parallel though, and then, asynchronous properties. This is where the &lt;a href="https://api.dart.dev/dart-async/" rel="noopener noreferrer"&gt;&lt;code&gt;async-await&lt;/code&gt;&lt;/a&gt; enters the game with the help of &lt;a href="https://api.dart.dev/dart-async/Future-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Futures&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://api.dart.dev/dart-async/Stream-class.html" rel="noopener noreferrer"&gt;&lt;code&gt;Streams&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For now, if you want to know more about that, you can check these references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/language/concurrency" rel="noopener noreferrer"&gt;Concurrency in Dart&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/language/async" rel="noopener noreferrer"&gt;Asynchronous programming&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/libraries/async/async-await" rel="noopener noreferrer"&gt;Asynchronous programming: futures, async, await&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/libraries/async/futures-error-handling" rel="noopener noreferrer"&gt;Futures and error handling&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;null&lt;/code&gt; safety
&lt;/h1&gt;

&lt;p&gt;Well. One reason I really love and enjoy coding in Erlang is because of the way it deals with errors and exceptions. A function in Erlang will always returns a values, and those values can be "tagged" with &lt;code&gt;ok&lt;/code&gt; or &lt;code&gt;error&lt;/code&gt; or any other term you want. It's not the case by default with Dart and many other "modern" languages. For the ones who don't know Erlang (or Elixir), here an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight erlang"&gt;&lt;code&gt;&lt;span class="nf"&gt;my_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;

&lt;span class="nf"&gt;callme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nf"&gt;my_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;V&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="si"&gt;~p~n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;V&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
      &lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nothing&lt;/span&gt;&lt;span class="si"&gt;~n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dealing with &lt;code&gt;null&lt;/code&gt; in Dart is a long topic, and while trying to find a solution by myself, I was, in fact, recreating a kind of  &lt;a href="https://wiki.haskell.org/Maybe" rel="noopener noreferrer"&gt;Maybe Monad&lt;/a&gt;. Someone else already this this job with the &lt;a href="https://pub.dev/packages/maybe_just_nothing" rel="noopener noreferrer"&gt;&lt;code&gt;maybe_just_nothing&lt;/code&gt;&lt;/a&gt; package. The idea here is to delegate most of the &lt;code&gt;null&lt;/code&gt; check to an object, and use functional programming paradigm.&lt;/p&gt;

&lt;p&gt;Another solution is to create a solution similar to the one used by Erlang by using &lt;a href="https://dart.dev/language/records" rel="noopener noreferrer"&gt;&lt;code&gt;records&lt;/code&gt;&lt;/a&gt; as a tuple. The tag part can be defined as an &lt;a href="https://dart.dev/language/enums" rel="noopener noreferrer"&gt;&lt;code&gt;enum&lt;/code&gt;&lt;/a&gt;.&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;enum&lt;/span&gt; &lt;span class="n"&gt;Tag&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A function could then &lt;a href="https://dart.dev/language/records#record-syntax" rel="noopener noreferrer"&gt;return a record&lt;/a&gt; containing a &lt;code&gt;Tag&lt;/code&gt; and any kind 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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;my_function&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"value"&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;One can then use some &lt;a href="https://dart.dev/language/patterns" rel="noopener noreferrer"&gt;pattern matching&lt;/a&gt; like in Erlang with the help of the &lt;a href="https://dart.dev/language/patterns#switch-statements-and-expressions" rel="noopener noreferrer"&gt;&lt;code&gt;switch&lt;/code&gt;&lt;/a&gt; statement.&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;callme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_function&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&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;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ok &lt;/span&gt;&lt;span class="si"&gt;$v&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"error"&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;I'm not really sure this is good idea to use this method, if it's portable and how the &lt;a href="https://dart.dev/language/branches#switch-expressions" rel="noopener noreferrer"&gt;&lt;code&gt;switch&lt;/code&gt;&lt;/a&gt; expression can deal with a long list of different patterns (performance issue?).&lt;/p&gt;

&lt;p&gt;The Dart documentation offers a great documentation about the null safety issues, and a dev.to author called &lt;a class="mentioned-user" href="https://dev.to/jige2025"&gt;@jige2025&lt;/a&gt; created two publications (&lt;a href="https://dev.to/jige2025/dart-lesson-10-null-safety-part-1-why-is-null-safety-needed-5e5g"&gt;part-1&lt;/a&gt; and &lt;a href="https://dev.to/jige2025/dart-lesson-11-null-safety-part-2-safe-operators-explained-37l8"&gt;part-2&lt;/a&gt;) on this topic. Anyway, a full publication will be made to summarize that, so, if you want to know more, please check these references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/null-safety/understanding-null-safety" rel="noopener noreferrer"&gt;Understanding null safety&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/jige2025/dart-lesson-10-null-safety-part-1-why-is-null-safety-needed-5e5g"&gt;Dart Lesson 10: Null Safety (Part 1) — Why is Null Safety Needed?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/jige2025/dart-lesson-11-null-safety-part-2-safe-operators-explained-37l8"&gt;Dart Lesson 11: Null Safety (Part 2) — Safe Operators Explained&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@muntasir574/null-aware-elements-in-dart-3-8-a-simpler-way-to-handle-nulls-in-flutter-90feb3851371" rel="noopener noreferrer"&gt;Null-Aware Elements in Dart 3.8: A Simpler Way to Handle Nulls in Flutter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/aashu/mastering-null-safety-in-dart-a-practical-guide-for-flutter-developers-4phh"&gt;Mastering Null Safety in Dart: A Practical Guide for Flutter Developers&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@ptrikutam?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Pavan Trikutam&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/minimalist-photography-of-three-crank-phones-71CjSSB83Wo?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>http</category>
      <category>webdev</category>
      <category>data</category>
    </item>
    <item>
      <title>Discovering Dart Ecosystem and Community</title>
      <dc:creator>Mathieu K</dc:creator>
      <pubDate>Tue, 12 May 2026 08:51:00 +0000</pubDate>
      <link>https://dev.to/niamtokik/discovering-darts-ecosystem-and-community-plh</link>
      <guid>https://dev.to/niamtokik/discovering-darts-ecosystem-and-community-plh</guid>
      <description>&lt;p&gt;Like any language, having a list of resources to find examples and best practices is always nice to have. Unfortunately, Dart is mostly used for/with Flutter, and lot of publications are directly showing Flutter examples instead of talking about Dart itself. Anyway, this not a complete list, only the things I've found on the web and started to check.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Website&lt;/strong&gt;&lt;/a&gt;: this is the main entry-point for any Dart developpers, from beginners to advanced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/learn" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Tutorials&lt;/strong&gt;&lt;/a&gt;: First time using Dart? That's the place to be.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/docs" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart documentation&lt;/strong&gt;&lt;/a&gt;: If something goes wrong, or if you want to know what a class, method or attribute is doing, this is the best place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://groups.google.com/a/dartlang.org/g/announce" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Announcement on Google Group&lt;/strong&gt;&lt;/a&gt;: all important news regarding Dart are published here, useful for the new releases and other critical information about the language.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/blog" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Blog&lt;/strong&gt;&lt;/a&gt;: One can found many interesting information about the language and the community.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Package Website&lt;/strong&gt;&lt;/a&gt;: the first place to check if you want to use a specific feature and you don't have time to create it from scratch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://api.dart.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart API documentation&lt;/strong&gt;&lt;/a&gt;: wants to know more about Dart API and SDK? you'll probably find your answer here.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://dart.dev/resources/language/spec" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Language Specification&lt;/strong&gt;&lt;/a&gt;: Dart Language has been specified, and the syntax and other rules have been documented.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/effective-dart" rel="noopener noreferrer"&gt;&lt;strong&gt;Effective Dart&lt;/strong&gt;&lt;/a&gt; (Official Dart Best Practices): the official best practice guide from Dart developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dart.dev/community/who-uses-dart" rel="noopener noreferrer"&gt;&lt;strong&gt;Official List of Companies using Dart&lt;/strong&gt;&lt;/a&gt;: Want to work with Dart (or Flutter), this page can give you some hints about which companies are using this language in production.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Sources
&lt;/h1&gt;

&lt;p&gt;Having access to open-source projects and official source code is always useful. If you want to learn Dart, you should start by reading the tests and then try to understand the code tested.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Github Profile&lt;/strong&gt;&lt;/a&gt;: the page listing all official project supported by Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/sdk" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart SDK Repository&lt;/strong&gt;&lt;/a&gt;: Dart SDK source code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/language" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Dart Language Specification Repository&lt;/strong&gt;&lt;/a&gt;: Dart language specification source code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Interesting Packages
&lt;/h1&gt;

&lt;p&gt;A long list of packages had my attention while I was learning Dart/Flutter, and while I was reading books/publications. Here few of them&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/actors" rel="noopener noreferrer"&gt;&lt;strong&gt;actors&lt;/strong&gt;&lt;/a&gt;: an implementation of the Actor Model in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/beam_vm" rel="noopener noreferrer"&gt;&lt;strong&gt;beam_vm&lt;/strong&gt;&lt;/a&gt;: a plugin to embed an Erlang VM on Android and iOS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/cryptography" rel="noopener noreferrer"&gt;&lt;strong&gt;cryptography&lt;/strong&gt;&lt;/a&gt;: cryptographic algorithms implemented in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dart_amqp" rel="noopener noreferrer"&gt;&lt;strong&gt;dart_amqp&lt;/strong&gt;&lt;/a&gt;: AMQP implementation in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/cbor" rel="noopener noreferrer"&gt;&lt;strong&gt;cbor&lt;/strong&gt;&lt;/a&gt;: an implementation of &lt;a href="https://www.rfc-editor.org/rfc/rfc8949.html" rel="noopener noreferrer"&gt;CBOR/RFC8949&lt;/a&gt; in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dartzmq" rel="noopener noreferrer"&gt;&lt;strong&gt;dartzmq&lt;/strong&gt;&lt;/a&gt;: an implementation of &lt;a href="https://zeromq.org/" rel="noopener noreferrer"&gt;zeromq&lt;/a&gt; in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/dio" rel="noopener noreferrer"&gt;&lt;strong&gt;dio&lt;/strong&gt;&lt;/a&gt;: an advanced HTTP networking tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/drift" rel="noopener noreferrer"&gt;&lt;strong&gt;drift&lt;/strong&gt;&lt;/a&gt;: a persistent storage layer using SQLite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/ecdsa" rel="noopener noreferrer"&gt;&lt;strong&gt;ecdsa&lt;/strong&gt;&lt;/a&gt;: an implementation of ECDSA.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/ed25519_edwards" rel="noopener noreferrer"&gt;&lt;strong&gt;ed25519_edwards&lt;/strong&gt;&lt;/a&gt;: an implementation of ed25519 elliptic curve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/flame" rel="noopener noreferrer"&gt;&lt;strong&gt;flame&lt;/strong&gt;&lt;/a&gt;: a game engine based on dart/flutter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/fpdart" rel="noopener noreferrer"&gt;&lt;strong&gt;fpdart&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://github.com/SandroMaglione/fpdart" rel="noopener noreferrer"&gt;github&lt;/a&gt;):  Functional Programming in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/oauth2" rel="noopener noreferrer"&gt;&lt;strong&gt;oauth2&lt;/strong&gt;&lt;/a&gt;: an OAuth2 client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/postgres" rel="noopener noreferrer"&gt;&lt;strong&gt;postgres&lt;/strong&gt;&lt;/a&gt;: an interface to PostgreSQL database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/pure" rel="noopener noreferrer"&gt;&lt;strong&gt;pure&lt;/strong&gt;&lt;/a&gt;: add support for many functional programming features, like composition, pipes, memoization and recursion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/sqlite3" rel="noopener noreferrer"&gt;&lt;strong&gt;sqlite3&lt;/strong&gt;&lt;/a&gt;: an interface to sqlite3 database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pub.dev/packages/state_machine" rel="noopener noreferrer"&gt;&lt;strong&gt;state_machine&lt;/strong&gt;&lt;/a&gt;: Implementation of a finite state machine in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Books
&lt;/h1&gt;

&lt;p&gt;Dart is a young language, and I was not expecting to find lot of books... I was wrong. Here a quite complete list of all available books.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.kodeco.com/books/dart-apprentice-fundamentals" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Apprentice: Fundamentals&lt;/strong&gt;&lt;/a&gt; by the Kodeco Team&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.kodeco.com/books/dart-apprentice-beyond-the-basics" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Apprentice: Beyond the Basics&lt;/strong&gt;&lt;/a&gt; by Jonathan Sande and the Kodeco Team&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.kodeco.com/books/data-structures-algorithms-in-dart" rel="noopener noreferrer"&gt;&lt;strong&gt;Data Structures &amp;amp; Algorithms in Dart&lt;/strong&gt;&lt;/a&gt; by Jonathan Sande and the Koneco Team&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://artofdartbook.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;The Art of Dart: Master the Dart Programming Language&lt;/strong&gt;&lt;/a&gt; by Kenneth Choi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.manning.com/books/dart-in-action" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart in Action&lt;/strong&gt;&lt;/a&gt; by Chris Buckett&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/mastering-dart-9781783989560" rel="noopener noreferrer"&gt;&lt;strong&gt;Mastering DART: Master the art of programming high-performance applications with Dart&lt;/strong&gt;&lt;/a&gt; by  Sergey Akopkokhyants&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/dart-by-example-9781785289798" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart By Example&lt;/strong&gt;&lt;/a&gt; by David Mitchell&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/learning-dart-second-edition-9781785288531" rel="noopener noreferrer"&gt;&lt;strong&gt;Learning Dart&lt;/strong&gt;&lt;/a&gt; by Ivo Balbaert&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/dart-essentials-9781783989614" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Essentials&lt;/strong&gt;&lt;/a&gt; by Martin Sikora&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.packtpub.com/en-us/product/dart-cookbook-9781783989638" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Cookbook&lt;/strong&gt;&lt;/a&gt; by Ivo Balbaert&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/what-is-dart/9781449333164/" rel="noopener noreferrer"&gt;&lt;strong&gt;What is Dart?&lt;/strong&gt;&lt;/a&gt; by Kathy Walrath and Seth Ladd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.oreilly.com/library/view/the-dart-programming/9780133429961/" rel="noopener noreferrer"&gt;&lt;strong&gt;The Dart Programming Lagnuage&lt;/strong&gt;&lt;/a&gt; by Gilad Bracha&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://learning.oreilly.com/library/view/-/9781787288027/" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Scalable Application Development&lt;/strong&gt;&lt;/a&gt; by Davy Mitchell, Sergey Akopkokhyants and Ivo Balbaert&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://learning.oreilly.com/library/view/-/9781449330880/" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Up and Running&lt;/strong&gt;&lt;/a&gt; by Kathy Walrath and Seth Ladd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://link.springer.com/book/10.1007/978-1-4842-0556-3" rel="noopener noreferrer"&gt;&lt;strong&gt;Web Programming with dart&lt;/strong&gt;&lt;/a&gt; by Moises Belchin and Patricia Juberias&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://link.springer.com/book/10.1007/978-1-4842-5562-9" rel="noopener noreferrer"&gt;&lt;strong&gt;Quick Start Guide to Dart Programming&lt;/strong&gt;&lt;/a&gt; by Sanjib Sinha&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://link.springer.com/book/10.1007/978-1-4302-6482-8" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart for Absolute Beginners&lt;/strong&gt;&lt;/a&gt; by David Kopec&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Communication Channels
&lt;/h1&gt;

&lt;p&gt;Here a list of the main/official communication channels used by Dart developers - excluding Flutter ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackoverflow.com/tags/dart" rel="noopener noreferrer"&gt;&lt;strong&gt;StackOverflow&lt;/strong&gt;&lt;/a&gt;: asking/answering questions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://discord.gg/Qt6DgfAWWx" rel="noopener noreferrer"&gt;&lt;strong&gt;Official Discord Server&lt;/strong&gt;&lt;/a&gt;: a place to chat with Dart developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.reddit.com/r/dartlang" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart on Reddit&lt;/strong&gt;&lt;/a&gt;: a subreddit for Dart developers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/t/dartlang/"&gt;&lt;strong&gt;Dart on dev.to&lt;/strong&gt;&lt;/a&gt;: Another place to read publication about Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://x.com/dart_lang" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Official X/Twitter Account&lt;/strong&gt;&lt;/a&gt;: The official Dart X/Twitter account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bsky.app/profile/dart.dev" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Official Bluesky Account&lt;/strong&gt;&lt;/a&gt;: The official Dart BlueSky account.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Community
&lt;/h1&gt;

&lt;p&gt;A small list of developers using Dart. Most of them are coming from public talks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anna Leushchenko&lt;/strong&gt; (&lt;a href="https://medium.com/@foxanna" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://fluttercommunity.social/@foxanna" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;, &lt;a href="https://dev.to/foxanna"&gt;dev.to&lt;/a&gt;, &lt;a href="https://github.com/foxanna" rel="noopener noreferrer"&gt;github&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Björn Sperber&lt;/strong&gt; (&lt;a href="https://github.com/spebbe" rel="noopener noreferrer"&gt;github&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bob Nystrom&lt;/strong&gt; (&lt;a href="https://github.com/munificent" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://journal.stuffwithstuff.com/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chris Swan&lt;/strong&gt; (&lt;a href="https://blog.thestateofme.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://blog.thestateofme.com/dart/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://hachyderm.io/@cpswan" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/chrisswan/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;, &lt;a href="https://bsky.app/profile/cpswan.net" rel="noopener noreferrer"&gt;bluesky&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Csongor Vogel&lt;/strong&gt; (&lt;a href="https://github.com/gerfalcon" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://twitter.com/GerfalconVogel" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/csongorvogel" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;, &lt;a href="https://www.instagram.com/gerfalcon_vogel/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt;, &lt;a href="https://www.youtube.com/@gerfalconVogel" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Erik Ernst&lt;/strong&gt; (&lt;a href="https://github.com/eernstg" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://medium.com/@eernst" rel="noopener noreferrer"&gt;medium&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eric Saidel&lt;/strong&gt; (&lt;a href="https://shorebird.dev/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://github.com/eseidel" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://bsky.app/profile/eseidel.bsky.social" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;, &lt;a href="https://linkedin.com/in/ericseidel/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;, &lt;a href="https://x.com/_eseidel" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Evgeny Kot&lt;/strong&gt; (&lt;a href="https://github.com/bunopus/" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://twitter.com/bunopus_en" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Filipe A. Barroso&lt;/strong&gt; (&lt;a href="https://dev.to/abarroso"&gt;dev.to&lt;/a&gt;, &lt;a href="https://oldmetalmind.medium.com/" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://github.com/OldMetalmind" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/filipe-a-barroso/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gilad Bracha&lt;/strong&gt; (&lt;a href="https://www.bracha.org/Site/Home.html" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://blog.bracha.org/primordialsoup.html?snapshot=AmpleforthViewer.vfuel&amp;amp;docName=Room101" rel="noopener noreferrer"&gt;blog&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jaime Wren&lt;/strong&gt; (&lt;a href="https://github.com/jwren" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://medium.com/@jwren" rel="noopener noreferrer"&gt;medium&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kasper Lund&lt;/strong&gt; (&lt;a href="https://github.com/kasperl" rel="noopener noreferrer"&gt;github&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Karl Krukow&lt;/strong&gt; (&lt;a href="https://github.com/krukow" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="http://blog.higher-order.net/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://twitter.com/karlkrukow" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kevin Moore&lt;/strong&gt; (&lt;a href="https://github.com/kevmoo" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://kevmoo.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://bsky.app/profile/kevmoo.com" rel="noopener noreferrer"&gt;bluesky&lt;/a&gt;, &lt;a href="https://medium.com/@kevmoo" rel="noopener noreferrer"&gt;medium&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kresten Krab Thorup&lt;/strong&gt; (&lt;a href="https://github.com/krestenkrab" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://twitter.com/drkrab" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;, &lt;a href="https://bsky.app/profile/drkrab.bsky.social" rel="noopener noreferrer"&gt;blusky&lt;/a&gt;, &lt;a href="https://mastodon.social/@drkrab" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leaf Peterson&lt;/strong&gt; (&lt;a href="https://github.com/leafpetersen" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://www.leafpetersen.com/leaf/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://twitter.com/LeafPetersen" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Majid Hajian&lt;/strong&gt; (&lt;a href="https://majidhajian.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://medium.com/@mhadaily" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://github.com/mhadaily" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://majidhajian.com/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://www.twitter.com/mhadaily" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/mhadaily" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Miguel Beltran&lt;/strong&gt; (&lt;a href="https://github.com/miquelbeltran" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://beltran.work/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="http://bsky.app/profile/beltran.work" rel="noopener noreferrer"&gt;bluesky&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mike Diarmid&lt;/strong&gt; (&lt;a href="https://github.com/Salakar" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://mike.flutter.community/" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;, &lt;a href="https://twitter.com/mikediarmid" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;, &lt;a href="https://bsky.app/profile/mike.programmer.blue" rel="noopener noreferrer"&gt;bluesky&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/salakar" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;, &lt;a href="https://medium.com/@mikediarmid" rel="noopener noreferrer"&gt;medium&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Norbert Kozsir&lt;/strong&gt; (&lt;a href="https://norbertkozsir.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://norbertkozsir.com/blog/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://x.com/norbertkozsir" rel="noopener noreferrer"&gt;x/twitter&lt;/a&gt;, &lt;a href="https://github.com/Norbert515" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://medium.com/@norbertkozsir" rel="noopener noreferrer"&gt;medium&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pascal Welsch&lt;/strong&gt; (&lt;a href="https://pascalwelsch.com/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://github.com/passsy" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://fluttercommunity.social/@passsy" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;, &lt;a href="https://passsy.medium.com/" rel="noopener noreferrer"&gt;medium&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Randal Schwartz&lt;/strong&gt; (&lt;a href="https://github.com/RandalSchwartz" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://medium.com/@realmerlyn" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://dev.to/randalschwartz"&gt;dev.to&lt;/a&gt;, &lt;a href="https://fluttercommunity.social/@randalschwartz" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Razvan Cristian Lung&lt;/strong&gt; (&lt;a href="https://github.com/long1EU" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/long1eu" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;, &lt;a href="https://medium.com/@long1eu" rel="noopener noreferrer"&gt;medium&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Roman Jaquez&lt;/strong&gt; (&lt;a href="https://medium.com/@romanejaquez" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://www.youtube.com/channel/UCKsp3r1ERjCpKJtD2n5WtPg" rel="noopener noreferrer"&gt;youtube&lt;/a&gt;, &lt;a href="https://github.com/romanejaquez" rel="noopener noreferrer"&gt;github&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simon Binder&lt;/strong&gt; (&lt;a href="https://www.simonbinder.eu/" rel="noopener noreferrer"&gt;website&lt;/a&gt;, &lt;a href="https://github.com/simolus3/" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://mastodon.online/@simonbinder" rel="noopener noreferrer"&gt;mastodon&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vadym Pinchuk&lt;/strong&gt; (&lt;a href="https://github.com/VadymPinchuk" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://medium.com/@vad.pinchuk" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/vpinchuk/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt;, &lt;a href="https://www.instagram.com/vad.pinchuk/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt;). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vyacheslav "Slava" Egorov&lt;/strong&gt; (&lt;a href="https://mrale.ph/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, &lt;a href="https://medium.com/@v.e.egorov" rel="noopener noreferrer"&gt;medium&lt;/a&gt;, &lt;a href="https://github.com/mraleph" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://plpragmatics.substack.com" rel="noopener noreferrer"&gt;Substack&lt;/a&gt;, &lt;a href="https://mastodon.social/@mraleph" rel="noopener noreferrer"&gt;Mastodon&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/slava-egorov-5b8667235" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Courses
&lt;/h1&gt;

&lt;p&gt;Only free courses are listed here. More can be found on Udemy or other MOOC platforms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=QGqMJzywasg&amp;amp;list=PL4cUxeGkcC9iVGY3ppchN9kIauln8IiEh" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Crash Course&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=HbzUzEg8Aqc&amp;amp;list=PLCC34OHNcOto7WU2QzVn3hnpSOYEdflVf" rel="noopener noreferrer"&gt;&lt;strong&gt;Learn Dart Programming&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=uZvoTCSsfjo&amp;amp;list=PLptHs0ZDJKt_fLp8ImPQVc1obUJKDSQL7" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart from Novice to Expert&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=2mDgC8qVLbA&amp;amp;list=PLuT75HOSyJBGB9YjUs_STuv_oSW1Ooq9w" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Full Course - Beginners to Advanced Level&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=kr86cFnO6Os&amp;amp;list=PLNnAcB93JKV9YAl4QDygDEMfplrt5uUUx" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Beginners Course&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=CRopXzpWsYc&amp;amp;list=PLkAHsOVSsZBjBrzxXUQVHGokr6HfdzkqO" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Tutorial&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=qB6F0CDr2oM&amp;amp;list=PL9n0l8rSshSlpNWvY4eu_5Oq8l4MRvppT" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Language Fundamentals&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=6bSP4vazmyw&amp;amp;list=PL93xoMrxRJIutlMCImcV3CYMmjS0MmlWL" rel="noopener noreferrer"&gt;&lt;strong&gt;Learn Dart from Scratch&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=lzNqLROLRRk&amp;amp;list=PL3s-_QXY9PwXJhxY-BeBn-067NCtVIWJ4" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Programming&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=c-ydMfJNfyY&amp;amp;pp=ygUMZGFydCBjb3Vyc2Vz" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Programming Tutorial&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Publications
&lt;/h1&gt;

&lt;p&gt;Dart has been designed by Lars Bak and Kasper Lund at Google, but also backed by the scholars and academics. Many interesting publications can be found on Dart, here a short list of them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/U-Urathal-Sri-Swathiga/publication/358661479_AN_INTERPRETATION_OF_DART_PROGRAMMING_LANGUAGE/links/625effce4173a21a0d1edc0a/AN-INTERPRETATION-OF-DART-PROGRAMMING-LANGUAGE.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;An interpretation of dart programming language&lt;/strong&gt;&lt;/a&gt; by Dr. U. Urathal Alias Sri Swathiga, Ms. P. Vinodhini, and Dr. V. Sasikala.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://nir.mef.edu.rs/download/downloadPDF/5cb66d0a-57ca-428a-8d07-64965f71b0ec.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;The power of the Dart programming language for modern, high-performance web application development&lt;/strong&gt;&lt;/a&gt; by Tamara Ranisavljević, Aleksandar Šijan and Luka Ilić.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/2742694.2747873" rel="noopener noreferrer"&gt;&lt;strong&gt;Spicing Up Dart with Side Effects: A set of extensions to the Dart programming language, designed to support asynchrony and generator functions&lt;/strong&gt;&lt;/a&gt; by Erik Meijer, Kevin Millikin, and&lt;br&gt;
Gilad Bracha.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/2816707.2816711" rel="noopener noreferrer"&gt;&lt;strong&gt;Message Safety in Dart&lt;/strong&gt;&lt;/a&gt; by Erik Ernst, Anders Møller, Mathias Schwarz, and Fabio Strocco.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://infoscience.epfl.ch/server/api/core/bitstreams/7a710369-561f-4f49-bc0e-07e4a9c4584e/content" rel="noopener noreferrer"&gt;&lt;strong&gt;The Operational Semantics and Implementation of a Core Dart language&lt;/strong&gt;&lt;/a&gt; by Zhivka Gucevska.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3098572.3098575" rel="noopener noreferrer"&gt;&lt;strong&gt;dart2java: Running Dart in Java-based Environments&lt;/strong&gt;&lt;/a&gt; by Matthias Springer, Andrew Krieger, Stanislav Manilov and Hidehiko Masuhara.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3397537.3397558" rel="noopener noreferrer"&gt;&lt;strong&gt;Towards a Pattern Language for Interactive Coding Tutorials&lt;/strong&gt;&lt;/a&gt; by Tao Dong and Gale Yang.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://woset-workshop.github.io/PDFs/2022/19-Korbel-paper.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Rapid Open Hardware Development Framework&lt;/strong&gt;&lt;/a&gt; by Max Korbel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://repositorio.ufrn.br/bitstreams/5163fd29-6b9d-41de-8356-70d3f18ded5c/download" rel="noopener noreferrer"&gt;&lt;strong&gt;Aggressive unboxing in the Dart VM&lt;/strong&gt;&lt;/a&gt; by Victor Agnez Lima.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Type System
&lt;/h2&gt;

&lt;p&gt;Publications related to Dart Type system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://fileadmin.cs.lth.se/courses/edan70/CompilerProjects/2015/Reports/JohanssonLindholm.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Type inference in Dart&lt;/strong&gt;&lt;/a&gt; by Malte Johansson and Mikel Lindholm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pure.au.dk/ws/files/429018521/Thesis_Fabio_Strocco.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Type Soundness in the Dart Programming Language&lt;/strong&gt;&lt;/a&gt; by Fabio Strocco.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://projekter.aau.dk/projekter/files/213812219/Type_Systems_And_Programmers.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Type Systems And Programmers: A Look at Optional Typing in Dart&lt;/strong&gt;&lt;/a&gt; by Mark Faldborg and Troels Lisberg Nielsen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3093334.2989227" rel="noopener noreferrer"&gt;&lt;strong&gt;Type Unsoundness in Practice: An Empirical Study of Dart&lt;/strong&gt;&lt;/a&gt; by Gianluca Mezzetti, Anders Møller and Fabio Strocco.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/3093334.2989226" rel="noopener noreferrer"&gt;&lt;strong&gt;Type Safety Analysis for Dart&lt;/strong&gt;&lt;/a&gt; by Thomas S. Heinze, Anders Møller and Fabio Strocco.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dl.acm.org/doi/pdf/10.1145/2568058.2568066" rel="noopener noreferrer"&gt;&lt;strong&gt;A SIMD Programming Model for Dart, JavaScript, and Other Dynamically Typed Scripting Languages&lt;/strong&gt;&lt;/a&gt; by John McCutchan, Haitao Feng, Nicholas D. Matsakis, Zachary Anderson and Peter Jensen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://scholarworks.sjsu.edu/cgi/viewcontent.cgi?article=1284&amp;amp;context=etd_projects" rel="noopener noreferrer"&gt;&lt;strong&gt;STATIC TYPE CHECKER TYPE CHECKER TOOLS FOR DART&lt;/strong&gt;&lt;/a&gt; by Snigdha Mokkapati.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usage Report
&lt;/h2&gt;

&lt;p&gt;Publications related to real world application developed and released with Dart.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://iopscience.iop.org/article/10.1088/1742-6596/1539/1/012016/meta" rel="noopener noreferrer"&gt;&lt;strong&gt;Design and Development of Automotive Workshop Application Based on Android and IOS Using Dart Programming Language&lt;/strong&gt;&lt;/a&gt; by Baiq Andriska Candra P and Ramli Ahmad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.itajournal.com/index.php/ita/article/download/59/60" rel="noopener noreferrer"&gt;&lt;strong&gt;FEATURES OF THE IMPLEMENTATION OF TIME MANAGEMENT TECHNIQUES IN THE PROGRAMMING LANGUAGE DART&lt;/strong&gt;&lt;/a&gt; by Yakov Lvovich and Emma Lvovich.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://tecnoscientifica.com/journal/gisa/article/download/269/161" rel="noopener noreferrer"&gt;&lt;strong&gt;Android based college app using Flutter Dart&lt;/strong&gt;&lt;/a&gt; by Kavitha Marimuthu, Arunkumar Panneerselvam, Senthilkumar Selvaraj, Lakshmi Praba Venkatesan and Vetriselvi Sivaganesan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Drann-Ablahd/publication/369920829_DETECT_MALICIOUS_EMAILS_USING_DART_LANGUAGE/links/6460ae6a4353ba3b3b63c13f/DETECT-MALICIOUS-EMAILS-USING-DART-LANGUAGE.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;DETECT MALICIOUS EMAILS USING DART LANGUAGE&lt;/strong&gt;&lt;/a&gt; by A.Z. Ablahd.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Samson-Dauda/publication/366486320_Construction_of_A_Remote_Home_Automation_and_Security_System_Using_Raspberry_PI/links/63a39c6f5ed8895050400403/Construction-of-A-Remote-Home-Automation-and-Security-System-Using-Raspberry-PI.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Construction of A Remote Home Automation and Security System Using Raspberry PI&lt;/strong&gt;&lt;/a&gt; by Samson Dauda Yusuf, Chima Oji, Abdulmumini Zubairu Loko and Alhassan Tijani.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Olufunmilola-Ogunyolu-Alarape-2/publication/378365535_An_Enhanced_Mobile_Financial_Security_System_using_Facial_Recognition_and_Resident_Token_generator/links/65d63ba5c3b52a1170e9da6f/An-Enhanced-Mobile-Financial-Security-System-using-Facial-Recognition-and-Resident-Token-generator.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;An Enhanced Mobile Financial Security System using Facial Recognition and Resident Token generator&lt;/strong&gt;&lt;/a&gt; by Olufunmilola Adunni and Ogunyolu Oludele Awodele.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://jati.apu.edu.my/index.php/JATI/article/download/123/91" rel="noopener noreferrer"&gt;&lt;strong&gt;Propchan: A Mobile Application for Property Management&lt;/strong&gt;&lt;/a&gt; by Chow Jiunn Yang, Minnu Hellen Joseph and Masrina A. Salleh.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.eu-opensci.org/index.php/ejeng/article/download/62740/12800" rel="noopener noreferrer"&gt;&lt;strong&gt;Developing Cross-Platform Library Using Flutter&lt;/strong&gt;&lt;/a&gt; by Dilkhaz Y. Mohammed and Siddeeq Y. Ameen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.atlantis-press.com/article/125982310.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;QRCode Recognition on Flutter Framework Mobile Application Implemented on Entrance Security System&lt;/strong&gt;&lt;/a&gt; by Rosa Andrie Asmara, Rizky Putra Pradhana Budiman, Mungki Astiningrum, Brian Sayudha, Anik Nur Handayani and Cahya Rahmad.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.sciencedirect.com/science/article/pii/S1877050922021901/pdf?md5=669d3520e955b484e7508321ba02018c&amp;amp;pid=1-s2.0-S1877050922021901-main.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Development of e-butler: Introduction of robot system in hospitality with mobile application&lt;/strong&gt;&lt;/a&gt; by Alexander A S Gunawana, Benedick Clemonsa , Ignatius Ferdyan Halima, Kevin Andersona, Maria Pia Adianti.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.e3s-conferences.org/articles/e3sconf/pdf/2025/01/e3sconf_icegc2024_00022.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Plantonome: A Cross-Platform Application for Precision Agriculture&lt;/strong&gt;&lt;/a&gt; by Anass DEROUSSI, Abdessalam Ait Madi, Imam Alihamidi, zakaria chabou and Adnane Addaim.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison and Benchmark
&lt;/h2&gt;

&lt;p&gt;Publications doing performance comparison between Dart and other languages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.researchgate.net/profile/Sabyasachi-Mohanty-2/publication/278412445_DART_Evolved_for_Web_-A_Comparative_Study_with_JavaScript/links/5580ec1108ae47061e5f3cfa/DART-Evolved-for-Web-A-Comparative-Study-with-JavaScript.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;DART Evolved for Web - A Comparative Study with JavaScript&lt;/strong&gt;&lt;/a&gt; by Sabyasachi Mohanty and Smriti Rekha Dey.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pdfs.semanticscholar.org/c657/21e98abfafd6470d5ac15a057c2bf3c8eeaf.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;JAVA and DART programming languages: Conceptual comparison&lt;/strong&gt;&lt;/a&gt; by Afaf Mirghani Hassan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ph.pollub.pl/index.php/jcsi/article/download/3003/2714" rel="noopener noreferrer"&gt;&lt;strong&gt;Comparative analysis of Java and Dart programming languages in terms of suitability for creating mobile applications&lt;/strong&gt;&lt;/a&gt; by Łukasz Kozłowski, Grzegorz Kozieł.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pdfs.semanticscholar.org/c657/21e98abfafd6470d5ac15a057c2bf3c8eeaf.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;JAVA and DART programming languages: Conceptual comparison&lt;/strong&gt;&lt;/a&gt; by Afaf Mirghani Hassan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://lutpub.lut.fi/bitstream/handle/10024/166645/bachelorsthesis_trieu_huynh_ba_nguyen.pdf?sequence=1&amp;amp;isAllowed=y" rel="noopener noreferrer"&gt;&lt;strong&gt;EXPLORING JAVASCRIPT AND ITS RELATED LANGUAGES&lt;/strong&gt;&lt;/a&gt; by Trieu Huynh Ba Nguyen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://repositorio.uniandes.edu.co/bitstreams/f9f897d7-7532-4522-8d44-a41aa450709b/download" rel="noopener noreferrer"&gt;&lt;strong&gt;Empirical Testing for Establishing Benchmarks: Process Review and Comparison Between Java, Kotlin and Dart’s Performance&lt;/strong&gt;&lt;/a&gt; by Juan Sebastian Espitia Acero.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://lutpub.lut.fi/handle/10024/158504" rel="noopener noreferrer"&gt;&lt;strong&gt;Analyzing JavaScript frameworks and Dart for front-end development in building automation&lt;/strong&gt;&lt;/a&gt; by Mukhammadjon Jalolov.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.inase.org/library/2014/varna/bypaper/AMCSE/AMCSE-23.pdf" rel="noopener noreferrer"&gt;&lt;strong&gt;Security risks of java applets in remote experimentation and available alternatives&lt;/strong&gt;&lt;/a&gt; by Petra Špiláková, Roman Jašek1 and František Schauer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Videos and Channels
&lt;/h1&gt;

&lt;p&gt;Lot of talks can be found on Youtube, I can't list them all, but here some highlights.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=qCnwZG1zvH4" rel="noopener noreferrer"&gt;&lt;strong&gt;What is an Isolate anyway?&lt;/strong&gt; - Flutter &amp;amp; Friends 2026&lt;/a&gt; by Vyacheslav "Slava" Egorov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=vfKIxybokUI" rel="noopener noreferrer"&gt;&lt;strong&gt;Behind the @ – Dart Annotations in Depth&lt;/strong&gt; - Flutter &amp;amp; Friends 2026&lt;/a&gt; by Anna Leushchenko &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://youtube.com/watch?v=CbvRT9HObOw" rel="noopener noreferrer"&gt;&lt;strong&gt;Learning something about Dart performance by optimizing jsonDecode&lt;/strong&gt; - Flutter &amp;amp; Friends 2025&lt;/a&gt; by Vyacheslav "Slava" Egorov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=aphP_Hc7KiI" rel="noopener noreferrer"&gt;&lt;strong&gt;The Future is Written in Dart&lt;/strong&gt; -  Fluttercon EU 2025&lt;br&gt;
&lt;/a&gt; by Eric Seidel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=TX6qxkmsjOk" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart on the Backend with Serverpod&lt;/strong&gt; -  FlutterConf 2025&lt;/a&gt; by Viktor Lidholt &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=AKqaivvB3vg" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Exceptions: Best Practices&lt;/strong&gt; - Fluttercon USA 2025&lt;/a&gt; by Randal Schwartz&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=76C57fFQ8eU" rel="noopener noreferrer"&gt;&lt;strong&gt;Simpler state management with Dart on the server and synced databases&lt;/strong&gt; - Fluttercon EU 2025&lt;/a&gt; by Simon Binder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=P3_3FRcpnXQ" rel="noopener noreferrer"&gt;&lt;strong&gt;How to design a Dart package with hooks&lt;/strong&gt; - Fluttercon EU 2025&lt;/a&gt; by Moritz Sümmermann&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1sp_XVx9Wi8" rel="noopener noreferrer"&gt;&lt;strong&gt;Machines and Code Analysis - What makes Dart and Flutter run&lt;/strong&gt; - Fluttercon USA 2024&lt;/a&gt; by Norbert Kozsir&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=73gmEbOcMbo" rel="noopener noreferrer"&gt;&lt;strong&gt;A Deep Dive into Dart FFI&lt;/strong&gt; - Fluttercon USA 2024&lt;/a&gt; by Roman Jaquez&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=0qbkzKwPIOg" rel="noopener noreferrer"&gt;&lt;strong&gt;Supercharging Dart with Rust&lt;/strong&gt; - THAT Conference 2024&lt;/a&gt; by Brian Lambert&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=CBd3U8Z2zEA" rel="noopener noreferrer"&gt;&lt;strong&gt;Exploring Records and Patterns&lt;/strong&gt; - droidCon 2023&lt;/a&gt; by Pascal Welsch&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=NWVGLuE61H4" rel="noopener noreferrer"&gt;&lt;strong&gt;Running Dart around the Globe&lt;/strong&gt; - droidCon 2023&lt;/a&gt; by Mike Diarmid and Majid Hajian&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=MG0mOMx4LmE" rel="noopener noreferrer"&gt;&lt;strong&gt;Full Stack Dart&lt;/strong&gt; - DroidCon 2023&lt;/a&gt; by Chris Swan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Ng7XRitr5oE" rel="noopener noreferrer"&gt;&lt;strong&gt;Executing Dart code in background with Flutter&lt;/strong&gt; - droidCon 2023&lt;/a&gt; by Razvan Cristian Lung&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=YREQnvkDQeg" rel="noopener noreferrer"&gt;&lt;strong&gt;Server-Side In-App Purchases in Dart&lt;/strong&gt; - droidCon 2023&lt;/a&gt; by Miguel Bentran&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=7eQ3eAyq8pQ" rel="noopener noreferrer"&gt;&lt;strong&gt;The Joy of Functional Programming in Dart&lt;/strong&gt; - Fluttercon 2023&lt;/a&gt; by Csongor Vogel&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=kocn1PH4Y20" rel="noopener noreferrer"&gt;&lt;strong&gt;Experimenting around Dart Entrypoint Function Name to get it all&lt;/strong&gt; - droidCon 2023&lt;/a&gt; by Vadym Pinchuk&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=_DMhqP1Sy7k" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Microservice with Google Cloud Platform&lt;/strong&gt; - droidCon 2023&lt;/a&gt; by Filipe Barroso&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=90jq6HAb2gw&amp;amp;t=355s" rel="noopener noreferrer"&gt;&lt;strong&gt;Pure functional programming in Dart&lt;/strong&gt; - Func Prog Sweden 2021&lt;/a&gt; by Björn Sperber&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ymAodmjdvic" rel="noopener noreferrer"&gt;&lt;strong&gt;The Dart Specification Parser&lt;/strong&gt; - DartConf 2018&lt;/a&gt; by Erik Ernst&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oimGULseQ4M" rel="noopener noreferrer"&gt;&lt;strong&gt;How to build good packages for Dart and Flutter&lt;/strong&gt; - DartConf 2018&lt;/a&gt; by Kevin Moore&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=9FA3brRCz2Q&amp;amp;list=PLo6LNoPtjBxHFQKb6sf2fEwCA1mvTuycJ" rel="noopener noreferrer"&gt;&lt;strong&gt;Evolving Dart: Leaving the ocean and learning to fly&lt;/strong&gt; -DartConf 2018&lt;/a&gt; by Leaf Peterson&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=pxFpqBhX7ow" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart: the Return&lt;/strong&gt; - Javascript Conferences 2018&lt;/a&gt; by Evgeny Kot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=WjdrUphF5l4" rel="noopener noreferrer"&gt;&lt;strong&gt;Rebuilding Optimizing Compiler for Dart&lt;/strong&gt; - Strange Loop 2018&lt;/a&gt; by Vyacheslav Egorov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=P8ltWIqDPzo" rel="noopener noreferrer"&gt;&lt;strong&gt;Want to be a Better Programmer?&lt;/strong&gt; - GOTO 2016&lt;/a&gt; by Lars Bak and Kasper Lund&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=Azd2-5wCjUI" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart for the Internet of Things&lt;/strong&gt; - Dart Developer Summit 2015&lt;br&gt;
&lt;/a&gt; by Dennis Khvostionov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=PYUoqcTrskU" rel="noopener noreferrer"&gt;&lt;strong&gt;Kasper Lund: Why Google thinks you should drop everything you do and pick up their Dart&lt;/strong&gt;&lt;/a&gt; by Kasper Lund&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=5QZHVlwkf8M" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart For the Language Enthusiast&lt;/strong&gt; - Strange Loop 2013&lt;/a&gt; by Bob Nystrom&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xdMTNDMQw0A" rel="noopener noreferrer"&gt;&lt;strong&gt;Building optimising compiler for Dart&lt;/strong&gt; - Strange Loop 2013&lt;/a&gt; by Vyacheslav Egorov&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=5AqbCQuK0gM" rel="noopener noreferrer"&gt;&lt;strong&gt;Anders Hejlsberg and Lars Bak: TypeScript, JavaScript, and Dart&lt;/strong&gt; - GOTO 2012&lt;/a&gt; by Anders Hejlsberg and Lars Bak&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1Nr2lkB7MHs" rel="noopener noreferrer"&gt;&lt;strong&gt;Your First Look at the Dart Editor&lt;/strong&gt; - GOTO 2012&lt;/a&gt; by Jaime Wren&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=bsGgfUreyZw" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart - A Modern Web Language&lt;/strong&gt; - Google I/O 2012&lt;/a&gt; by Kasper Lund and Lars Bak&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=GwBb_nqQLuc" rel="noopener noreferrer"&gt;&lt;strong&gt;Translating DART to Efficient JavaScript&lt;/strong&gt; - GOTO 2012&lt;/a&gt; by Kasper Lund&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=-IavVtOE_Fg" rel="noopener noreferrer"&gt;&lt;strong&gt;A Walk on the Dart Side: A Quick Tour of Dart&lt;/strong&gt;&lt;/a&gt; by Gilad Bracha &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=nqb-k9upqZ4&amp;amp;t=830s" rel="noopener noreferrer"&gt;&lt;strong&gt;Slides from the Google Dart Presentation&lt;/strong&gt; - GOTO 2011&lt;/a&gt; by Kresten Krab Thorup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=M0lfNw8Tyhc" rel="noopener noreferrer"&gt;&lt;strong&gt;World Premier of Google Dart&lt;/strong&gt; - GOTO 2011&lt;/a&gt; by Karl Krukow &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=24LIzl7cM2c" rel="noopener noreferrer"&gt;&lt;strong&gt;Interview with Gilad Bracha about Google Dart&lt;/strong&gt; - GOTO 2011&lt;/a&gt; by Gilad Bracha&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conferences
&lt;/h1&gt;

&lt;p&gt;A list of conferences where you can find more talks about Dart.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=0a0iZW4RZXg&amp;amp;list=PLOU2XLYxmsIIJr3vjxggY7yGcGO7i9BK5&amp;amp;pp=0gcJCcsEOCosWNin" rel="noopener noreferrer"&gt;&lt;strong&gt;DartConf&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@flutterconf" rel="noopener noreferrer"&gt;&lt;strong&gt;FlutterConf&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flutterfriends.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter &amp;amp; Friends&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://www.youtube.com/@FlutterNFriends/videos" rel="noopener noreferrer"&gt;Youtube Channel&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLOU2XLYxmsILKY-A1kq4eHMcku3GMAyp2" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Developer Summit&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLjxrf2q8roU0o0wKRJTjyN0pSUA6TI8lg" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter Interact&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Tools and Other Resources
&lt;/h1&gt;

&lt;p&gt;Other stuff I don't know where to put.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://zetcode.com/dart/" rel="noopener noreferrer"&gt;&lt;strong&gt;ZetCode on Dart&lt;/strong&gt;&lt;/a&gt;: a list of e-pub, ebooks and documentations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dartpad.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;DartPad&lt;/strong&gt;&lt;/a&gt;: an editor and an in-compiler browser for Dart, useful to test snippets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/yissachar/awesome-dart" rel="noopener noreferrer"&gt;&lt;strong&gt;Awesome Dart&lt;/strong&gt;&lt;/a&gt;: an awesome list, mostly unmaintained.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/BrenoItalo16/100-exercises/" rel="noopener noreferrer"&gt;&lt;strong&gt;100 exercises in Dart&lt;/strong&gt;&lt;/a&gt;: a repository with 100 exercises to do in Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://exercism.org/tracks/dart" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart on Exercism&lt;/strong&gt;&lt;/a&gt;: coding exercises for Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dart-lang/tools" rel="noopener noreferrer"&gt;&lt;strong&gt;Dart Tools&lt;/strong&gt;&lt;/a&gt;: a list of useful tools for Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=p_wl80ugHSc" rel="noopener noreferrer"&gt;&lt;strong&gt;Advent of Code in Dart&lt;/strong&gt;&lt;/a&gt; by &lt;a href="https://www.youtube.com/@TsodingDaily" rel="noopener noreferrer"&gt;Tsoding&lt;/a&gt;: just because Tsoding tried Dart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@nikuu.westberg" rel="noopener noreferrer"&gt;&lt;strong&gt;Nikuu's Blog&lt;/strong&gt;&lt;/a&gt; on Medium: in particular with &lt;a href="https://medium.com/@nikuu.westberg/30-days-of-dart-code-a-beginner-friendly-journey-in-coding-47c3a04b7d65" rel="noopener noreferrer"&gt;30 Days of Dart Code: A Beginner-Friendly Journey in Coding&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@tfuytf775" rel="noopener noreferrer"&gt;&lt;strong&gt;Yassen Hussein Qasem Saeed Aleshab's blog&lt;/strong&gt;&lt;/a&gt; on Medium: especially &lt;a href="https://medium.com/@tfuytf775/best-practices-for-dart-and-flutter-application-development-791b4a04d4ee" rel="noopener noreferrer"&gt;Best Practices for Dart and Flutter Application Development&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cover Image by &lt;a href="https://unsplash.com/@jrarce?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ricardo Arce&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/selective-focus-photography-of-an-arrow-cY_TCKr5bek?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>documentation</category>
      <category>productivity</category>
      <category>references</category>
    </item>
  </channel>
</rss>
