<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dart Tutoriel &#8211; FoxDevelop</title>
	<atom:link href="https://www.foxdevelop.com/fr/category/dart-tutoriel/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>Studio de développement logiciel indépendant</description>
	<lastBuildDate>Fri, 31 Jul 2026 06:33:07 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.3</generator>

<image>
	<url>https://www.foxdevelop.com/wp-content/uploads/2026/05/fox-svgrepo-com-1.png</url>
	<title>Dart Tutoriel &#8211; FoxDevelop</title>
	<link>https://www.foxdevelop.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Bibliothèque dart:async</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-dartasync/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-dartasync/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 06:33:07 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6994</guid>

					<description><![CDATA[dart:async propose les fonctionnalités centrales de la programmation asynchrone Dart : Future, Stream. Deux concepts fondamentaux : Future 1. async / await Méthode à privilégier, plus lisible que les appels ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"><code>dart:async</code> propose les fonctionnalités centrales de la programmation asynchrone Dart : <strong>Future, Stream</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>L’utilisation de <code>Future / Stream</code> <strong>ne nécessite pas forcément d’importer manuellement dart:async</strong>, car dart:core l’exporte déjà ;</li>



<li>Si vous voulez utiliser des types comme <code>StreamController</code>, <code>StreamSubscription</code>, <code>ParallelWaitError</code>, vous devez réaliser un import explicite :</li>
</ol>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:async'</span>;</code></span></pre>


<p class="wp-block-paragraph">Deux concepts fondamentaux :</p>



<ul class="wp-block-list">
<li><strong>Future</strong> : représente un résultat asynchrone <strong>unique</strong> (une seule valeur ou une seule erreur produite à un moment ultérieur)</li>



<li><strong>Stream</strong> : représente une <strong>série continue</strong> de données asynchrones (produit plusieurs valeurs successivement, comparable à un flux d’événements)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Future</h3>



<h4 class="wp-block-heading">1. async / await</h4>



<p class="wp-block-paragraph">Méthode à privilégier, plus lisible que les appels chaînés <code>.then()</code></p>



<ul class="wp-block-list">
<li>Toute fonction marquée <code>async</code> <strong>renvoie un Future</strong> ;</li>



<li><code>await</code> attend la fin du Future et suspend l’exécution du code courant jusqu’à réception du résultat ;</li>



<li>Utilisez <code>try-catch</code> pour intercepter les exceptions asynchrones.</li>
</ul>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// async 函数返回 Future</span>
Future&lt;<span class="hljs-built_in">String</span>&gt; findEntryPoint() <span class="hljs-keyword">async</span> =&gt; <span class="hljs-string">"main.dart"</span>;
Future&lt;int&gt; runExecutable(<span class="hljs-built_in">String</span> entry, List args) <span class="hljs-keyword">async</span> =&gt; <span class="hljs-number">0</span>;
Future&lt;<span class="hljs-keyword">void</span>&gt; flushThenExit(int code) <span class="hljs-keyword">async</span> {}

<span class="hljs-comment">// await 写法（推荐）</span>
Future&lt;<span class="hljs-keyword">void</span>&gt; runUsingAsyncAwait() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">var</span> entryPoint = <span class="hljs-keyword">await</span> findEntryPoint();
    <span class="hljs-keyword">var</span> exitCode = <span class="hljs-keyword">await</span> runExecutable(entryPoint, &#91;]);
    <span class="hljs-keyword">await</span> flushThenExit(exitCode);
  } <span class="hljs-keyword">catch</span> (e) {
    <span class="hljs-comment">// 统一捕获异常</span>
    print(<span class="hljs-string">"出错：$e"</span>);
  }
}</code></span></pre>


<h4 class="wp-block-heading">2. .then() / .catchError() : syntaxe chaînée traditionnelle</h4>



<ul class="wp-block-list">
<li><code>.then()</code> : exécute un rappel quand le Future se termine avec succès ; renvoie un nouveau Future pour continuer la chaîne</li>



<li><code>.catchError()</code> : intercepte les erreurs ; <strong>doit être chaîné sur le retour de then</strong>, sinon les erreurs à l’intérieur du then ne seront pas capturées</li>
</ul>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">void</span> runUsingFuture() {
  findEntryPoint()
      .then((entryPoint) {
        <span class="hljs-keyword">return</span> runExecutable(entryPoint, &#91;]);
      })
      .then(flushThenExit)
      .catchError((e) {
        print(<span class="hljs-string">"异常：$e"</span>);
      });
}</code></span></pre>


<h4 class="wp-block-heading">3. Attendre plusieurs Futures exécutés en parallèle</h4>



<h5 class="wp-block-heading">① Future.wait()</h5>



<p class="wp-block-paragraph">Attend que toutes les tâches soient terminées ; <strong>si un seul Future échoue, l’ensemble échoue immédiatement</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Future&lt;<span class="hljs-keyword">void</span>&gt; task1() <span class="hljs-keyword">async</span> {}
Future&lt;<span class="hljs-keyword">void</span>&gt; task2() <span class="hljs-keyword">async</span> {}
Future&lt;<span class="hljs-keyword">void</span>&gt; task3() <span class="hljs-keyword">async</span> {}

<span class="hljs-keyword">void</span> testWait() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">await</span> Future.wait(&#91;
    task1(),
    task2(),
    task3(),
  ]);
  print(<span class="hljs-string">"全部任务执行完成"</span>);
}</code></span></pre>


<h5 class="wp-block-heading">② List.wait / Record.wait (nouvelle fonctionnalité, gestion fine des erreurs concurrentes)</h5>



<p class="wp-block-paragraph">Lève une <code>ParallelWaitError</code> qui permet de distinguer <strong>quelles tâches ont réussi et lesquelles ont échoué</strong>, sans blocage mutuel.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Future&lt;int&gt; <span class="hljs-keyword">delete</span>() <span class="hljs-keyword">async</span> =&gt; <span class="hljs-number">1</span>;
Future&lt;<span class="hljs-built_in">String</span>&gt; copy() <span class="hljs-keyword">async</span> =&gt; <span class="hljs-string">"ok"</span>;
Future&lt;bool&gt; errorTask() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">throw</span> Exception(<span class="hljs-string">"任务失败"</span>);
}

<span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">try</span> {
    <span class="hljs-comment">// 列表形式</span>
    <span class="hljs-keyword">var</span> results = <span class="hljs-keyword">await</span> &#91;<span class="hljs-keyword">delete</span>(), copy(), errorTask()].wait;
  } on ParallelWaitError&lt;List&lt;<span class="hljs-built_in">Object</span>?&gt;, List&lt;AsyncError?&gt;&gt; <span class="hljs-keyword">catch</span> (e) {
    print(e.values);   <span class="hljs-comment">// 成功有值，失败为null</span>
    print(e.errors);   <span class="hljs-comment">// 成功为null，失败存放错误信息</span>
  }

  <span class="hljs-comment">// Record元组形式：支持不同类型Future</span>
  <span class="hljs-keyword">try</span> {
    final (resInt, resStr, resBool) = <span class="hljs-keyword">await</span> (<span class="hljs-keyword">delete</span>(), copy(), errorTask()).wait;
  } on ParallelWaitError&lt;(int?, <span class="hljs-built_in">String</span>?, bool?), (AsyncError?, AsyncError?, AsyncError?)&gt; <span class="hljs-keyword">catch</span>(e) {

  }
}</code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Stream</h3>



<p class="wp-block-paragraph">Un Stream représente un <strong>flux continu de données asynchrones</strong> (lecture ligne par ligne d’un fichier, événements de clic sur interface, flux de données réseau).</p>



<h4 class="wp-block-heading">Deux modes d’utilisation</h4>



<h5 class="wp-block-heading">1 : <code>await for</code> boucle asynchrone (lisible, comparable à une itération synchrone)</h5>



<p class="wp-block-paragraph">Adapté aux flux de données finis ; <strong>déconseillé pour des flux d’événements infinis (clics d’interface)</strong>, car il bloque le reste du code.</p>


<pre class="wp-block-code"><span><code class="hljs language-php">import <span class="hljs-string">'dart:io'</span>;

Future&lt;void&gt; readFileByAwaitFor() async {
  <span class="hljs-keyword">var</span> file = File(<span class="hljs-string">"config.txt"</span>);
  Stream&lt;<span class="hljs-keyword">List</span>&lt;int&gt;&gt; input = file.openRead();
  <span class="hljs-keyword">var</span> lines = input
      .transform(utf8.decoder)
      .transform(<span class="hljs-keyword">const</span> LineSplitter());

  <span class="hljs-keyword">try</span> {
    await <span class="hljs-keyword">for</span> (<span class="hljs-keyword">final</span> line in lines) {
      <span class="hljs-keyword">print</span>(<span class="hljs-string">"读取一行：$line"</span>);
    }
    <span class="hljs-keyword">print</span>(<span class="hljs-string">"文件读取完毕"</span>);
  } <span class="hljs-keyword">catch</span> (e) {
    <span class="hljs-keyword">print</span>(<span class="hljs-string">"读取异常 $e"</span>);
  }
}</code></span></pre>


<h5 class="wp-block-heading">2 <code>.listen()</code> abonnement à l’écoute (adapté aux flux infinis)</h5>


<pre class="wp-block-code"><span><code class="hljs language-javascript">inputStream.listen(
  (data) {
    <span class="hljs-comment">// 收到数据回调</span>
  },
  <span class="hljs-attr">onError</span>: (err) {
    <span class="hljs-comment">// 发生错误</span>
  },
  <span class="hljs-attr">onDone</span>: () {
    <span class="hljs-comment">// 流正常关闭完成</span>
  },
);</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">listen renvoie un <code>StreamSubscription</code> sur lequel vous pouvez appeler <code>.cancel()</code> pour annuler l’abonnement.</p>
</blockquote>



<h3 class="wp-block-heading">Méthodes courantes de manipulation de Stream</h3>



<ul class="wp-block-list">
<li>Filtrage : <code>where()</code></li>



<li>Limitation : <code>take()</code>、<code>takeWhile()</code></li>



<li>Saut d’éléments : <code>skip()</code>、<code>skipWhile()</code></li>



<li>Récupération d’un seul élément : <code>first</code>、<code>last</code>、<code>single</code>、<code>firstWhere()</code></li>
</ul>



<h3 class="wp-block-heading">Transformation des données Stream avec transform()</h3>



<p class="wp-block-paragraph">Modifie le type des données du flux grâce à un transformateur (cas typique : convertir un flux binaire en chaîne de caractères)</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> lines = inputStream
    .transform(utf8.decoder)       <span class="hljs-comment">// List&lt;int&gt; → String</span>
    .transform(<span class="hljs-keyword">const</span> LineSplitter()); <span class="hljs-comment">// String → 逐行字符串</span></code></span></pre>


<h3 class="wp-block-heading">Conseil de choix : listen() vs await for</h3>



<ol class="wp-block-list">
<li>Lecture de fichiers, flux de séquences finies → <code>await for</code></li>



<li>Événements d’interface, messages continus et autres <strong>flux infinis</strong> → <code>.listen()</code></li>



<li>Une fois démarré, await for attend indéfiniment la fin du flux ; un flux infini provoquera un blocage du programme</li>
</ol>



<p class="wp-block-paragraph">Bibliothèque dart:async</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-dartasync/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>dart:io</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/dartio-6/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/dartio-6/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 03:58:45 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6972</guid>

					<description><![CDATA[Référence Attention dart:io ne fonctionne pas sur la plateforme Web !Prise en charge : programmes en ligne de commande Dart, serveurs, applications Flutter hors Web (Android/iOS/Windows/macOS/Linux). Opérations sur les fichiers ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Référence</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:io'</span>;</code></span></pre>


<h4 class="wp-block-heading">Attention</h4>



<p class="wp-block-paragraph"><strong>dart:io ne fonctionne pas sur la plateforme Web !</strong><br>Prise en charge : programmes en ligne de commande Dart, serveurs, applications Flutter hors Web (Android/iOS/Windows/macOS/Linux).</p>



<h4 class="wp-block-heading">Opérations sur les fichiers et répertoires</h4>



<p class="wp-block-paragraph"><code>FileSystemEntity</code> est la classe parente ; <code>File</code> (fichier) et <code>Directory</code> (répertoire) en héritent.</p>



<h5 class="wp-block-heading">1. Lecture de fichier</h5>



<p class="wp-block-paragraph">Lecture complète (adaptée aux petits fichiers)</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> file = File(<span class="hljs-string">"config.txt"</span>);
  <span class="hljs-keyword">try</span> {
    <span class="hljs-comment">// Lecture complète sous forme de chaîne (UTF-8)</span>
    <span class="hljs-built_in">String</span> content = <span class="hljs-keyword">await</span> file.readAsString();
    <span class="hljs-comment">// Lecture complète, découpage par lignes dans un tableau de chaînes</span>
    <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">String</span>&gt; lines = <span class="hljs-keyword">await</span> file.readAsLines();
    <span class="hljs-comment">// Lecture binaire sous forme de tableau d'octets List&lt;int&gt;</span>
    <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; bytes = <span class="hljs-keyword">await</span> file.readAsBytes();
  } <span class="hljs-keyword">catch</span> (e) {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Échec de la lecture : <span class="hljs-subst">$e</span>"</span>);
  }
}</code></span></pre>


<p class="wp-block-paragraph">Exemple complet</p>



<p class="wp-block-paragraph">Créez préalablement un fichier txt, puis adaptez le chemin ci-dessous : D:/dartdemo/firstdart/bin/config.txt</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:io'</span>;

<span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> file = File(<span class="hljs-string">"D:/dartdemo/firstdart/bin/config.txt"</span>);
  <span class="hljs-keyword">try</span> {
    <span class="hljs-comment">// Lecture complète sous forme de chaîne (UTF-8)</span>
    <span class="hljs-built_in">String</span> content = <span class="hljs-keyword">await</span> file.readAsString();
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"===== readAsString Texte complet ====="</span>);
    <span class="hljs-built_in">print</span>(content);

    <span class="hljs-comment">// Lecture complète, découpage par lignes dans un tableau de chaînes</span>
    <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">String</span>&gt; lines = <span class="hljs-keyword">await</span> file.readAsLines();
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"\n===== readAsLines Lecture ligne par ligne ====="</span>);
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> line <span class="hljs-keyword">in</span> lines) {
      <span class="hljs-built_in">print</span>(line);
    }

    <span class="hljs-comment">// Lecture binaire sous forme de tableau d'octets List&lt;int&gt;</span>
    <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; bytes = <span class="hljs-keyword">await</span> file.readAsBytes();
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"\n===== readAsBytes Tableau d'octets (30 premiers) ====="</span>);
    <span class="hljs-built_in">print</span>(bytes.take(<span class="hljs-number">30</span>).toList());
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Nombre total d'octets du fichier : <span class="hljs-subst">${bytes.length}</span>"</span>);
  } <span class="hljs-keyword">catch</span> (e) {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Échec de la lecture : <span class="hljs-subst">$e</span>"</span>);
  }
}</code></span></pre>


<p class="wp-block-paragraph">Résultat d&rsquo;exécution</p>


<pre class="wp-block-code"><span><code class="hljs language-php">D:\dartdemo\firstdart&gt;dart run
Building package executable...
Built firstdart:firstdart.
===== readAsString Texte complet =====
The minimal requirements <span class="hljs-keyword">for</span> a library are:

pubspec file
The pubspec.yaml file <span class="hljs-keyword">for</span> a library is the same <span class="hljs-keyword">as</span> <span class="hljs-keyword">for</span> an application package
—there is no special designation to indicate that the package is a library.

lib directory
<span class="hljs-keyword">As</span> you might expect, the library code lives under the lib directory <span class="hljs-keyword">and</span> is <span class="hljs-keyword">public</span> to other packages. You can create any hierarchy under lib, <span class="hljs-keyword">as</span> needed. By convention, implementation code is placed under lib/src. Code under lib/src is considered <span class="hljs-keyword">private</span>; other packages should never need to import src/.... To make APIs under lib/src <span class="hljs-keyword">public</span>, you can export lib/src files from a file that<span class="hljs-string">'s directly under lib.

===== readAsLines Lecture ligne par ligne =====
The minimal requirements for a library are:

pubspec file
The pubspec.yaml file for a library is the same as for an application package
—there is no special designation to indicate that the package is a library.

lib directory
As you might expect, the library code lives under the lib directory and is public to other packages. You can create any hierarchy under lib, as needed. By convention, implementation code is placed under lib/src. Code under lib/src is considered private; other packages should never need to import src/.... To make APIs under lib/src public, you can export lib/src files from a file that'</span>s directly under lib.

===== readAsBytes Tableau d<span class="hljs-string">'octets (30 premiers) =====
&#91;84, 104, 101, 32, 109, 105, 110, 105, 109, 97, 108, 32, 114, 101, 113, 117, 105, 114, 101, 109, 101, 110, 116, 115, 32, 102, 111, 114, 32, 97]
Nombre total d'</span>octets du fichier : <span class="hljs-number">644</span></code></span></pre>


<h5 class="wp-block-heading">Lecture en flux</h5>



<p class="wp-block-paragraph">Recommandé pour les gros fichiers : traitement au fur et à mesure de la lecture</p>



<p class="wp-block-paragraph">À associer au décodeur de <code>dart:convert</code>, renvoie un <code>Stream&lt;List&lt;int&gt;&gt;</code></p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:io'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;

<span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> file = File(<span class="hljs-string">"D:/dartdemo/firstdart/bin/config.txt"</span>);
  Stream&lt;<span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt;&gt; stream = file.openRead();

  <span class="hljs-keyword">var</span> lineStream = stream
      .transform(utf8.decoder)          <span class="hljs-comment">// Flux d'octets → flux de chaînes</span>
      .transform(<span class="hljs-keyword">const</span> LineSplitter());  <span class="hljs-comment">// Chaîne → séparation par lignes</span>

  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> line <span class="hljs-keyword">in</span> lineStream) {
      <span class="hljs-built_in">print</span>(line);
    }
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"Lecture terminée"</span>);
  } <span class="hljs-keyword">catch</span> (e) {
    <span class="hljs-built_in">print</span>(e);
  }
}</code></span></pre>


<p class="wp-block-paragraph">Résultat d&rsquo;exécution</p>


<pre class="wp-block-code"><span><code class="hljs language-php">D:\dartdemo\firstdart&gt;dart run
Building package executable...
Built firstdart:firstdart.
The minimal requirements <span class="hljs-keyword">for</span> a library are:

pubspec file
The pubspec.yaml file <span class="hljs-keyword">for</span> a library is the same <span class="hljs-keyword">as</span> <span class="hljs-keyword">for</span> an application package
—there is no special designation to indicate that the package is a library.

lib directory
<span class="hljs-keyword">As</span> you might expect, the library code lives under the lib directory <span class="hljs-keyword">and</span> is <span class="hljs-keyword">public</span> to other packages. 
You can create any hierarchy under lib, <span class="hljs-keyword">as</span> needed. By convention, implementation code is placed under lib/src.
 Code under lib/src is considered <span class="hljs-keyword">private</span>; other packages should never need to import src/.... To make APIs under lib/src <span class="hljs-keyword">public</span>,
 you can export lib/src files from a file that<span class="hljs-string">'s directly under lib.
Lecture terminée</span></code></span></pre>


<h4 class="wp-block-heading">2. Écriture de fichier (IOSink)</h4>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:io'</span>;

<span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> logFile = File(<span class="hljs-string">"log.txt"</span>);
  <span class="hljs-comment">// FileMode.write : écrase le contenu existant (valeur par défaut)</span>
  <span class="hljs-keyword">var</span> sink = logFile.openWrite(mode: FileMode.write);

  sink.write(<span class="hljs-string">"Contenu du journal\n"</span>);
  sink.add(&#91;<span class="hljs-number">48</span>,<span class="hljs-number">49</span>]); <span class="hljs-comment">// Écriture d'octets binaires</span>

  <span class="hljs-keyword">await</span> sink.flush(); <span class="hljs-comment">// Vider le tampon</span>
  <span class="hljs-keyword">await</span> sink.close(); <span class="hljs-comment">// Fermeture obligatoire</span>

  <span class="hljs-comment">// Mode d'ajout</span>
  <span class="hljs-comment">// var sink = logFile.openWrite(mode: FileMode.append);</span>
}</code></span></pre>


<p class="wp-block-paragraph">Après exécution</p>



<p class="wp-block-paragraph">Un fichier log.txt est créé dans le dossier du projet D:\dartdemo\firstdart</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="394" height="266" src="https://www.foxdevelop.com/wp-content/uploads/2026/07/image-310.png" alt="" class="wp-image-6593" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/07/image-310.png 394w, https://www.foxdevelop.com/wp-content/uploads/2026/07/image-310-300x203.png 300w" sizes="(max-width: 394px) 100vw, 394px" /></figure>



<p class="wp-block-paragraph">Modes disponibles :</p>



<ul class="wp-block-list">
<li><code>FileMode.write</code> : création avec écrasement</li>



<li><code>FileMode.append</code> : ajout à la fin du fichier</li>



<li><code>FileMode.writeOnly</code> / <code>readWrite</code> modes lecture-écriture</li>
</ul>



<h4 class="wp-block-heading">3. Parcours de répertoire</h4>



<p class="wp-block-paragraph"><code>Directory.list()</code> renvoie un Stream pour parcourir tous les fichiers et dossiers du répertoire</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> dir = Directory(<span class="hljs-string">"./tmp"</span>);
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">var</span> entityStream = dir.list();
    <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span> (FileSystemEntity entity <span class="hljs-keyword">in</span> entityStream) {
      <span class="hljs-keyword">if</span> (entity <span class="hljs-keyword">is</span> File) {
        <span class="hljs-built_in">print</span>(<span class="hljs-string">"Fichier : <span class="hljs-subst">${entity.path}</span>"</span>);
      } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (entity <span class="hljs-keyword">is</span> Directory) {
        <span class="hljs-built_in">print</span>(<span class="hljs-string">"Répertoire : <span class="hljs-subst">${entity.path}</span>"</span>);
      }
    }
  } <span class="hljs-keyword">catch</span> (e) {
    <span class="hljs-built_in">print</span>(e);
  }
}</code></span></pre>


<h4 class="wp-block-heading">4. Opérations courantes sur fichiers / répertoires</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> f = File(<span class="hljs-string">"test.txt"</span>);
<span class="hljs-keyword">await</span> f.create();          <span class="hljs-comment">// Créer un fichier</span>
<span class="hljs-keyword">await</span> f.delete();          <span class="hljs-comment">// Supprimer un fichier</span>
<span class="hljs-keyword">await</span> f.length();          <span class="hljs-comment">// Obtenir la taille du fichier en octets</span>

<span class="hljs-keyword">var</span> d = Directory(<span class="hljs-string">"data"</span>);
<span class="hljs-keyword">await</span> d.create(recursive: <span class="hljs-literal">true</span>); <span class="hljs-comment">// Créer récursivement des sous-répertoires</span>
<span class="hljs-keyword">await</span> d.delete(recursive: <span class="hljs-literal">true</span>);  <span class="hljs-comment">// Supprimer récursivement un répertoire</span></code></span></pre>


<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Serveur HTTP HttpServer</h3>



<p class="wp-block-paragraph">Permet de mettre en place un serveur Web Dart, d’écouter un port et de traiter les requêtes.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-comment">// Lier l'adresse et le port</span>
  HttpServer server = <span class="hljs-keyword">await</span> HttpServer.bind(<span class="hljs-string">"localhost"</span>, <span class="hljs-number">8888</span>);
  print(<span class="hljs-string">"Serveur démarré http://localhost:8888"</span>);

  <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span> (HttpRequest request <span class="hljs-keyword">in</span> server) {
    handleRequest(request);
  }
}

<span class="hljs-keyword">void</span> handleRequest(HttpRequest req) {
  HttpResponse res = req.response;
  <span class="hljs-keyword">if</span> (req.uri.path == <span class="hljs-string">"/dart"</span>) {
    res.headers.contentType = ContentType.text;
    res.write(<span class="hljs-string">"Hello Dart HttpServer"</span>);
  } <span class="hljs-keyword">else</span> {
    res.statusCode = HttpStatus.notFound;
  }
  res.close(); <span class="hljs-comment">// Fermer la réponse obligatoirement pour envoyer les données</span>
}</code></span></pre>


<p class="wp-block-paragraph">Exemple concret</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:io'</span>;

<span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-comment">// Lier l'adresse et le port</span>
  HttpServer server = <span class="hljs-keyword">await</span> HttpServer.bind(<span class="hljs-string">"localhost"</span>, <span class="hljs-number">8888</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"Serveur démarré http://localhost:8888"</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"Adresse d'accès : http://localhost:8888/dart"</span>);

  <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span> (HttpRequest request <span class="hljs-keyword">in</span> server) {
    handleRequest(request);
  }
}

<span class="hljs-keyword">void</span> handleRequest(HttpRequest req) {
  HttpResponse res = req.response;
  <span class="hljs-comment">// Vérifier le chemin de la requête</span>
  <span class="hljs-keyword">if</span> (req.uri.path == <span class="hljs-string">"/dart"</span>) {
    res.headers.contentType = ContentType.text;
    res.write(<span class="hljs-string">"Hello Dart HttpServer"</span>);
  } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (req.uri.path == <span class="hljs-string">"/"</span>) {
    res.headers.contentType = ContentType.text;
    res.write(<span class="hljs-string">"Page d'accueil ! Veuillez accéder à /dart"</span>);
  } <span class="hljs-keyword">else</span> {
    res.statusCode = HttpStatus.notFound;
    res.write(<span class="hljs-string">"404 Not Found"</span>);
  }
  res.close(); <span class="hljs-comment">// Fermer la réponse obligatoirement pour envoyer les données</span>
}</code></span></pre>


<p class="wp-block-paragraph">Accédez avec votre navigateur à <a href="http://localhost:8888/dart">localhost:8888/dart</a></p>



<figure class="wp-block-image size-full"><img decoding="async" width="439" height="136" src="https://www.foxdevelop.com/wp-content/uploads/2026/07/image-311.png" alt="" class="wp-image-6594" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/07/image-311.png 439w, https://www.foxdevelop.com/wp-content/uploads/2026/07/image-311-300x93.png 300w" sizes="(max-width: 439px) 100vw, 439px" /></figure>



<h3 class="wp-block-heading">Client HTTP HttpClient</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Conseil officiel important : évitez d’utiliser directement HttpClient !</strong><br><code>HttpClient</code> dépend de dart:io dans son implémentation, sa compatibilité multiplateforme est limitée. Pour les projets, préférez le paquet tiers <code>package:http</code>.</p>
</blockquote>



<p class="wp-block-paragraph">Exemple simplifié à titre informatif :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> client = HttpClient();
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">var</span> req = <span class="hljs-keyword">await</span> client.getUrl(<span class="hljs-built_in">Uri</span>.parse(<span class="hljs-string">"https://foxdevelop.com"</span>));
    <span class="hljs-keyword">var</span> res = <span class="hljs-keyword">await</span> req.close();
    <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> chunk <span class="hljs-keyword">in</span> res) {
      <span class="hljs-comment">// Recevoir le flux d'octets de la réponse</span>
    }
  } <span class="hljs-keyword">finally</span> {
    client.close();
  }
}</code></span></pre>


<p class="wp-block-paragraph">Voici un exemple exécutable</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:io'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;

<span class="hljs-keyword">void</span> main() <span class="hljs-keyword">async</span> {
  <span class="hljs-keyword">var</span> client = HttpClient();
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">var</span> req = <span class="hljs-keyword">await</span> client.getUrl(<span class="hljs-built_in">Uri</span>.parse(<span class="hljs-string">"https://foxdevelop.com"</span>));
    <span class="hljs-keyword">var</span> res = <span class="hljs-keyword">await</span> req.close();

    <span class="hljs-comment">// Collecter tous les fragments binaires</span>
    <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; allBytes = &#91;];
    <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> chunk <span class="hljs-keyword">in</span> res) {
      allBytes.addAll(chunk);
    }
    <span class="hljs-comment">// Convertir le tableau d'octets en HTML UTF8</span>
    <span class="hljs-built_in">String</span> html = utf8.decode(allBytes);
    <span class="hljs-built_in">print</span>(html);
  } <span class="hljs-keyword">finally</span> {
    client.close();
  }
}</code></span></pre>


<p class="wp-block-paragraph">dart:io</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/dartio-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bibliothèque de base dart:core</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-de-base-dartcore/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-de-base-dartcore/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 02:56:22 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6948</guid>

					<description><![CDATA[La bibliothèque dart:core est la bibliothèque standard principale de Dart, importée implicitement et automatiquement. Elle fournit les fonctionnalités de base indispensables du langage. Voici ses fonctionnalités principales et des exemples ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">La bibliothèque <code>dart:core</code> est la bibliothèque standard principale de Dart, importée <strong>implicitement et automatiquement</strong>. Elle fournit les fonctionnalités de base indispensables du langage. Voici ses fonctionnalités principales et des exemples de code classés par module.</p>



<p class="wp-block-paragraph">Autrement dit, le développeur n’a pas besoin d’écrire d’instruction d’import ; elle se charge par défaut automatiquement.</p>



<h4 class="wp-block-heading">I. Affichage console</h4>



<p class="wp-block-paragraph">Fonction de premier niveau <code>print()</code> : appelle automatiquement la méthode <code>toString()</code> de l’objet pour afficher du texte.</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> tea = <span class="hljs-string">"milk tea"</span>;
  <span class="hljs-built_in">print</span>(tea);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'I drink <span class="hljs-subst">$tea</span>.'</span>);
}</code></span></pre>


<h4 class="wp-block-heading">II. Types numériques : num / int / double</h4>



<ol class="wp-block-list">

<li>Relation d’héritage : <code>int</code> et <code>double</code> héritent de <code>num</code></li>


<li>Conversion chaîne vers nombre : <code>parse()</code> ; le type int accepte le paramètre radix pour préciser la base numérique</li>


<li>Conversion nombre vers chaîne :</li>

</ol>



<ul class="wp-block-list">

<li><code>toString()</code> : conversion simple</li>


<li><code>toStringAsFixed(n)</code> : conserve n chiffres après la virgule</li>


<li><code>toStringAsPrecision(n)</code> : n chiffres significatifs</li>

</ul>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-comment">// Conversion chaîne vers nombre</span>
  <span class="hljs-keyword">assert</span>(<span class="hljs-built_in">int</span>.parse(<span class="hljs-string">'42'</span>) == <span class="hljs-number">42</span>);
  <span class="hljs-keyword">assert</span>(<span class="hljs-built_in">int</span>.parse(<span class="hljs-string">'42'</span>, radix:<span class="hljs-number">16</span>) == <span class="hljs-number">66</span>);
  <span class="hljs-keyword">assert</span>(<span class="hljs-built_in">double</span>.parse(<span class="hljs-string">'0.5'</span>) == <span class="hljs-number">0.5</span>);

  <span class="hljs-comment">// Conversion nombre vers chaîne</span>
  <span class="hljs-keyword">assert</span>(<span class="hljs-number">123.456</span>.toStringAsFixed(<span class="hljs-number">2</span>) == <span class="hljs-string">'123.46'</span>);
  <span class="hljs-keyword">assert</span>(<span class="hljs-number">123.456</span>.toStringAsPrecision(<span class="hljs-number">2</span>) == <span class="hljs-string">'1.2e+2'</span>);
}</code></span></pre>


<h4 class="wp-block-heading">III. Chaînes String &amp; expressions régulières RegExp</h4>



<ul class="wp-block-list">

<li>Les objets <strong>String sont immuables</strong> (toutes les méthodes de modification renvoient une nouvelle chaîne) ; ils stockent des unités de code UTF-16</li>


<li>Méthodes courantes : recherche, extraction, découpage, mise en majuscules/minuscules, suppression des espaces</li>

</ul>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> str = <span class="hljs-string">'Never odd or even'</span>;
  <span class="hljs-comment">// Recherche</span>
  <span class="hljs-keyword">assert</span>(str.contains(<span class="hljs-string">'odd'</span>));
  <span class="hljs-keyword">assert</span>(str.startsWith(<span class="hljs-string">'Never'</span>));
  <span class="hljs-keyword">assert</span>(str.endsWith(<span class="hljs-string">'even'</span>));
  <span class="hljs-keyword">assert</span>(str.indexOf(<span class="hljs-string">'odd'</span>) == <span class="hljs-number">6</span>);

  <span class="hljs-comment">// Extraction et découpage</span>
  <span class="hljs-keyword">assert</span>(str.substring(<span class="hljs-number">6</span>,<span class="hljs-number">9</span>) == <span class="hljs-string">'odd'</span>);
  <span class="hljs-keyword">var</span> parts = <span class="hljs-string">'a b c'</span>.split(<span class="hljs-string">' '</span>);

  <span class="hljs-comment">// Suppression espaces et vérification vide</span>
  <span class="hljs-keyword">assert</span>(<span class="hljs-string">'  abc  '</span>.trim() == <span class="hljs-string">'abc'</span>);
  <span class="hljs-keyword">assert</span>(<span class="hljs-string">''</span>.isEmpty);
  <span class="hljs-keyword">assert</span>(<span class="hljs-string">'  '</span>.isNotEmpty);

  <span class="hljs-comment">// Changement de casse</span>
  <span class="hljs-keyword">assert</span>(<span class="hljs-string">'dart'</span>.toUpperCase() == <span class="hljs-string">'DART'</span>);

  <span class="hljs-comment">// Privilégier StringBuffer pour concaténation (meilleure performance)</span>
  <span class="hljs-keyword">var</span> sb = <span class="hljs-built_in">StringBuffer</span>();
  sb.write(<span class="hljs-string">'Hello '</span>);
  sb.writeAll(&#91;<span class="hljs-string">'A'</span>,<span class="hljs-string">'B'</span>,<span class="hljs-string">'C'</span>], <span class="hljs-string">','</span>);
  <span class="hljs-built_in">print</span>(sb.toString());
}</code></span></pre>


<h4 class="wp-block-heading">Expressions régulières RegExp</h4>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> reg = <span class="hljs-built_in">RegExp</span>(<span class="hljs-string">r'\d+'</span>); <span class="hljs-comment">// Correspond à une suite de chiffres</span>
  <span class="hljs-keyword">var</span> text = <span class="hljs-string">'llamas live 15 to 20 years'</span>;

  <span class="hljs-keyword">assert</span>(reg.hasMatch(text));
  <span class="hljs-comment">// Parcours de toutes les correspondances globales</span>
  <span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> m <span class="hljs-keyword">in</span> reg.allMatches(text)){
    <span class="hljs-built_in">print</span>(m.group(<span class="hljs-number">0</span>));
  }
  <span class="hljs-comment">// Remplacement</span>
  <span class="hljs-keyword">var</span> res = text.replaceAll(reg, <span class="hljs-string">'XX'</span>);
  <span class="hljs-built_in">print</span>(res);
}</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">

<p class="wp-block-paragraph">Remarque : une unité de code ne correspond pas forcément à un caractère visible pour l’utilisateur. Pour les caractères Unicode complexes (combinaisons d’emojis), utilisez le paquet externe <code>characters</code>.</p>

</blockquote>



<h4 class="wp-block-heading">IV. Collections (List / Set / Map)</h4>



<p class="wp-block-paragraph">1. List : ordonnée, accepte les doublons, accès par index</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> fruits = &#91;<span class="hljs-string">'apple'</span>,<span class="hljs-string">'orange'</span>];
  fruits.add(<span class="hljs-string">'kiwi'</span>);
  fruits.addAll(&#91;<span class="hljs-string">'grape'</span>]);
  fruits.removeAt(<span class="hljs-number">0</span>);
  fruits.sort((a,b)=&gt;a.compareTo(b)); <span class="hljs-comment">// Tri des éléments</span>

  <span class="hljs-comment">// Contrainte générique</span>
  <span class="hljs-keyword">var</span> strList = &lt;<span class="hljs-built_in">String</span>&gt;&#91;];
}</code></span></pre>


<p class="wp-block-paragraph">2. Set : non ordonnée, éléments uniques, pas d’accès par index</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> <span class="hljs-keyword">set</span> = &lt;<span class="hljs-built_in">String</span>&gt;{};
  <span class="hljs-keyword">set</span>.addAll(&#91;<span class="hljs-string">'gold'</span>,<span class="hljs-string">'xenon'</span>]);
  <span class="hljs-keyword">set</span>.add(<span class="hljs-string">'gold'</span>); <span class="hljs-comment">// Ajout d’un doublon sans effet</span>
  <span class="hljs-keyword">assert</span>(<span class="hljs-keyword">set</span>.contains(<span class="hljs-string">'xenon'</span>));

  <span class="hljs-comment">// Opération d’intersection</span>
  <span class="hljs-keyword">var</span> set2 = <span class="hljs-built_in">Set</span>.from(&#91;<span class="hljs-string">'xenon'</span>,<span class="hljs-string">'argon'</span>]);
  <span class="hljs-keyword">var</span> inter = <span class="hljs-keyword">set</span>.intersection(set2);
}</code></span></pre>


<p class="wp-block-paragraph">3. Map : collection de paires clé-valeur ; les clés sont uniques</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> map = {<span class="hljs-number">54</span>: <span class="hljs-string">'xenon'</span>};
  <span class="hljs-built_in">print</span>(map&#91;<span class="hljs-number">54</span>]);
  <span class="hljs-keyword">assert</span>(map.containsKey(<span class="hljs-number">54</span>));
  map.remove(<span class="hljs-number">54</span>);

  <span class="hljs-comment">// Affecte seulement si la clé n’existe pas</span>
  map.putIfAbsent(<span class="hljs-string">'name'</span>, () =&gt; <span class="hljs-string">'Dart'</span>);

  <span class="hljs-comment">// Parcours des entrées</span>
  map.forEach((k,v)=&gt;<span class="hljs-built_in">print</span>(<span class="hljs-string">'<span class="hljs-subst">$k</span>:<span class="hljs-subst">$v</span>'</span>));
}</code></span></pre>


<h4 class="wp-block-heading">4. Opérations génériques Iterable (List et Set implémentent Iterable)</h4>



<p class="wp-block-paragraph">Méthodes d’ordre supérieur habituelles : <code>forEach</code>, <code>map</code>, <code>where</code>, <code>any</code>, <code>every</code></p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> list = &#91;<span class="hljs-string">'green'</span>,<span class="hljs-string">'black'</span>,<span class="hljs-string">'chamomile'</span>];
  list.forEach(<span class="hljs-built_in">print</span>);

  <span class="hljs-comment">// map est évalué paresseusement, toList force l’exécution</span>
  <span class="hljs-keyword">var</span> upperList = list.map((e)=&gt;e.toUpperCase()).toList();

  <span class="hljs-comment">// Filtrer les éléments</span>
  <span class="hljs-keyword">var</span> filter = list.where((e)=&gt;e == <span class="hljs-string">'chamomile'</span>);
  <span class="hljs-keyword">assert</span>(list.any((e)=&gt;e == <span class="hljs-string">'chamomile'</span>));
  <span class="hljs-keyword">assert</span>(!list.every((e)=&gt;e.contains(<span class="hljs-string">'tea'</span>)));
}</code></span></pre>


<h4 class="wp-block-heading">V. Gestion des URI (Uri)</h4>



<p class="wp-block-paragraph">Utilisé pour l’encodage, le décodage, l’analyse et la construction d’URL</p>



<ol class="wp-block-list">

<li><code>encodeFull</code> : encode uniquement les espaces et caractères similaires, conserve les symboles URL <code>/ : ? &amp;</code></li>


<li><code>encodeComponent</code> : échappe tous les caractères spéciaux (adapté pour encoder les valeurs des paramètres)</li>

</ol>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-comment">// Analyser une url</span>
  <span class="hljs-keyword">var</span> uri = <span class="hljs-built_in">Uri</span>.parse(<span class="hljs-string">'https://example.org:8080/foo?lang=dart#frag'</span>);
  <span class="hljs-built_in">print</span>(uri.scheme);
  <span class="hljs-built_in">print</span>(uri.host);
  <span class="hljs-built_in">print</span>(uri.queryParameters);

  <span class="hljs-comment">// Construire une url</span>
  <span class="hljs-keyword">var</span> newUri = <span class="hljs-built_in">Uri</span>.https(<span class="hljs-string">'example.org'</span>,<span class="hljs-string">'/foo'</span>, {<span class="hljs-string">'lang'</span>:<span class="hljs-string">'dart'</span>});
}</code></span></pre>


<h4 class="wp-block-heading">VI. Dates et heures DateTime &amp; Duration</h4>



<ul class="wp-block-list">

<li><code>DateTime</code> : instant temporel, prend en charge l’heure locale et l’UTC</li>


<li><code>Duration</code> : intervalle temporel, pour ajouter/soustraire des instants et calculer des écarts</li>

</ul>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">var</span> now = <span class="hljs-built_in">DateTime</span>.now();
  <span class="hljs-keyword">var</span> y2k = <span class="hljs-built_in">DateTime</span>.utc(<span class="hljs-number">2000</span>);

  <span class="hljs-comment">// Ajout et soustraction temporelle</span>
  <span class="hljs-keyword">var</span> nextYear = y2k.add(<span class="hljs-keyword">const</span> <span class="hljs-built_in">Duration</span>(days:<span class="hljs-number">366</span>));
  <span class="hljs-keyword">var</span> diff = nextYear.difference(y2k);
  <span class="hljs-built_in">print</span>(diff.inDays);

  <span class="hljs-comment">// Horodatage (millisecondes depuis l’époque Unix 1970-01-01 UTC)</span>
  <span class="hljs-built_in">print</span>(y2k.millisecondsSinceEpoch);
}</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">

<p class="wp-block-paragraph">Attention : les décalages par jour peuvent entraîner des erreurs avec le changement d’heure été/hiver. Privilégiez l’heure UTC.</p>

</blockquote>



<h4 class="wp-block-heading">VII. Interfaces utiles et classes de base</h4>



<p class="wp-block-paragraph">1. Comparable : permet de comparer des objets pour le tri</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Line</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Comparable</span>&lt;<span class="hljs-title">Line</span>&gt; </span>{
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> length;
  <span class="hljs-keyword">const</span> Line(<span class="hljs-keyword">this</span>.length);
  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">int</span> compareTo(Line other) =&gt; length - other.length;
}</code></span></pre>


<p class="wp-block-paragraph">2. Clés personnalisées pour Map : redéfinir <code>==</code> et <code>hashCode</code></p>



<p class="wp-block-paragraph">Règle : des objets égaux doivent posséder le même hashCode</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> </span>{
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">String</span> first, last;
  Person(<span class="hljs-keyword">this</span>.first,<span class="hljs-keyword">this</span>.last);

  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">int</span> <span class="hljs-keyword">get</span> hashCode =&gt; <span class="hljs-built_in">Object</span>.hash(first, last);

  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">bool</span> <span class="hljs-keyword">operator</span> ==(<span class="hljs-built_in">Object</span> other) =&gt;
      other <span class="hljs-keyword">is</span> Person &amp;&amp; other.first == first &amp;&amp; other.last == other.last;
}</code></span></pre>


<ul class="wp-block-list">

<li>3. Iterable + Iterator</li>

</ul>



<p class="wp-block-paragraph">Implémenter <code>Iterable</code> permet d’utiliser des boucles <code>for-in</code> avec une logique de parcours personnalisée.</p>



<h4 class="wp-block-heading">VIII. Gestion des exceptions</h4>



<ul class="wp-block-list">

<li><strong>Error</strong> : erreur grave, généralement non interceptée (ex: NoSuchMethodError)</li>


<li><strong>Exception</strong> : anomalie prévisible pouvant être interceptée ; vous pouvez créer vos propres exceptions</li>

</ul>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FooException</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Exception</span> </span>{
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">String</span>? msg;
  <span class="hljs-keyword">const</span> FooException(&#91;<span class="hljs-keyword">this</span>.msg]);
  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">String</span> toString() =&gt; msg ?? <span class="hljs-string">'FooException'</span>;
}</code></span></pre>


<h4 class="wp-block-heading">IX. Références faibles et finaliseurs</h4>



<ul class="wp-block-list">

<li><code>WeakReference</code> : référence faible, n’empêche pas le ramasse-miettes de libérer l’objet</li>


<li><code>Finalizer / NativeFinalizer</code> : exécute un rappel quand l’objet est libéré, pour libérer des ressources natives</li>


<li><code>Finalizable</code> : évite que l’objet soit collecté prématurément par le GC</li>

</ul>



<p class="wp-block-paragraph">Bibliothèque principale dart:core</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-de-base-dartcore/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bibliothèque dart:convert</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-dartconvert/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-dartconvert/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 02:23:54 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6923</guid>

					<description><![CDATA[Découvrez les fonctionnalités principales de la bibliothèque Dart dart:convert. Cette bibliothèque propose des convertisseurs pour JSON et UTF-8 et autorise également la création de convertisseurs personnalisés. JSON : format textuel ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Découvrez les fonctionnalités principales de la bibliothèque Dart <code>dart:convert</code>. Cette bibliothèque propose des convertisseurs pour <strong>JSON et UTF-8</strong> et autorise également la création de convertisseurs personnalisés.</p>



<p class="wp-block-paragraph">JSON : format textuel léger destiné à représenter des objets et collections structurés.</p>



<p class="wp-block-paragraph">UTF-8 : codage à largeur variable capable de représenter tous les caractères de l&rsquo;ensemble Unicode.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;</code></span></pre>


<h4 class="wp-block-heading">Encodage et décodage JSON</h4>



<p class="wp-block-paragraph">jsonDecode() : Chaîne JSON → Objet Dart</p>



<p class="wp-block-paragraph">Décode une chaîne au format JSON en un objet Dart.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Attention : les chaînes JSON doivent utiliser <strong>des guillemets doubles <code>"</code></strong> ; les apostrophes simples <code>'</code> ne sont pas autorisées. Ce texte est du JSON, pas du code Dart.</p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;

<span class="hljs-keyword">void</span> main() {
	<span class="hljs-keyword">var</span> jsonString = <span class="hljs-string">'''
	  &#91;
		{"score": 40},
		{"score": 80}
	  ]
	'''</span>;

	<span class="hljs-keyword">var</span> scores = jsonDecode(jsonString);
	<span class="hljs-keyword">assert</span>(scores <span class="hljs-keyword">is</span> <span class="hljs-built_in">List</span>);

	<span class="hljs-keyword">var</span> firstScore = scores&#91;<span class="hljs-number">0</span>];
	<span class="hljs-keyword">assert</span>(firstScore <span class="hljs-keyword">is</span> <span class="hljs-built_in">Map</span>);
	<span class="hljs-keyword">assert</span>(firstScore&#91;<span class="hljs-string">'score'</span>] == <span class="hljs-number">40</span>);
}</code></span></pre>


<p class="wp-block-paragraph">jsonEncode() : Objet Dart → Chaîne JSON</p>



<p class="wp-block-paragraph">Encode des objets Dart sérialisables en chaîne JSON :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;

<span class="hljs-keyword">void</span> main() {
	<span class="hljs-keyword">var</span> scores = &#91;
	  {<span class="hljs-string">'score'</span>: <span class="hljs-number">40</span>},
	  {<span class="hljs-string">'score'</span>: <span class="hljs-number">80</span>},
	  {<span class="hljs-string">'score'</span>: <span class="hljs-number">100</span>, <span class="hljs-string">'overtime'</span>: <span class="hljs-keyword">true</span>, <span class="hljs-string">'special_guest'</span>: <span class="hljs-keyword">null</span>},
	];

	<span class="hljs-keyword">var</span> jsonText = jsonEncode(scores);
	<span class="hljs-keyword">assert</span>(
	  jsonText ==
		  <span class="hljs-string">'&#91;{"score":40},{"score":80},'</span>
			  <span class="hljs-string">'{"score":100,"overtime":true,'</span>
			  <span class="hljs-string">'"special_guest":null}]'</span>,
	);
}</code></span></pre>


<h4 class="wp-block-heading">Types pris en charge nativement par JSON</h4>



<p class="wp-block-paragraph">Seuls les types suivants peuvent être directement encodés en JSON :</p>



<p class="wp-block-paragraph"><code>int</code>, <code>double</code>, <code>String</code>, <code>bool</code>, <code>null</code>, <code>List</code>, <strong>Map dont les clés sont des String</strong></p>



<p class="wp-block-paragraph">List et Map encodent récursivement leurs éléments internes.</p>



<h3 class="wp-block-heading">Encodage et décodage de caractères UTF-8</h3>



<p class="wp-block-paragraph">utf8.decode() : Tableau d&rsquo;octets UTF-8 → Chaîne Dart</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:convert'</span>;

<span class="hljs-keyword">void</span> main() {
	<span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; utf8Bytes = &#91;
	  <span class="hljs-number">0xc3</span>, <span class="hljs-number">0x8e</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xb1</span>, <span class="hljs-number">0xc5</span>, <span class="hljs-number">0xa3</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xa9</span>,
	  <span class="hljs-number">0x72</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xb1</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xa5</span>, <span class="hljs-number">0xc5</span>, <span class="hljs-number">0xa3</span>, <span class="hljs-number">0xc3</span>,
	  <span class="hljs-number">0xae</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xb6</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xb1</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xa5</span>, <span class="hljs-number">0xc4</span>,
	  <span class="hljs-number">0xbc</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xae</span>, <span class="hljs-number">0xc5</span>, <span class="hljs-number">0xbe</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xa5</span>, <span class="hljs-number">0xc5</span>,
	  <span class="hljs-number">0xa3</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xae</span>, <span class="hljs-number">0xe1</span>, <span class="hljs-number">0xbb</span>, <span class="hljs-number">0x9d</span>, <span class="hljs-number">0xc3</span>, <span class="hljs-number">0xb1</span>,
	];

	<span class="hljs-keyword">var</span> funnyWord = utf8.decode(utf8Bytes);

	<span class="hljs-keyword">assert</span>(funnyWord == <span class="hljs-string">'Îñţérñåţîöñåļîžåţîờñ'</span>);
}</code></span></pre>


<p class="wp-block-paragraph">Décodage UTF-8 en continu (pour fichiers / flux réseau)</p>



<p class="wp-block-paragraph">Utilisez <code>utf8.decoder</code> associé à <code>Stream.transform()</code>. Ajoutez <code>LineSplitter</code> pour lire le contenu ligne par ligne :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">var</span> lines = utf8.decoder.bind(inputStream).transform(<span class="hljs-keyword">const</span> LineSplitter());
<span class="hljs-keyword">try</span> {
  <span class="hljs-keyword">await</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">final</span> line <span class="hljs-keyword">in</span> lines) {
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'Got <span class="hljs-subst">${line.length}</span> characters from stream'</span>);
  }
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'file is now closed'</span>);
} <span class="hljs-keyword">catch</span> (e) {
  <span class="hljs-built_in">print</span>(e);
}</code></span></pre>


<p class="wp-block-paragraph">utf8.encode() : Chaîne → Tableau d&rsquo;octets UTF-8 (Uint8List)</p>


<pre class="wp-block-code"><span><code class="hljs language-dart">Uint8List encoded = utf8.encode(<span class="hljs-string">'Îñţérñåţîöñåļîžåţîờñ'</span>);

<span class="hljs-keyword">assert</span>(encoded.length == utf8Bytes.length);
<span class="hljs-keyword">for</span> (<span class="hljs-built_in">int</span> i = <span class="hljs-number">0</span>; i &lt; encoded.length; i++) {
  <span class="hljs-keyword">assert</span>(encoded&#91;i] == utf8Bytes&#91;i]);
}</code></span></pre>


<p class="wp-block-paragraph">Bibliothèque dart:convert</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/bibliotheque-dartconvert/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>La bibliothèque dart:math</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/la-bibliotheque-dartmath/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/la-bibliotheque-dartmath/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 02:17:00 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6917</guid>

					<description><![CDATA[Dart propose plusieurs bibliothèques natives que nous pouvons utiliser pour réaliser diverses fonctionnalités, notamment une bibliothèque dédiée aux calculs mathématiques. Constantes courantes Fonctions trigonométriques sin() cos() tan() Paramètres : radians. ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dart propose plusieurs bibliothèques natives que nous pouvons utiliser pour réaliser diverses fonctionnalités, notamment une bibliothèque dédiée aux calculs mathématiques.</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:math'</span>;</code></span></pre>


<p class="wp-block-paragraph">Constantes courantes</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">print</span>(pi);      <span class="hljs-comment">// 3,141592653589793 nombre pi</span>
<span class="hljs-keyword">print</span>(e);       <span class="hljs-comment">// 2,718281828459045 nombre d'Euler</span>
<span class="hljs-keyword">print</span>(sqrt2);   <span class="hljs-comment">// √2 ≈1,4142</span></code></span></pre>


<p class="wp-block-paragraph">Fonctions trigonométriques</p>



<p class="wp-block-paragraph"><code>sin() cos() tan()</code> Paramètres : radians. Conversion degrés <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> radians : <code>radians = degrés × pi / 180</code></p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> trigDemo() {
  <span class="hljs-keyword">assert</span>(cos(pi) == <span class="hljs-number">-1.0</span>);

  <span class="hljs-built_in">int</span> degrees = <span class="hljs-number">30</span>;
  <span class="hljs-built_in">double</span> radians = degrees * pi / <span class="hljs-number">180</span>;
  <span class="hljs-built_in">double</span> result = sin(radians);
  <span class="hljs-comment">// Ne pas comparer directement les nombres à virgule flottante avec ==, utilisez la valeur absolue de la différence</span>
  <span class="hljs-keyword">assert</span>((result - <span class="hljs-number">0.5</span>).abs() &lt; <span class="hljs-number">0.01</span>);
}</code></span></pre>


<p class="wp-block-paragraph">Valeur maximale / minimale</p>


<pre class="wp-block-code"><span><code class="hljs">assert(max(1, 1000) == 1000);
assert(min(1, -1000) == -1000);</code></span></pre>


<p class="wp-block-paragraph">Nombres aléatoires Random</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> randomDemo() {
  <span class="hljs-keyword">final</span> rand = Random();
  <span class="hljs-built_in">double</span> d = rand.nextDouble();   <span class="hljs-comment">// &#91;0.0, 1.0)</span>
  <span class="hljs-built_in">int</span> i = rand.nextInt(<span class="hljs-number">10</span>);       <span class="hljs-comment">// 0 ~ 9</span>
  <span class="hljs-built_in">bool</span> b = rand.nextBool();       <span class="hljs-comment">// true / false</span>

  <span class="hljs-comment">// Générateur sécurisé pour mots de passe et clés cryptographiques</span>
  <span class="hljs-keyword">final</span> secureRand = Random.secure();
}</code></span></pre>


<p class="wp-block-paragraph">Fonctions usuelles</p>


<pre class="wp-block-code"><span><code class="hljs language-dart">sqrt(<span class="hljs-number">9</span>);      <span class="hljs-comment">// Racine carrée 3.0</span>
pow(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>);    <span class="hljs-comment">// Puissance 2^3=8.0</span>
log(e);       <span class="hljs-comment">// Logarithme népérien</span>
atan2(y, x);  <span class="hljs-comment">// Arc tangente, utile pour calculer des angles dans un repère</span></code></span></pre>


<p class="wp-block-paragraph">Exemple complet</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'dart:math'</span>;

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-comment">// Constantes</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'pi = <span class="hljs-subst">$pi</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'e = <span class="hljs-subst">$e</span>'</span>);

  <span class="hljs-comment">// Fonctions trigonométriques</span>
  <span class="hljs-keyword">final</span> rad30 = <span class="hljs-number">30</span> * pi / <span class="hljs-number">180</span>;
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'sin30° = <span class="hljs-subst">${sin(rad30)}</span>'</span>);

  <span class="hljs-comment">// max min</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'max(2,9) = <span class="hljs-subst">${max(<span class="hljs-number">2</span>,<span class="hljs-number">9</span>)}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'min(2,9) = <span class="hljs-subst">${min(<span class="hljs-number">2</span>,<span class="hljs-number">9</span>)}</span>'</span>);

  <span class="hljs-comment">// Valeurs aléatoires</span>
  <span class="hljs-keyword">final</span> r = Random();
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Entier aléatoire 0~9：<span class="hljs-subst">${r.nextInt(<span class="hljs-number">10</span>)}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'&#91;0,1) flottant：<span class="hljs-subst">${r.nextDouble()}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Booléen aléatoire：<span class="hljs-subst">${r.nextBool()}</span>'</span>);
}</code></span></pre>


<p class="wp-block-paragraph">Exécuter l’exemple</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">D:\dartdemo\firstdart&gt;dart run
Building package executable...
Built firstdart:firstdart.
pi = <span class="hljs-number">3.141592653589793</span>
e = <span class="hljs-number">2.718281828459045</span>
sin30° = <span class="hljs-number">0.49999999999999994</span>
max(<span class="hljs-number">2</span>,<span class="hljs-number">9</span>) = <span class="hljs-number">9</span>
min(<span class="hljs-number">2</span>,<span class="hljs-number">9</span>) = <span class="hljs-number">2</span>
Entier aléatoire <span class="hljs-number">0</span>~<span class="hljs-number">9</span>：<span class="hljs-number">9</span>
&#91;<span class="hljs-number">0</span>,<span class="hljs-number">1</span>) flottant：<span class="hljs-number">0.08331912429354282</span>
Booléen aléatoire：<span class="hljs-literal">false</span></code></span></pre>


<p class="wp-block-paragraph">La bibliothèque dart:math</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/la-bibliotheque-dartmath/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Class Modifiers Modificateurs de classe</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/class-modifiers-modificateurs-de-classe/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/class-modifiers-modificateurs-de-classe/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 01:33:45 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6887</guid>

					<description><![CDATA[Contrôler les droits d’héritage, d’implémentation et d’instanciation des classes depuis les bibliothèques externes et restreindre les corps de type Ordre des modificateurs [abstract] [base/interface/final/sealed] [mixin] class ; certains modificateurs sont ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Contrôler les droits d’héritage, d’implémentation et d’instanciation des classes depuis les <strong>bibliothèques externes</strong> et restreindre les corps de type</p>



<p class="wp-block-paragraph">Ordre des modificateurs <code>[abstract] [base/interface/final/sealed] [mixin] class</code> ; certains modificateurs sont mutuellement exclusifs</p>



<h4 class="wp-block-heading">1. Sans modificateur</h4>



<p class="wp-block-paragraph">Toute bibliothèque peut instancier, hériter ou implémenter</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// a.dart</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Vehicle</span> </span>{
  <span class="hljs-keyword">void</span> move() {}
}

<span class="hljs-comment">// b.dart</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'a.dart'</span>;
Vehicle v = Vehicle();
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Vehicle</span> </span>{}
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Mock</span> <span class="hljs-title">implements</span> <span class="hljs-title">Vehicle</span> </span>{}
</code></span></pre>


<h4 class="wp-block-heading">2. abstract classe abstraite</h4>



<p class="wp-block-paragraph"><strong>Impossible à instancier</strong> ; le code externe peut utiliser extends /implements</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">abstract <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Vehicle</span> </span>{
  <span class="hljs-keyword">void</span> move(); <span class="hljs-comment">// méthode abstraite</span>
}

<span class="hljs-comment">// Valide</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Vehicle</span> </span>{
  @override <span class="hljs-keyword">void</span> move() {}
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Mock</span> <span class="hljs-title">implements</span> <span class="hljs-title">Vehicle</span> </span>{
  @override <span class="hljs-keyword">void</span> move() {}
}

<span class="hljs-comment">// Vehicle(); // Erreur, instanciation interdite</span>
</code></span></pre>


<h4 class="wp-block-heading">3. base class</h4>



<p class="wp-block-paragraph">√ Autorisé new｜√ extends externe autorisé｜× implements externe interdit</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Garantit que les sous-classes héritent bien de l’implémentation de la classe parente et empêche les fausses implémentations externes</p>



<p class="wp-block-paragraph"></p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// lib/a.dart</span>
base <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Vehicle</span> </span>{
  <span class="hljs-keyword">void</span> move() =&gt; print(<span class="hljs-string">"move"</span>);
}

<span class="hljs-comment">// main.dart</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'a.dart'</span>;
Vehicle v = Vehicle();

base <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Vehicle</span> </span>{} <span class="hljs-comment">// √ Héritage nécessite base/final/sealed</span>

<span class="hljs-comment">// class Mock implements Vehicle {} // × Implémentation externe interdite</span>
</code></span></pre>


<h4 class="wp-block-heading">4. interface class</h4>



<p class="wp-block-paragraph">√ Autorisé new｜× extends externe interdit｜√ implements externe autorisé</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// a.dart</span>
<span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">class</span> <span class="hljs-title">Vehicle</span> </span>{
  void move() =&gt; <span class="hljs-keyword">print</span>(<span class="hljs-string">"move"</span>);
}

<span class="hljs-comment">// main.dart</span>
import <span class="hljs-string">'a.dart'</span>;
Vehicle v = Vehicle();

<span class="hljs-comment">// class Car extends Vehicle {} // × Héritage externe interdit</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Mock</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Vehicle</span> </span>{ <span class="hljs-comment">// √ Implémentation autorisée</span>
  @override void move() {}
}
</code></span></pre>


<h4 class="wp-block-heading">abstract interface</h4>



<p class="wp-block-paragraph">Interface pure, très utilisée</p>



<p class="wp-block-paragraph">Ne peut pas être instanciée ; seul implements est autorisé depuis l’extérieur</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">class</span> <span class="hljs-title">Vehicle</span> </span>{
  void move();
}
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Mock</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Vehicle</span> </span>{
  @override void move() {}
}
</code></span></pre>


<h4 class="wp-block-heading">5. final class</h4>



<p class="wp-block-paragraph">√ Autorisé new｜× extends externe interdit｜× implements externe interdit</p>



<p class="wp-block-paragraph">Aucune dérivation externe possible, garantit une API publique stable</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// a.dart</span>
final <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Vehicle</span> </span>{}

<span class="hljs-comment">// main.dart</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'a.dart'</span>;
Vehicle v = Vehicle();
<span class="hljs-comment">// class Car extends Vehicle {}    // <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
<span class="hljs-comment">// class Mock implements Vehicle{} // <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>
</code></span></pre>


<h4 class="wp-block-heading">6. sealed class (classe scellée)</h4>



<p class="wp-block-paragraph">× Interdit new｜× extends/implements externes interdits ; <strong>les sous-classes doivent figurer dans le même fichier</strong></p>



<p class="wp-block-paragraph">Le compilateur identifie toutes les sous-classes directes et impose une correspondance exhaustive dans les switch</p>


<pre class="wp-block-code"><span><code class="hljs language-php">sealed <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Vehicle</span> </span>{}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Vehicle</span> </span>{}
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Bike</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Vehicle</span> </span>{}

void test(Vehicle v) {
  <span class="hljs-keyword">switch</span>(v) {
    <span class="hljs-keyword">case</span> Car(): <span class="hljs-keyword">print</span>(<span class="hljs-string">"car"</span>);
    <span class="hljs-keyword">case</span> Bike(): <span class="hljs-keyword">print</span>(<span class="hljs-string">"bike"</span>);
  }
}
<span class="hljs-comment">// Vehicle(); // <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> sealed est implicitement abstract, instanciation impossible</span>
</code></span></pre>


<h4 class="wp-block-heading">Exclusions mutuelles</h4>



<ol class="wp-block-list">
<li><code>sealed</code> + <code>abstract</code> : sealed comporte déjà abstract, combinaison interdite</li>



<li><code>interface/final/sealed</code> + <code>mixin</code> : association impossible</li>



<li>Impossible de déclarer simultanément base /interface/final /sealed au même niveau</li>
</ol>



<p class="wp-block-paragraph">Class Modifiers Modificateurs de classe</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/class-modifiers-modificateurs-de-classe/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Extension Types</title>
		<link>https://www.foxdevelop.com/fr/2026/07/31/extension-types-6/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/31/extension-types-6/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 31 Jul 2026 01:07:29 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6867</guid>

					<description><![CDATA[Encapsulé à la compilation, sans objet supplémentaire à l’exécution (aucun surcoût). Il permet d’attribuer une nouvelle interface statique aux types existants et de limiter les méthodes accessibles. Différence avec les ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Encapsulé à la compilation, sans objet supplémentaire à l’exécution (aucun surcoût). Il permet d’attribuer une nouvelle interface statique aux types existants et de limiter les méthodes accessibles.</strong> </p>



<p class="wp-block-paragraph">Différence avec les Extensions classiques : les extensions standards ajoutent des méthodes à toutes les instances du type de base ; un Extension Type ne s’applique que quand le <strong>type statique correspond à ce type d’extension</strong>.</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-comment">// int est le type de représentation, id désigne la valeur brute sous-jacente</span>
<span class="hljs-keyword">extension</span> type IdNumber(<span class="hljs-built_in">int</span> id) {
  <span class="hljs-keyword">operator</span> &lt;(IdNumber other) =&gt; id &lt; other.id;
}</code></span></pre>


<p class="wp-block-paragraph">Éléments générés automatiquement :</p>



<ol class="wp-block-list">
<li>Constructeur implicite <code>IdNumber(int id)</code></li>



<li>Getter : <code>int get id</code></li>
</ol>



<h3 class="wp-block-heading">Deux modes principaux (les plus utilisés)</h3>



<h4 class="wp-block-heading">1) Mode opaque</h4>



<p class="wp-block-paragraph">Interface isolée｜Conseillé pour les contraintes métier</p>



<p class="wp-block-paragraph">Ne pas écrire le mot-clé <code>implements</code> </p>



<p class="wp-block-paragraph">Masque les méthodes du type sous-jacent pour appliquer des restrictions d’interface </p>



<p class="wp-block-paragraph">Aucune affectation directe autorisée entre ce type et le type de base</p>


<pre class="wp-block-code"><span><code class="hljs language-php">extension type IdNumber(int id) {
  operator &lt;(IdNumber other) =&gt; id &lt; other.id;
}

void main() {
  <span class="hljs-keyword">final</span> id = IdNumber(<span class="hljs-number">100</span>);
  id + <span class="hljs-number">5</span>;          <span class="hljs-comment">// Erreur compilation : pas d'opérateur +, l'addition int est masquée</span>
  <span class="hljs-keyword">final</span> int raw = id; <span class="hljs-comment">// Erreur, affectation directe interdite</span>
  <span class="hljs-keyword">final</span> int raw = id <span class="hljs-keyword">as</span> int; <span class="hljs-comment">// Cast explicite pour récupérer la valeur brute</span>
}</code></span></pre>


<h4 class="wp-block-heading">2) Mode transparent</h4>



<p class="wp-block-paragraph"><code>implements type-de-représentation</code></p>



<p class="wp-block-paragraph">Hérite automatiquement de tous les membres du type sous-jacent ; seul l’ajout ou la redéfinition de méthodes est permis</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">extension</span> type Num(<span class="hljs-built_in">int</span> v) <span class="hljs-keyword">implements</span> <span class="hljs-built_in">int</span> {
  Num square() =&gt; Num(v * v);
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-keyword">final</span> n = Num(<span class="hljs-number">5</span>);
  <span class="hljs-built_in">print</span>(n.isNegative); <span class="hljs-comment">// Les méthodes natives de int sont directement exploitables</span>
}</code></span></pre>


<h4 class="wp-block-heading">Utilisation des constructeurs</h4>



<p class="wp-block-paragraph">Le paramètre entre parenthèses constitue le constructeur par défaut, il peut être masqué en mode privé grâce à <code>._</code></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">extension type Id._(int _raw) {
  <span class="hljs-comment">// Le code externe ne peut utiliser que ce constructeur nommé ; appel direct Id(xxx) interdit</span>
  Id.create(int value) : _raw = value;
}</code></span></pre>


<p class="wp-block-paragraph">Éléments autorisés : méthodes, getters, setters, opérateurs </p>



<p class="wp-block-paragraph">Éléments interdits : variables d’instance, membres abstraits</p>



<p class="wp-block-paragraph">Extension Types</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/31/extension-types-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Méthodes d’extension (Extension methods)</title>
		<link>https://www.foxdevelop.com/fr/2026/07/30/methodes-dextension-extension-methods/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/30/methodes-dextension-extension-methods/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Thu, 30 Jul 2026 13:40:36 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6846</guid>

					<description><![CDATA[Les méthodes d’extension permettent d’ajouter de nouvelles fonctionnalités à des types existants et des types de bibliothèques tierces sans modifier le code source des classes d’origine. L’autocomplétion de l’IDE propose ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Les méthodes d’extension permettent d’ajouter de nouvelles fonctionnalités à des <strong>types existants et des types de bibliothèques tierces</strong> sans modifier le code source des classes d’origine. L’autocomplétion de l’IDE propose les méthodes d’extension au même rang que les méthodes natives.</p>



<p class="wp-block-paragraph">Vous ne pouvez pas modifier les API fournies par des tiers, mais vous aimeriez ajouter des méthodes utilitaires pratiques.</p>



<p class="wp-block-paragraph">Exemple de besoin : utiliser <code>'42'.parseInt()</code> au lieu de <code>int.parse('42')</code>.</p>



<p class="wp-block-paragraph">Structure syntaxique</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">extension NomExtension? on TypeCible {
  <span class="hljs-comment">// Méthodes, getters, setters, opérateurs, membres statiques</span>
}</code></span></pre>


<p class="wp-block-paragraph">Exemple</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-comment">// Mettez tout dans un seul fichier, aucune séparation requise, main s’exécute directement</span>
<span class="hljs-keyword">extension</span> NumberParsing <span class="hljs-keyword">on</span> <span class="hljs-built_in">String</span> {
  <span class="hljs-built_in">int</span> parseInt() {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">int</span>.parse(<span class="hljs-keyword">this</span>);
  }

  <span class="hljs-built_in">double</span> parseDouble() {
    <span class="hljs-keyword">return</span> <span class="hljs-built_in">double</span>.parse(<span class="hljs-keyword">this</span>);
  }
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'42'</span>.parseInt());       <span class="hljs-comment">// 42</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'3.14'</span>.parseDouble());  <span class="hljs-comment">// 3.14</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'100'</span>.padLeft(<span class="hljs-number">6</span>));      <span class="hljs-comment">// Comparaison avec une méthode native de String</span>
}</code></span></pre>


<p class="wp-block-paragraph">Résultat de l’exécution</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">D</span>:\<span class="hljs-selector-tag">dartdemo</span>\<span class="hljs-selector-tag">firstdart</span>&gt;<span class="hljs-selector-tag">dart</span> <span class="hljs-selector-tag">run</span>
<span class="hljs-selector-tag">Building</span> <span class="hljs-selector-tag">package</span> <span class="hljs-selector-tag">executable</span>...
<span class="hljs-selector-tag">Built</span> <span class="hljs-selector-tag">firstdart</span><span class="hljs-selector-pseudo">:firstdart.</span>
42
3<span class="hljs-selector-class">.14</span>
   100</code></span></pre>


<p class="wp-block-paragraph">Le nom de l’extension est facultatif ; <code>this</code> représente l’instance qui appelle l’extension.</p>



<h3 class="wp-block-heading">Types de membres pris en charge par les extensions</h3>



<p class="wp-block-paragraph">Dans une extension, vous pouvez définir : méthodes d’instance, getters, setters, opérateurs et membres statiques.</p>


<pre class="wp-block-code"><span><code class="hljs language-php">extension StringExt on String {
  <span class="hljs-comment">// getter</span>
  bool get isEmptyOrBlank =&gt; trim().isEmpty;

  <span class="hljs-comment">// Méthode d’instance</span>
  String repeat(int count) =&gt; <span class="hljs-keyword">List</span>.filled(count, this).join();

  <span class="hljs-comment">// Surcharge d’opérateur</span>
  String operator *(int count) =&gt; repeat(count);

  <span class="hljs-comment">// Membre statique (accessible via le nom de l’extension)</span>
  <span class="hljs-keyword">static</span> String emptyStr = <span class="hljs-string">''</span>;
  <span class="hljs-keyword">static</span> void printTip() =&gt; <span class="hljs-keyword">print</span>(<span class="hljs-string">"Méthode statique de l’extension chaîne"</span>);
}

void main() {
  <span class="hljs-keyword">var</span> str = <span class="hljs-string">" dart "</span>;
  <span class="hljs-keyword">print</span>(str.isEmptyOrBlank);
  <span class="hljs-keyword">print</span>(<span class="hljs-string">"hi"</span> * <span class="hljs-number">3</span>);
  <span class="hljs-keyword">print</span>(<span class="hljs-string">"hello"</span>.repeat(<span class="hljs-number">2</span>));

  <span class="hljs-comment">// Accès aux membres statiques</span>
  <span class="hljs-keyword">print</span>(StringExt.emptyStr);
  StringExt.printTip();
}</code></span></pre>


<p class="wp-block-paragraph">Résultat de l’exécution</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">D</span>:\<span class="hljs-selector-tag">dartdemo</span>\<span class="hljs-selector-tag">firstdart</span>&gt;<span class="hljs-selector-tag">dart</span> <span class="hljs-selector-tag">run</span>
<span class="hljs-selector-tag">Building</span> <span class="hljs-selector-tag">package</span> <span class="hljs-selector-tag">executable</span>...
<span class="hljs-selector-tag">Built</span> <span class="hljs-selector-tag">firstdart</span><span class="hljs-selector-pseudo">:firstdart.</span>
<span class="hljs-selector-tag">false</span>
<span class="hljs-selector-tag">hihihi</span>
<span class="hljs-selector-tag">hellohello</span>

<span class="hljs-selector-tag">M</span>é<span class="hljs-selector-tag">thode</span> <span class="hljs-selector-tag">statique</span> <span class="hljs-selector-tag">de</span> <span class="hljs-selector-tag">l</span>’<span class="hljs-selector-tag">extension</span> <span class="hljs-selector-tag">cha</span>î<span class="hljs-selector-tag">ne</span></code></span></pre>


<h3 class="wp-block-heading">Extensions sans nom (extensions anonymes)</h3>



<p class="wp-block-paragraph">Si vous ne spécifiez pas de nom d’extension, celle-ci n’est <strong>visible qu’au sein de la bibliothèque actuelle</strong>. Les conflits ne peuvent pas être résolus par appel explicite.</p>



<p class="wp-block-paragraph">Il est impossible de l’appeler depuis l’extérieur avec la syntaxe <code>NomExtension(instance)</code>.</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">extension</span> <span class="hljs-keyword">on</span> <span class="hljs-built_in">String</span> {
  <span class="hljs-built_in">bool</span> <span class="hljs-keyword">get</span> isBlank =&gt; trim().isEmpty;
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-built_in">print</span>(<span class="hljs-string">"   "</span>.isBlank); <span class="hljs-comment">// true</span>
}</code></span></pre>


<p class="wp-block-paragraph">Les membres statiques d’une extension anonyme ne sont utilisables qu’à l’intérieur de cette extension.</p>



<h4 class="wp-block-heading">Extensions génériques (Generic extensions)</h4>



<p class="wp-block-paragraph">Vous pouvez créer des extensions pour des types génériques, par exemple <code>List&lt;T></code></p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">extension</span> MyFancyList&lt;T&gt; <span class="hljs-keyword">on</span> <span class="hljs-built_in">List</span>&lt;T&gt; {
  <span class="hljs-built_in">int</span> <span class="hljs-keyword">get</span> doubleLength =&gt; length * <span class="hljs-number">2</span>;
  <span class="hljs-built_in">List</span>&lt;T&gt; <span class="hljs-keyword">operator</span> -() =&gt; reversed.toList();
  <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">List</span>&lt;T&gt;&gt; split(<span class="hljs-built_in">int</span> at) =&gt; &#91;sublist(<span class="hljs-number">0</span>, at), sublist(at)];
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; list = &#91;<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>];
  <span class="hljs-built_in">print</span>(list.doubleLength);          <span class="hljs-comment">// 8</span>
  <span class="hljs-built_in">print</span>(-list);                      <span class="hljs-comment">// &#91;4,3,2,1]</span>
  <span class="hljs-built_in">print</span>(list.split(<span class="hljs-number">2</span>));              <span class="hljs-comment">// &#91;&#91;1,2],&#91;3,4]]</span>
}</code></span></pre>


<p class="wp-block-paragraph">Résultat de l’exécution</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">D</span>:\<span class="hljs-selector-tag">dartdemo</span>\<span class="hljs-selector-tag">firstdart</span>&gt;<span class="hljs-selector-tag">dart</span> <span class="hljs-selector-tag">run</span>
<span class="hljs-selector-tag">Building</span> <span class="hljs-selector-tag">package</span> <span class="hljs-selector-tag">executable</span>...
<span class="hljs-selector-tag">Built</span> <span class="hljs-selector-tag">firstdart</span><span class="hljs-selector-pseudo">:firstdart.</span>
8
<span class="hljs-selector-attr">&#91;4, 3, 2, 1]</span>
<span class="hljs-selector-attr">&#91;&#91;1, 2]</span>, <span class="hljs-selector-attr">&#91;3, 4]</span>]</code></span></pre>


<h4 class="wp-block-heading">Type statique static vs dynamic</h4>



<h4 class="wp-block-heading">Les variables dynamic <strong>ne peuvent pas appeler les méthodes d’extension</strong></h4>



<p class="wp-block-paragraph">Les méthodes d’extension sont résolues de manière <strong>statique</strong>. Une variable dynamic dont le type n’est déterminé qu’à l’exécution ne parvient pas à trouver l’extension :</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">void</span> main() {
  dynamic d = <span class="hljs-string">'2'</span>;
  <span class="hljs-comment">// print(d.parseInt()); // Erreur NoSuchMethodError à l’exécution</span>

  <span class="hljs-keyword">var</span> v = <span class="hljs-string">'2'</span>;
  print(v.parseInt()); <span class="hljs-comment">// Le type est déduit comme String, fonctionne normalement</span>
}

extension NumberParsing on <span class="hljs-built_in">String</span> {
  int <span class="hljs-built_in">parseInt</span>() =&gt; int.parse(<span class="hljs-keyword">this</span>);
}</code></span></pre>


<p class="wp-block-paragraph">Cause : les méthodes d’extension sont liées au moment de la compilation selon le <strong>type statique</strong> de la variable, pas par recherche à l’exécution.</p>



<h3 class="wp-block-heading">Solutions aux conflits de noms d’API</h3>



<p class="wp-block-paragraph">Trois solutions existent lorsque plusieurs extensions possèdent des membres de même nom.</p>



<p class="wp-block-paragraph">1 : Masquer les extensions conflictuelles avec show / hide lors de l’import</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-comment">// string_apis.dart contient NumberParsing</span>
<span class="hljs-comment">// string_apis_2.dart contient NumberParsing2 qui définit aussi parseInt</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'string_apis.dart'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'string_apis_2.dart'</span> <span class="hljs-keyword">hide</span> NumberParsing2;

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'42'</span>.parseInt()); <span class="hljs-comment">// Utilise l’implémentation de string_apis.dart</span>
}</code></span></pre>


<p class="wp-block-paragraph">2 : Appel explicite de l’extension (syntaxe d’encapsulation)</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'string_apis.dart'</span>;    <span class="hljs-comment">// NumberParsing</span>
<span class="hljs-keyword">import</span> <span class="hljs-string">'string_apis_2.dart'</span>;  <span class="hljs-comment">// NumberParsing2</span>

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-comment">// print('42'.parseInt()); // Conflit, erreur de compilation</span>
  <span class="hljs-built_in">print</span>(NumberParsing(<span class="hljs-string">'42'</span>).parseInt());
  <span class="hljs-built_in">print</span>(NumberParsing2(<span class="hljs-string">'42'</span>).parseInt());
}</code></span></pre>


<p class="wp-block-paragraph">3 : Importer la bibliothèque avec un préfixe</p>



<p class="wp-block-paragraph">Utilisez un préfixe pour distinguer deux extensions portant exactement le même nom :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'string_apis.dart'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'string_apis_3.dart'</span> <span class="hljs-keyword">as</span> rad;

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-built_in">print</span>(NumberParsing(<span class="hljs-string">'42'</span>).parseInt());
  <span class="hljs-built_in">print</span>(rad.NumberParsing(<span class="hljs-string">'42'</span>).parseInt());

  <span class="hljs-comment">// Les méthodes d’extension sans conflit restent appelables implicitement</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'42'</span>.parseNum());
}</code></span></pre>


<p class="wp-block-paragraph">Méthodes d’extension (Extension methods)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/30/methodes-dextension-extension-methods/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dot shorthands (abréviations par point)</title>
		<link>https://www.foxdevelop.com/fr/2026/07/30/dot-shorthands-abreviations-par-point/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/30/dot-shorthands-abreviations-par-point/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Thu, 30 Jul 2026 12:28:25 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6825</guid>

					<description><![CDATA[La syntaxe abrégée par point .foo permet d’omettre le nom du type. Si le compilateur peut déduire le type cible à partir du contexte, vous pouvez écrire du code Dart ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">La syntaxe abrégée par point <code>.foo</code> permet d’omettre le nom du type. Si le compilateur peut déduire le type cible à partir du contexte, vous pouvez écrire du code Dart plus concis. Il n’est pas nécessaire d’écrire intégralement <code>Type.foo</code> pour accéder aux valeurs d’énumération, aux membres statiques ou aux constructeurs.</p>



<p class="wp-block-paragraph">En résumé : l’abréviation par point autorise les expressions débutant sous ces formes, sur lesquelles on peut chaîner d’autres opérations :</p>



<ul class="wp-block-list">
<li>Identifiant <code>.myValue</code></li>



<li>Constructeur <code>.new()</code></li>



<li>Création de constante <code>const .myValue()</code></li>
</ul>



<p class="wp-block-paragraph">Exemples</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">enum</span> Status { none, running, stopped, paused }

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Point</span> </span>{
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> x, y;
  Point(<span class="hljs-keyword">this</span>.x, <span class="hljs-keyword">this</span>.y);
  Point.origin() : x = <span class="hljs-number">0</span>, y = <span class="hljs-number">0</span>;
}


<span class="hljs-keyword">void</span> main() {
    <span class="hljs-comment">// Abréviation pour constructeur nommé</span>
    Point origin = .origin(); <span class="hljs-comment">// Équivaut à Point.origin()</span>
  
    <span class="hljs-comment">// Abréviation pour énumération</span>
	Status currentStatus = .running; <span class="hljs-comment">// Équivaut à Status.running</span>

	<span class="hljs-comment">// Abréviation pour méthode statique</span>
	<span class="hljs-built_in">int</span> port = .parse(<span class="hljs-string">'8080'</span>); <span class="hljs-comment">// Équivaut à int.parse('8080')</span>

}</code></span></pre>


<h4 class="wp-block-heading">Type contextuel (Context type)</h4>



<p class="wp-block-paragraph">L’abréviation par point repose sur le<strong>type contextuel</strong> afin que le compilateur déduise le membre de type correspondant.</p>



<p class="wp-block-paragraph">Type contextuel : c’est le type que Dart attend à cet emplacement, selon la position de l’expression.</p>



<p class="wp-block-paragraph">Exemple : <code>Status currentStatus = .running</code></p>



<p class="wp-block-paragraph">Le compilateur sait que la variable doit être de type <code>Status</code>, il interprète donc <code>.running</code> comme <code>Status.running</code>.</p>



<h4 class="wp-block-heading">Structure lexicale et syntaxe</h4>



<p class="wp-block-paragraph">L’abréviation des membres statiques est une expression<strong>commençant par <code>.</code></strong>. Quand le contexte permet de déterminer le type, on peut accéder de manière abrégée aux membres statiques, constructeurs et constantes d’énumération.</p>



<h4 class="wp-block-heading">Cas d’utilisation</h4>



<h4 class="wp-block-heading">1. Énumérations</h4>



<p class="wp-block-paragraph">Lors des affectations ou des correspondances switch, le type d’énumération est bien défini, c’est un cas idéal pour cette abréviation :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">enum</span> LogLevel { debug, info, warning, error }

<span class="hljs-built_in">String</span> colorCode(LogLevel level) {
  <span class="hljs-keyword">return</span> <span class="hljs-keyword">switch</span> (level) {
    .debug =&gt; <span class="hljs-string">'gray'</span>,
    .info =&gt; <span class="hljs-string">'blue'</span>,
    .warning =&gt; <span class="hljs-string">'orange'</span>,
    .error =&gt; <span class="hljs-string">'red'</span>,
  };
}

<span class="hljs-keyword">void</span> main() {
   <span class="hljs-comment">// Appel</span>
   <span class="hljs-built_in">String</span> warnColor = colorCode(.warning); <span class="hljs-comment">// Reconnaît automatiquement LogLevel.warning</span>
}</code></span></pre>


<h4 class="wp-block-heading">2. Constructeur nommé / constructeur usine</h4>



<p class="wp-block-paragraph">Prend en charge le passage des paramètres de type aux constructeurs de classes génériques :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Point</span> </span>{
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">double</span> x, y;
  <span class="hljs-keyword">const</span> Point(<span class="hljs-keyword">this</span>.x, <span class="hljs-keyword">this</span>.y);
  <span class="hljs-keyword">const</span> Point.origin() : x = <span class="hljs-number">0</span>, y = <span class="hljs-number">0</span>;

  <span class="hljs-keyword">factory</span> Point.fromList(<span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">double</span>&gt; list) =&gt; Point(list&#91;<span class="hljs-number">0</span>], list&#91;<span class="hljs-number">1</span>]);
}



<span class="hljs-keyword">void</span> main() {
    Point origin = .origin();
	Point p1 = .fromList(&#91;<span class="hljs-number">1.0</span>, <span class="hljs-number">2.0</span>]);

	<span class="hljs-comment">// Classe générique</span>
	<span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; intList = .filled(<span class="hljs-number">5</span>, <span class="hljs-number">0</span>); <span class="hljs-comment">// List.filled(5,0)</span>
}</code></span></pre>


<h4 class="wp-block-heading">3. Constructeur sans paramètre <code>.new</code></h4>



<p class="wp-block-paragraph"><code>.new</code> permet d’appeler de manière abrégée le constructeur anonyme par défaut de la classe. Pratique pour initialiser de nombreux champs dans des classes d’état, et déduit automatiquement les paramètres génériques :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-comment">// Sans abréviation</span>
late <span class="hljs-keyword">final</span> AnimationController _animationController = AnimationController(vsync: <span class="hljs-keyword">this</span>);
<span class="hljs-keyword">final</span> ScrollController _scrollController = ScrollController();

<span class="hljs-comment">// Avec abréviation</span>
late <span class="hljs-keyword">final</span> AnimationController _animationController = .<span class="hljs-keyword">new</span>(vsync: <span class="hljs-keyword">this</span>);
<span class="hljs-keyword">final</span> ScrollController _scrollController = .<span class="hljs-keyword">new</span>();
<span class="hljs-keyword">final</span> GlobalKey&lt;ScaffoldMessengerState&gt; scaffoldKey = .<span class="hljs-keyword">new</span>();
<span class="hljs-built_in">Map</span>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Map</span>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">bool</span>&gt;&gt; properties = .<span class="hljs-keyword">new</span>();</code></span></pre>


<h4 class="wp-block-heading">4 Membres statiques (méthodes statiques, champs statiques)</h4>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-built_in">int</span> httpPort = .parse(<span class="hljs-string">'80'</span>);        <span class="hljs-comment">// int.parse('80')</span>
BigInt bigIntZero = .zero;          <span class="hljs-comment">// BigInt.zero</span></code></span></pre>


<h4 class="wp-block-heading">5 Expressions constantes</h4>



<p class="wp-block-paragraph">Dans un contexte constant, l’abréviation fonctionne si le membre cible est une constante de compilation :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">enum</span> Status { none, running }
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Point</span> </span>{
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">double</span> x, y;
  <span class="hljs-keyword">const</span> Point(<span class="hljs-keyword">this</span>.x, <span class="hljs-keyword">this</span>.y);
  <span class="hljs-keyword">const</span> Point.origin() : x = <span class="hljs-number">0.0</span>, y = <span class="hljs-number">0.0</span>;
}

<span class="hljs-keyword">const</span> Status defaultStatus = .running;
<span class="hljs-keyword">const</span> Point myOrigin = .origin();
<span class="hljs-keyword">const</span> <span class="hljs-built_in">List</span>&lt;Point&gt; keyPoints = &#91;.origin(), .<span class="hljs-keyword">new</span>(<span class="hljs-number">1.0</span>, <span class="hljs-number">1.0</span>)];</code></span></pre>


<h3 class="wp-block-heading">Chaînage d’appels</h3>



<p class="wp-block-paragraph">Vous pouvez chaîner des méthodes ou propriétés d’instance après une abréviation. Le compilateur résout d’abord la cible de l’abréviation grâce au contexte, et la valeur renvoyée par les appels chaînés doit être compatible au niveau du type :</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">String</span> lowerH = .fromCharCode(<span class="hljs-number">72</span>).toLowerCase();
<span class="hljs-comment">// String.fromCharCode(72).toLowerCase()</span>
print(lowerH); <span class="hljs-comment">// h</span></code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">void</span> main() {
    <span class="hljs-built_in">String</span> lowerH = .fromCharCode(<span class="hljs-number">72</span>).toLowerCase();
	<span class="hljs-comment">// String.fromCharCode(72).toLowerCase()</span>
	<span class="hljs-built_in">print</span>(lowerH); <span class="hljs-comment">// h</span>
}</code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">D</span>:\<span class="hljs-selector-tag">dartdemo</span>\<span class="hljs-selector-tag">firstdart</span>&gt;<span class="hljs-selector-tag">dart</span> <span class="hljs-selector-tag">run</span>
<span class="hljs-selector-tag">Building</span> <span class="hljs-selector-tag">package</span> <span class="hljs-selector-tag">executable</span>...
<span class="hljs-selector-tag">Built</span> <span class="hljs-selector-tag">firstdart</span><span class="hljs-selector-pseudo">:firstdart.</span>
<span class="hljs-selector-tag">h</span>
</code></span></pre>


<p class="wp-block-paragraph">Dot shorthands (abréviations par point)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/30/dot-shorthands-abreviations-par-point/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Énumérations</title>
		<link>https://www.foxdevelop.com/fr/2026/07/28/enumerations/</link>
					<comments>https://www.foxdevelop.com/fr/2026/07/28/enumerations/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 28 Jul 2026 13:14:19 +0000</pubDate>
				<category><![CDATA[Dart Tutoriel]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=6684</guid>

					<description><![CDATA[Le type énuméré est une classe spéciale destinée à représenter un ensemble de valeurs constantes en nombre fixe. Toutes les énumérations héritent automatiquement de la classe Enum. Par ailleurs, une ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Le type énuméré est une classe spéciale destinée à représenter <strong>un ensemble de valeurs constantes en nombre fixe</strong>.</p>



<p class="wp-block-paragraph">Toutes les énumérations héritent automatiquement de la classe <code>Enum</code>. Par ailleurs, une énumération est un type scellé (sealed) : <strong>il ne peut pas être hérité, implémenté, mixé, ni instancié explicitement manuellement</strong>.</p>



<p class="wp-block-paragraph">Les classes abstraites et les mixins peuvent implémenter ou hériter explicitement de <code>Enum</code>, mais il est impossible de créer des instances concrètes de ces classes ou mixins, à moins qu’une énumération ne déclare leur implémentation ou leur intégration.</p>



<p class="wp-block-paragraph">Utilisez le mot-clé <code>enum</code> et listez toutes les constantes de l’énumération pour définir une énumération simple :</p>


<pre class="wp-block-code"><span><code class="hljs">enum Color { red, green, blue }</code></span></pre>


<p class="wp-block-paragraph">Une virgule finale est autorisée lors de la déclaration d’une énumération ; cela facilite le copier-coller et limite les erreurs de code.</p>



<p class="wp-block-paragraph">Énumérations améliorées (Enhanced enums)</p>



<p class="wp-block-paragraph">Dart prend en charge les énumérations améliorées. Vous pouvez y définir <strong>des champs membres, des méthodes et des constructeurs constants</strong> comme dans une classe classique, mais ses instances ne peuvent être que les constantes fixes prédéfinies.</p>



<p class="wp-block-paragraph">La déclaration d’une énumération améliorée est soumise à un ensemble de règles obligatoires :</p>



<ol class="wp-block-list">
<li>Les variables d’instance doivent être déclarées <code>final</code> (y compris celles provenant des mixins)</li>



<li>Tous les constructeurs générateurs doivent porter le marqueur <code>const</code></li>



<li>Les constructeurs d’usine ne peuvent renvoyer que des instances constantes déjà définies au sein de l’énumération</li>



<li>Il est interdit d’hériter explicitement d’une autre classe (l’héritage de <code>Enum</code> se fait automatiquement)</li>



<li><strong>Il est impossible de redéfinir</strong> <code>index</code>, <code>hashCode</code> et l’opérateur d’égalité <code>==</code></li>



<li>Aucun membre nommé <code>values</code> ne peut être déclaré dans une énumération, car cela entrerait en conflit avec l’accesseur statique <code>values</code> généré automatiquement</li>



<li>Toutes les instances de l’énumération doivent figurer au tout début de sa définition, et au moins une instance est requise</li>



<li>Dans les méthodes d’instance d’une énumération améliorée, vous pouvez utiliser <code>this</code> pour faire référence à la constante d’énumération actuelle</li>
</ol>



<p class="wp-block-paragraph">Exemple</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">enum</span> Vehicle <span class="hljs-keyword">implements</span> <span class="hljs-built_in">Comparable</span>&lt;Vehicle&gt; {
  car(tires: <span class="hljs-number">4</span>, passengers: <span class="hljs-number">5</span>, carbonPerKilometer: <span class="hljs-number">400</span>),
  bus(tires: <span class="hljs-number">6</span>, passengers: <span class="hljs-number">50</span>, carbonPerKilometer: <span class="hljs-number">800</span>),
  bicycle(tires: <span class="hljs-number">2</span>, passengers: <span class="hljs-number">1</span>, carbonPerKilometer: <span class="hljs-number">0</span>);

  <span class="hljs-keyword">const</span> Vehicle({
    required <span class="hljs-keyword">this</span>.tires,
    required <span class="hljs-keyword">this</span>.passengers,
    required <span class="hljs-keyword">this</span>.carbonPerKilometer,
  });

  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> tires;
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> passengers;
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> carbonPerKilometer;

  <span class="hljs-comment">// Getter</span>
  <span class="hljs-built_in">int</span> <span class="hljs-keyword">get</span> carbonFootprint =&gt; (carbonPerKilometer / passengers).round();
  <span class="hljs-built_in">bool</span> <span class="hljs-keyword">get</span> isTwoWheeled =&gt; <span class="hljs-keyword">this</span> == Vehicle.bicycle;

  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">int</span> compareTo(Vehicle other) =&gt; carbonFootprint - other.carbonFootprint;
}</code></span></pre>


<p class="wp-block-paragraph">À partir de Dart 3.13+, les <strong>constructeurs principaux</strong> simplifient la syntaxe des énumérations améliorées :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">enum</span> Vehicle(
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> tires,
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> passengers,
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> carbonPerKilometer,
) <span class="hljs-keyword">implements</span> <span class="hljs-built_in">Comparable</span>&lt;Vehicle&gt; {
  car(<span class="hljs-number">4</span>, <span class="hljs-number">5</span>, <span class="hljs-number">400</span>),
  bus(<span class="hljs-number">6</span>, <span class="hljs-number">50</span>, <span class="hljs-number">800</span>),
  bicycle(<span class="hljs-number">2</span>, <span class="hljs-number">1</span>, <span class="hljs-number">0</span>);

  <span class="hljs-built_in">int</span> <span class="hljs-keyword">get</span> carbonFootprint =&gt; (carbonPerKilometer / passengers).round();
  <span class="hljs-built_in">bool</span> <span class="hljs-keyword">get</span> isTwoWheeled =&gt; <span class="hljs-keyword">this</span> == Vehicle.bicycle;

  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">int</span> compareTo(Vehicle other) =&gt; carbonFootprint - other.carbonFootprint;
}</code></span></pre>


<h4 class="wp-block-heading">Utiliser une énumération</h4>



<p class="wp-block-paragraph">L’accès aux constantes d’énumération s’effectue de la même manière que pour les variables statiques :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">final</span> favoriteColor = Color.blue;
<span class="hljs-keyword">if</span> (favoriteColor == Color.blue) {
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Votre couleur favorite est le bleu !'</span>);
}</code></span></pre>


<h4 class="wp-block-heading">Propriété index</h4>



<p class="wp-block-paragraph">Chaque constante d’énumération possède une propriété <code>index</code> qui renvoie <strong>son numéro d’ordre commençant à 0</strong> dans la définition de l’énumération :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">assert</span>(Color.red.index == <span class="hljs-number">0</span>);
<span class="hljs-keyword">assert</span>(Color.green.index == <span class="hljs-number">1</span>);
<span class="hljs-keyword">assert</span>(Color.blue.index == <span class="hljs-number">2</span>);</code></span></pre>


<h4 class="wp-block-heading">Constante statique values</h4>



<p class="wp-block-paragraph">Récupérez la liste regroupant toutes les valeurs de l’énumération via <code>NomEnumeration.values</code> :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-built_in">List</span>&lt;Color&gt; colors = Color.values;
<span class="hljs-keyword">assert</span>(colors&#91;<span class="hljs-number">2</span>] == Color.blue);</code></span></pre>


<p class="wp-block-paragraph">Associer une énumération à l’instruction switch</p>



<p class="wp-block-paragraph">Lorsque vous utilisez une énumération dans un <code>switch</code>, le compilateur affichera un avertissement si vous ne couvrez pas toutes les branches possibles. Vous pouvez utiliser une clause <code>default</code> pour gérer les cas restants.</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">var</span> aColor = Color.blue;

<span class="hljs-keyword">switch</span> (aColor) {
  <span class="hljs-keyword">case</span> Color.red:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'Rouge comme une rose !'</span>);
  <span class="hljs-keyword">case</span> Color.green:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">'Vert comme l\'herbe !'</span>);
  <span class="hljs-keyword">default</span>:
    <span class="hljs-built_in">print</span>(aColor); <span class="hljs-comment">// Color.blue</span>
}</code></span></pre>


<h4 class="wp-block-heading">Propriété name</h4>



<p class="wp-block-paragraph">Obtenez le nom de chaîne correspondant à une constante d’énumération grâce à <code>.name</code> :</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-built_in">print</span>(Color.blue.name); <span class="hljs-comment">// Affiche "blue"</span></code></span></pre>


<h4 class="wp-block-heading">Accéder aux membres personnalisés de l’énumération</h4>



<p class="wp-block-paragraph">Sur une énumération améliorée, vous pouvez accéder aux champs, getters et méthodes personnalisés exactement comme sur un objet classique :</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">print</span>(<span class="hljs-selector-tag">Vehicle</span><span class="hljs-selector-class">.car</span><span class="hljs-selector-class">.carbonFootprint</span>);</code></span></pre>


<p class="wp-block-paragraph">Voici un exemple complet de cette leçon : nous allons créer une énumération pour les mois et mettre en pratique toutes les notions abordées.</p>


<pre class="wp-block-code"><span><code class="hljs language-dart"><span class="hljs-keyword">enum</span> Month <span class="hljs-keyword">implements</span> <span class="hljs-built_in">Comparable</span>&lt;Month&gt; {
  january(<span class="hljs-number">1</span>, <span class="hljs-string">'一月'</span>, days: <span class="hljs-number">31</span>),
  february(<span class="hljs-number">2</span>, <span class="hljs-string">'二月'</span>, days: <span class="hljs-number">28</span>),
  march(<span class="hljs-number">3</span>, <span class="hljs-string">'三月'</span>, days: <span class="hljs-number">31</span>),
  april(<span class="hljs-number">4</span>, <span class="hljs-string">'四月'</span>, days: <span class="hljs-number">30</span>),
  may(<span class="hljs-number">5</span>, <span class="hljs-string">'五月'</span>, days: <span class="hljs-number">31</span>),
  june(<span class="hljs-number">6</span>, <span class="hljs-string">'六月'</span>, days: <span class="hljs-number">30</span>),
  july(<span class="hljs-number">7</span>, <span class="hljs-string">'七月'</span>, days: <span class="hljs-number">31</span>),
  august(<span class="hljs-number">8</span>, <span class="hljs-string">'八月'</span>, days: <span class="hljs-number">31</span>),
  september(<span class="hljs-number">9</span>, <span class="hljs-string">'九月'</span>, days: <span class="hljs-number">30</span>),
  october(<span class="hljs-number">10</span>, <span class="hljs-string">'十月'</span>, days: <span class="hljs-number">31</span>),
  november(<span class="hljs-number">11</span>, <span class="hljs-string">'十一月'</span>, days: <span class="hljs-number">30</span>),
  december(<span class="hljs-number">12</span>, <span class="hljs-string">'十二月'</span>, days: <span class="hljs-number">31</span>);

  <span class="hljs-keyword">const</span> Month(<span class="hljs-keyword">this</span>.monthNumber, <span class="hljs-keyword">this</span>.cnName, {required <span class="hljs-keyword">this</span>.days});

  <span class="hljs-comment">/// <span class="markdown">Numéro du mois du calendrier grégorien, de 1 à 12</span></span>
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> monthNumber;

  <span class="hljs-comment">/// <span class="markdown">Nom</span></span>
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">String</span> cnName;

  <span class="hljs-comment">/// <span class="markdown">Nombre de jours en année normale</span></span>
  <span class="hljs-keyword">final</span> <span class="hljs-built_in">int</span> days;

  <span class="hljs-comment">/// <span class="markdown">Getter : appartient au premier trimestre ?</span></span>
  <span class="hljs-built_in">bool</span> <span class="hljs-keyword">get</span> isFirstQuarter =&gt; monthNumber &lt;= <span class="hljs-number">3</span>;

  <span class="hljs-comment">/// <span class="markdown">Getter : mois à 31 jours ?</span></span>
  <span class="hljs-built_in">bool</span> <span class="hljs-keyword">get</span> has31Days =&gt; days == <span class="hljs-number">31</span>;

  <span class="hljs-comment">/// <span class="markdown">Méthode personnalisée : vérifie si février est le mois d’une année bissextile</span></span>
  <span class="hljs-built_in">bool</span> isLeapYearFebruary(<span class="hljs-built_in">int</span> year) {
    <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span> != Month.february) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    <span class="hljs-keyword">return</span> (year % <span class="hljs-number">4</span> == <span class="hljs-number">0</span> &amp;&amp; year % <span class="hljs-number">100</span> != <span class="hljs-number">0</span>) || (year % <span class="hljs-number">400</span> == <span class="hljs-number">0</span>);
  }

  <span class="hljs-comment">/// <span class="markdown">Implémentation de Comparable pour autoriser le tri</span></span>
  <span class="hljs-meta">@override</span>
  <span class="hljs-built_in">int</span> compareTo(Month other) {
    <span class="hljs-keyword">return</span> monthNumber - other.monthNumber;
  }
}

<span class="hljs-keyword">void</span> main() {
  <span class="hljs-comment">// 1. Accès basique aux constantes d’énumération</span>
  Month current = Month.august;
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Énumération actuelle : <span class="hljs-subst">$current</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Propriété name de l\'énumération : <span class="hljs-subst">${current.name}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Mois : <span class="hljs-subst">${current.cnName}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Numéro du mois (1~12) : <span class="hljs-subst">${current.monthNumber}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Nombre de jours en année normale : <span class="hljs-subst">${current.days}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Est-ce un mois à 31 jours ? <span class="hljs-subst">${current.has31Days}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Appartient au premier trimestre ? <span class="hljs-subst">${current.isFirstQuarter}</span>'</span>);

  <span class="hljs-comment">// 2. Propriété index (indice de définition de l’énumération, débute à 0)</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'\n<span class="hljs-subst">${Month.january.name}</span> index = <span class="hljs-subst">${Month.january.index}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'<span class="hljs-subst">${Month.december.name}</span> index = <span class="hljs-subst">${Month.december.index}</span>'</span>);

  <span class="hljs-comment">// 3. values pour récupérer la liste complète des énumérations</span>
  <span class="hljs-built_in">List</span>&lt;Month&gt; allMonths = Month.values;
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'\nIl y a au total <span class="hljs-subst">${allMonths.length}</span> mois'</span>);

  <span class="hljs-comment">// 4. Utilisation d’un switch avec une énumération</span>
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'\n==== Test switch ===='</span>);
  <span class="hljs-keyword">switch</span> (current) {
    <span class="hljs-keyword">case</span> Month.january:
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'Début de l\'année'</span>);
    <span class="hljs-keyword">case</span> Month.february:
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'Peut comporter un jour supplémentaire en année bissextile'</span>);
    <span class="hljs-keyword">case</span> Month.march:
    <span class="hljs-keyword">case</span> Month.april:
    <span class="hljs-keyword">case</span> Month.may:
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'Printemps'</span>);
    <span class="hljs-keyword">case</span> Month.june:
    <span class="hljs-keyword">case</span> Month.july:
    <span class="hljs-keyword">case</span> Month.august:
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'Été'</span>);
    <span class="hljs-keyword">case</span> Month.september:
    <span class="hljs-keyword">case</span> Month.october:
    <span class="hljs-keyword">case</span> Month.november:
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'Automne'</span>);
    <span class="hljs-keyword">case</span> Month.december:
      <span class="hljs-built_in">print</span>(<span class="hljs-string">'Fin de l\'année, hiver'</span>);
  }

  <span class="hljs-comment">// 5. Appel de la méthode personnalisée</span>
  Month feb = Month.february;
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'\nFévrier 2024 est-il dans une année bissextile ? <span class="hljs-subst">${feb.isLeapYearFebruary(<span class="hljs-number">2024</span>)}</span>'</span>);
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'Février 2025 est-il dans une année bissextile ? <span class="hljs-subst">${feb.isLeapYearFebruary(<span class="hljs-number">2025</span>)}</span>'</span>);

  <span class="hljs-comment">// 6. Tri des énumérations (via l’interface Comparable)</span>
  <span class="hljs-keyword">var</span> selected = &#91;Month.october, Month.january, Month.july];
  selected.sort();
  <span class="hljs-built_in">print</span>(<span class="hljs-string">'\nMois triés : <span class="hljs-subst">${selected.map((m) =&gt; m.cnName).toList()}</span>'</span>);
}</code></span></pre>


<p class="wp-block-paragraph">Résultat de l’exécution</p>


<pre class="wp-block-code"><span><code class="hljs">D:\dartdemo\firstdart&gt;dart run
Building package executable...
Built firstdart:firstdart.
Énumération actuelle : Month.august
Propriété name de l'énumération : august
Mois : 八月
Numéro du mois (1~12) : 8
Nombre de jours en année normale : 31
Est-ce un mois à 31 jours ? true
Appartient au premier trimestre ? false

january index = 0
december index = 11

Il y a au total 12 mois

==== Test switch ====
Été

Février 2024 est-il dans une année bissextile ? true
Février 2025 est-il dans une année bissextile ? false

Mois triés : &#91;一月, 七月, 十月]</code></span></pre>


<p class="wp-block-paragraph">Énumérations</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/fr/2026/07/28/enumerations/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
