<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[blog tentang mobile development]]></title><description><![CDATA[Hai, saya Ihwan — pengembang aplikasi seluler. Di blog ini saya membagikan proses kerja saya, tip dan trik, alat, dan masalah yang saya temukan selama ini.]]></description><link>https://blog.ihwan.id</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 04:52:31 GMT</lastBuildDate><atom:link href="https://blog.ihwan.id/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Perbedaan Stateless dengan Stateful Widget?]]></title><description><![CDATA[Sebuah widget bisa berupa stateless atau stateful. Jika sebuah widget dapat berubah, dapat berinteraksi dengan user input misalnya maka widget tersebut adalah stateful.
Stateless widget berarti widget tersebut static atau tidak akan pernah berubah. I...]]></description><link>https://blog.ihwan.id/stateless-stateful-widget</link><guid isPermaLink="true">https://blog.ihwan.id/stateless-stateful-widget</guid><category><![CDATA[Flutter]]></category><dc:creator><![CDATA[Ihwan]]></dc:creator><pubDate>Tue, 22 Aug 2023 14:54:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/REM8rFPp0q8/upload/b5a571d34f030aef08dc3ea1f7ee8c10.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sebuah widget bisa berupa stateless atau stateful. Jika sebuah widget dapat berubah, dapat berinteraksi dengan user input misalnya maka widget tersebut adalah stateful.</p>
<p>Stateless widget berarti widget tersebut static atau tidak akan pernah berubah. Icon, IconButton dan Text adalah contoh stateless widget.</p>
]]></content:encoded></item><item><title><![CDATA[Panduan Membuat Button di Flutter]]></title><description><![CDATA[Button adalah komponen yang sangat penting dalam mobile apps development. Dahulu kala flutter memiliki FlatButton, RaisedButton dan OutlinedButton namun sudah digantikan dengan widget TextButton, ElevatedButton dan OutlinedButton.
Berikut adalah tamp...]]></description><link>https://blog.ihwan.id/flutter-button</link><guid isPermaLink="true">https://blog.ihwan.id/flutter-button</guid><category><![CDATA[Flutter]]></category><category><![CDATA[button]]></category><category><![CDATA[Dart]]></category><dc:creator><![CDATA[Ihwan]]></dc:creator><pubDate>Mon, 21 Aug 2023 01:05:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1692579678503/be39e85c-e033-495b-909c-40f564042c98.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Button adalah komponen yang sangat penting dalam mobile apps development. Dahulu kala flutter memiliki <em>FlatButton</em>, <em>RaisedButton</em> dan <em>OutlinedButton</em> namun sudah digantikan dengan widget <em>TextButton</em>, <em>ElevatedButton</em> dan <em>OutlinedButton.</em></p>
<p>Berikut adalah tampilan default dari masing masing button tersebut:</p>
<pre><code class="lang-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoScreen</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatelessWidget</span> </span>{
  <span class="hljs-keyword">const</span> DemoScreen({<span class="hljs-keyword">super</span>.key});

  <span class="hljs-meta">@override</span>
  Widget build(BuildContext context) {
    <span class="hljs-keyword">return</span> Scaffold(
      appBar: AppBar(
        title: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">'Flutter Button Demo'</span>),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            TextButton(onPressed: () {}, child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Text Button"</span>)),
            ElevatedButton(onPressed: () {}, child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Elevated Button"</span>)),
            OutlinedButton(onPressed: () {}, child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Outlined Button"</span>)),
          ],
        ),
      ),
    );
  }
}
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692575134658/4efe0498-b03b-49d1-b40d-bb87b4e9efdb.png" alt /></p>
<h2 id="heading-styling-button">Styling Button</h2>
<p>styling button pada flutter bisa menggunakan property <code>style</code> dengan memasukan value <code>ButtonStyle</code>. Misal kita ingin mengubah warna dari text (foreground color) maka bisa mengikuti kode dibawah ini.</p>
<pre><code class="lang-dart">TextButton(
  style: ButtonStyle(
      foregroundColor:
          MaterialStateProperty.all&lt;Color&gt;(Colors.black)),
  onPressed: () {},
  child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Text Button"</span>),
)
</code></pre>
<p>dengan <code>MaterialStateProperty</code> kita bisa mengubah warna sesuai dengan state button seperti saat <code>pressed</code>, <code>hovered</code> atau <code>focused</code>. selengkapnya tentang <code>MaterialStateProperty</code> bisa dibaca <a target="_blank" href="https://api.flutter.dev/flutter/material/MaterialStateProperty-class.html">disini</a>.</p>
<p>namun jika dirasa tidak terlalu perlu untuk menghandle state pada <code>foregroundColor</code> maka kita bisa menggunakan value <code>TextButton.styleFrom()</code> seperti contoh dibawah ini:</p>
<pre><code class="lang-dart">TextButton(
  style: TextButton.styleFrom(
    foregroundColor: Colors.black,
  ),
  onPressed: () {},
  child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Text Button"</span>),
),
</code></pre>
<p>ada banyak property yang bisa kita gunakan di ButtonStyle seperti <code>backgroundColor</code>, <code>overlayColor</code>, <code>padding</code> dll.</p>
<p>Jika kita coba styling satu persatu maka kita bisa mengubah warna border color, background color serta foreground color masing masing button seperti berikut:</p>
<pre><code class="lang-dart"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DemoScreen</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatelessWidget</span> </span>{
  <span class="hljs-keyword">const</span> DemoScreen({<span class="hljs-keyword">super</span>.key});

  <span class="hljs-meta">@override</span>
  Widget build(BuildContext context) {
    <span class="hljs-keyword">return</span> Scaffold(
      appBar: AppBar(
        title: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">'Flutter Button Demo'</span>),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            TextButton(
              style: ButtonStyle(
                  foregroundColor:
                      MaterialStateProperty.all&lt;Color&gt;(Colors.black)),
              onPressed: () {},
              child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Text Button"</span>),
            ),
            ElevatedButton(
                style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
                onPressed: () {},
                child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Elevated Button"</span>)),
            OutlinedButton(
                style: OutlinedButton.styleFrom(
                    foregroundColor: Colors.red,
                    side: <span class="hljs-keyword">const</span> BorderSide(color: Colors.red)),
                onPressed: () {},
                child: <span class="hljs-keyword">const</span> Text(<span class="hljs-string">"Outlined Button"</span>)),
          ],
        ),
      ),
    );
  }
}
</code></pre>
<p>dan hasilnya akan seperti gambar dibawah ini:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692579033949/f420782a-b62e-408f-bd21-d02b5a77b8cc.png" alt /></p>
<p>Sekian, semoga artikel ini bermanfaat.</p>
]]></content:encoded></item><item><title><![CDATA[Memilih Local Database terbaik untuk Flutter Project]]></title><description><![CDATA[Dewasa ini, tidak bisa dipungkiri jika penggunaan local database / storage pada mobile apps masih diperlukan seperti untuk menyimpan data pada offline mode atau sekedar caching response dari api.
Berikut kita bahas Local Database populer yang mungkin...]]></description><link>https://blog.ihwan.id/local-database-flutter</link><guid isPermaLink="true">https://blog.ihwan.id/local-database-flutter</guid><category><![CDATA[Databases]]></category><category><![CDATA[Flutter]]></category><category><![CDATA[SQLite]]></category><category><![CDATA[NoSQL]]></category><category><![CDATA[pub.dev]]></category><dc:creator><![CDATA[Ihwan]]></dc:creator><pubDate>Sun, 20 Aug 2023 10:39:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1692526374775/98f746bb-2d25-4127-b395-f826620cd10e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Dewasa ini, tidak bisa dipungkiri jika penggunaan local database / storage pada mobile apps masih diperlukan seperti untuk menyimpan data pada offline mode atau sekedar caching response dari api.</p>
<p>Berikut kita bahas Local Database populer yang mungkin bisa jadi pilihan sobat flutter sekalian.</p>
<p>Sql Database</p>
<ul>
<li><p>Sqflite<br />  <a target="_blank" href="https://pub.dev/packages/sqflite">Sqflite</a> adalah SQLite plugin untuk flutter. kita bisa menggunakan Raw SQL queries untuk mengoperasikan database.</p>
</li>
<li><p>Drift<br />  <a target="_blank" href="https://pub.dev/packages/drift">Drift</a> (sebelumnya: Moor) adalah reactive persistence library berbasis SQLite.</p>
</li>
<li><p><a target="_blank" href="https://pub.dev/packages/floor">Floor</a><br />  Floor menyediakan abstraksi yang rapi untuk applikasi flutter yang dikembangkan. Floor terinspirasi dari <a target="_blank" href="https://developer.android.com/topic/libraries/architecture/room">Room</a> (Local Database Android Native).  </p>
</li>
</ul>
<p>NoSQL Database</p>
<ul>
<li><p>Hive<br />  <a target="_blank" href="https://pub.dev/packages/hive">Hive</a> adalah NoSQL database untuk flutter, mudah digunakan serta memiliki API yang sederhana.</p>
</li>
<li><p>Isar<br />  <a target="_blank" href="https://pub.dev/packages/isar">Isar</a> dikembangkan oleh developer yang sama dengan Hive. Isar adalah NoSQL yang cukup ringan dan mudah digunakan. Isar memiliki fitur database inspector yang mengizinkan developer untuk meng-inspect instances &amp; collections dari flutter apps secara realtime. Developer bisa mengeksekusi queries, mengedit properties, beralih instances dan sorting data.</p>
</li>
<li><p>Objectbox<br />  <a target="_blank" href="https://pub.dev/packages/objectbox">Objectbox</a> adalah NoSQL database yang di design secara special untuk mobile dan iOT Device. Database ini mengklaim menggunakan CPU, memory dan baterai yang minimal sehingga tidak hanya membuat aplikasi yang efektif tapi juga berkelanjutan.</p>
</li>
<li><p>Realm Dart<br />  <a target="_blank" href="https://pub.dev/packages/realm">Realm</a> adalah database yang dikembangkan oleh MongoDB setelah akusisi pada tahun 2019.</p>
</li>
</ul>
<p>Pilihlah database sesuai kebutuhan dan development skill yang dimiliki. Jika aplikasi yang akan dikembangkan membutuhkan database yang memiliki kemampuan relasi antar entity maka sebaiknya gunakan SQL database, sebaliknya jika apps yang dikembangkan hanya perlu menyimpan data berbentuk key-value maka pilihlah NoSQL database. Sekian</p>
]]></content:encoded></item><item><title><![CDATA[Memilih State Management Terbaik untuk Flutter Project]]></title><description><![CDATA[Membuat aplikasi dengan teknologi Flutter memang cenderung mudah diawal, namun seiring berkembangnya keadaan source code akan membuat kita berpikir lebih jauh untuk menjaga kualitas kode. Memilih State Management adalah salah satu cara untuk meningka...]]></description><link>https://blog.ihwan.id/state-management-flutter</link><guid isPermaLink="true">https://blog.ihwan.id/state-management-flutter</guid><category><![CDATA[Flutter]]></category><category><![CDATA[Dart]]></category><category><![CDATA[State Management ]]></category><category><![CDATA[BLoC]]></category><category><![CDATA[GetX]]></category><dc:creator><![CDATA[Ihwan]]></dc:creator><pubDate>Sat, 19 Aug 2023 14:00:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1692526167674/f5849c0e-9321-4b0e-ae49-b27d34194e5e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Membuat aplikasi dengan teknologi Flutter memang cenderung mudah diawal, namun seiring berkembangnya keadaan source code akan membuat kita berpikir lebih jauh untuk menjaga kualitas kode. Memilih State Management adalah salah satu cara untuk meningkatkan kualitas codebase karena didalamnya ada aturan aturan yang harus dipatuhi. Topik state management cukup kontroversial dan kenyataannya setiap state management yang ada selalu menawarkan solusi dari suatu masalah. Mari kita bahas satu persatu tentang State Management yang populer dipakai di kalangan Flutter Developer.</p>
<ul>
<li><p>Stateful Widget<br />  Stateful widget adalah widget default dari flutter yang mampu mengubah state dengan menggunakan methode <code>setState()</code>. Stateful widget sangat mudah digunakan dan cocok untuk pemula. Jika apps yang kamu buat adalah apps yang cukup simple, maka gunakanlah stateful &amp; stateless widget saja.</p>
</li>
<li><p>Provider<br />  <a target="_blank" href="https://pub.dev/packages/provider">Provider</a> menawarkan kemudahan untuk mengakses data di seluruh widget tree karena sebenarnya Provider adalah wrapper <code>InheritedWidget</code>. Package ini banyak digunakan dan menjadi salah satu package yang direkomendasikan oleh Flutter Team. Contoh penggunaan state management provider tersedia di official dokumentasi flutter <a target="_blank" href="https://docs.flutter.dev/data-and-backend/state-mgmt/simple">disini</a>.</p>
</li>
<li><p>Riverpod<br />  <a target="_blank" href="https://riverpod.dev/">Riverpod</a> adalah next level state management dari Provider karena dikembangkan oleh developer yang sama. Package ini memiliki fitur unggulan <code>compile safe</code> dimana kita tidak akan menemukan error <code>ProviderNotFoundException</code> atau lupa meng-handle state loading.</p>
</li>
<li><p>GetX<br />  <a target="_blank" href="https://pub.dev/packages/get">Get / GetX</a> adalah Package yang menawarkan state management serta kemudahan dalam route management dan dependency injection. GetX membuat proses development menjadi lebih simple karena memiliki banyak fitur seperti navigasi, penyimpanan data, menampilkan snackbar dan masih banyak lagi. Jika kamu dan team mencari package yang bisa melakukan banyak hal, package ini pasti cocok banget.</p>
</li>
<li><p>Bloc<br />  <a target="_blank" href="https://bloclibrary.dev/">Bloc</a> / Business Logic of Component cukup populer di kalangan flutter developer. Pasalnya package yang memiliki slogan <code>a predictable state management library for Dart</code> memberikan kemudahan kepada developer dalam me-maintain code base flutternya. Ditambah dengan dokumentasi yang sangat lengkap beserta sample codenya menjadikan source code memiliki arsitektur yang cukup rapi.</p>
</li>
</ul>
<p>Dari semua package yang kita bahas sejujurnya tidak ada yang terbaik. State management terbaik adalah state management yang nyaman kita gunakan, yang bisa menghemat banyak waktu serta mempercepat proses development. Jika ada yang bilang kalau state management A atau B adalah state management terbaik maka bisa dipastikan kalau pernyataan itu hanyalah opini / pendapat pribadi dan cukup berikan seyuman kecil saja, hehe. Kita sendiri yang harus mencoba dan menentukan mana state management yang paling cocok untuk diri kita. sekian.</p>
]]></content:encoded></item></channel></rss>