<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CHAHBOUN Mohammed</title>
    <description>The latest articles on DEV Community by CHAHBOUN Mohammed (@m97chahboun).</description>
    <link>https://dev.to/m97chahboun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F803542%2Fd9a25b9b-c614-4d69-8107-2ee05d1318cf.jpeg</url>
      <title>DEV Community: CHAHBOUN Mohammed</title>
      <link>https://dev.to/m97chahboun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/m97chahboun"/>
    <language>en</language>
    <item>
      <title>Elevate Your Flutter App's Performance with Flutter Rocket's Premium Features 🚀</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Tue, 20 Jan 2026 23:33:30 +0000</pubDate>
      <link>https://dev.to/m97chahboun/elevate-your-flutter-apps-performance-with-flutter-rockets-premium-features-57aa</link>
      <guid>https://dev.to/m97chahboun/elevate-your-flutter-apps-performance-with-flutter-rockets-premium-features-57aa</guid>
      <description>&lt;p&gt;Flutter developers are spoiled for choice when it comes to state management. From BLoC to Riverpod, the ecosystem is rich. However, as our apps grow in complexity, we often find ourselves fighting a common enemy: &lt;strong&gt;unnecessary UI rebuilds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, I’m excited to introduce the latest updates to &lt;strong&gt;Flutter Rocket&lt;/strong&gt;—a lightweight, high-performance state management and API integration solution that puts "Premium Performance" at the center of your development workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Performance Bottleneck: The "Rebuild Everything" Syndrome
&lt;/h2&gt;

&lt;p&gt;We’ve all been there. You update a user’s biography in a deep nested object, and suddenly your entire profile screen—including the avatar, interest tags, and post history—rebuilds. In large lists, updating one item can sometimes trigger an expensive redraw of the whole view.&lt;/p&gt;

&lt;p&gt;Flutter Rocket 1.1.0 changes that.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Selective Rebuilds: Precision UI Updates
&lt;/h2&gt;

&lt;p&gt;The star of the show is &lt;strong&gt;Selective Rebuilds&lt;/strong&gt;. This feature allows you to specify exactly which properties a widget should listen to. &lt;/p&gt;

&lt;p&gt;Instead of rebuilding every time a model changes, your widget only reacts when the specific "fields" it depends on are updated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This widget ONLY rebuilds when 'title' changes&lt;/span&gt;
&lt;span class="n"&gt;RocketView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;model:&lt;/span&gt; &lt;span class="n"&gt;currentPost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;fields:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;postTitleField&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
  &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentPost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By localizing updates to the property level, you drastically reduce CPU cycles, save battery, and ensure a silky-smooth 60 (or 120!) FPS experience even on lower-end devices.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Automatic Bubbling: Zero-Code Orchestration
&lt;/h2&gt;

&lt;p&gt;Managing state in nested collections is usually a headache. If a &lt;code&gt;Post&lt;/code&gt; changes, how does the &lt;code&gt;Posts&lt;/code&gt; list know it needs to refresh its summary?&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Automatic Bubbling&lt;/strong&gt;, Flutter Rocket handles this orchestration for you. When a child model triggers an update, it automatically "bubbles up" to its parent collection. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt; Your UI stays perfectly in sync across different screens and components without you writing a single line of manual listener code.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Rocket CLI: The Magic Wand 🪄
&lt;/h2&gt;

&lt;p&gt;Performance optimizations are great, but no one likes writing boilerplate. That’s why we’ve updated &lt;strong&gt;Rocket CLI&lt;/strong&gt; to version &lt;strong&gt;1.1.0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now, when you generate your models from JSON, the CLI automatically generates the &lt;code&gt;updateFields&lt;/code&gt; logic required for Selective Rebuilds and Bubbling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate a fully optimized model in seconds&lt;/span&gt;
rocket_cli &lt;span class="nt"&gt;-j&lt;/span&gt; &lt;span class="s1"&gt;'{"id":1, "title":"Hello World"}'&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; Post
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get industry-leading performance out of the box, generated in a single command. &lt;/p&gt;




&lt;h2&gt;
  
  
  Why Flutter Rocket?
&lt;/h2&gt;

&lt;p&gt;Flutter Rocket isn't just another state management library. It’s a complete ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RocketModel&lt;/strong&gt;: Smart data structures with built-in state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RocketClient&lt;/strong&gt;: HTTP client with interceptors and dynamic caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RocketView&lt;/strong&gt;: Smart widgets that handle loading, errors, and data binding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rocket Singleton&lt;/strong&gt;: A global registry to access your data from anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ready to Fly? 🛰️
&lt;/h2&gt;

&lt;p&gt;Flutter Rocket is designed for developers who want the performance of a custom-tailored system with the simplicity of a "plug-and-play" package.&lt;/p&gt;

&lt;p&gt;Whether you're building a simple prototype or a high-traffic production app, Flutter Rocket gives you the tools to build faster and run smoother.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the project:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/flutter_rocket" rel="noopener noreferrer"&gt;Package on Pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JahezAcademy/flutter_rocket/wiki" rel="noopener noreferrer"&gt;Official Documentation (Wiki)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/JahezAcademy/flutter_rocket" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Join the conversation!&lt;/strong&gt; Have you tried selective rebuilds in your projects? Let us know in the comments below!&lt;/p&gt;

&lt;h1&gt;
  
  
  Flutter #Dart #StateManagement #MobileDevelopment #Programming #FlutterRocket
&lt;/h1&gt;

</description>
      <category>flutter</category>
      <category>mobile</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The Safe Way to Switch Git Branches with Django Migrations</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Sat, 27 Sep 2025 13:34:58 +0000</pubDate>
      <link>https://dev.to/m97chahboun/the-safe-way-to-switch-git-branches-with-django-migrations-3hf</link>
      <guid>https://dev.to/m97chahboun/the-safe-way-to-switch-git-branches-with-django-migrations-3hf</guid>
      <description>&lt;p&gt;If you've ever worked on a Django project with multiple feature branches, you've likely encountered this frustrating scenario: you switch branches only to find your database schema is out of sync, causing runtime errors or migration conflicts. The quick fix of dropping your entire database is tempting, but there's a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Database Schema Drift
&lt;/h2&gt;

&lt;p&gt;When you're working with different Git branches that each have their own migrations, your database can quickly become misaligned with your codebase. Consider this common workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're working on &lt;code&gt;feature-branch-a&lt;/code&gt; with migrations up to &lt;code&gt;0004&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You need to switch to &lt;code&gt;feature-branch-b&lt;/code&gt;, which has migrations up to &lt;code&gt;0003&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;After switching, your database expects migration &lt;code&gt;0004&lt;/code&gt;, but your code only has up to &lt;code&gt;0003&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result? Django complains about missing migrations or applied migrations that don't exist in the current branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ The Tempting (But Dangerous) Quick Fix
&lt;/h2&gt;

&lt;p&gt;Many developers reach for the nuclear option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python manage.py migrate your_app zero
python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This wipes all your data and rebuilds the schema from scratch. While it works, you lose all your development data, which is especially painful if you've spent time setting up test data or have important development records.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ The Proper Fix: Migrate Backwards Before Switching
&lt;/h2&gt;

&lt;p&gt;For a more controlled approach that avoids data loss, reverse the migrations from your current branch before switching to the new one. This keeps your database schema aligned with your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-Step Process
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find the last common migration that both branches share&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   python manage.py showmigrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows you which migrations are applied and helps identify where the branches diverge.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Migrate your database back to that common state&lt;/strong&gt;:
If the common migration was &lt;code&gt;0002&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   python manage.py migrate your_app_name 0002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Switch to your target branch&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git checkout target-branch-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Apply the new branch's migrations&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This method is more manual but preserves your data and follows the correct workflow for applying and unapplying migrations.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Bonus: Makefile Aliases for Easy Migration Management
&lt;/h2&gt;

&lt;p&gt;To make this process even smoother, I've created Makefile aliases that automate finding and rolling back to the latest migration from a target branch. These are especially useful in different environments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;staging-rollback&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Finding latest migration file..."&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;MIGRATION_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;git ls-tree &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--name-only&lt;/span&gt; origin/develop &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="k"&gt;**&lt;/span&gt;/migrations/&lt;span class="k"&gt;*&lt;/span&gt;.py | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'[0-9]{4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_.*\.py'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-k3&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;APP_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_FILE"&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;MIGRATION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_FILE"&lt;/span&gt; .py&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Rolling back migration &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_NAME in app &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;APP_NAME..."&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;web python manage.py migrate &lt;span class="nv"&gt;$$&lt;/span&gt;APP_NAME &lt;span class="nv"&gt;$$&lt;/span&gt;MIGRATION_NAME

&lt;span class="nl"&gt;dev-rollback&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Finding latest migration file..."&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;MIGRATION_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;git ls-tree &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--name-only&lt;/span&gt; origin/develop &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="k"&gt;**&lt;/span&gt;/migrations/&lt;span class="k"&gt;*&lt;/span&gt;.py | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'[0-9]{4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_.*\.py'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-k3&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;APP_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_FILE"&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;MIGRATION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_FILE"&lt;/span&gt; .py&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Rolling back migration &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_NAME in app &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;APP_NAME..."&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;web-dev python manage.py migrate &lt;span class="nv"&gt;$$&lt;/span&gt;APP_NAME &lt;span class="nv"&gt;$$&lt;/span&gt;MIGRATION_NAME

&lt;span class="nl"&gt;local-rollback&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Finding latest migration file..."&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nv"&gt;MIGRATION_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;git ls-tree &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--name-only&lt;/span&gt; origin/develop &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="k"&gt;**&lt;/span&gt;/migrations/&lt;span class="k"&gt;*&lt;/span&gt;.py | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'[0-9]{4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;_.*\.py'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-k3&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;APP_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_FILE"&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;MIGRATION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;$$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_FILE"&lt;/span&gt; .py&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Rolling back migration &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;MIGRATION_NAME in app &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;APP_NAME..."&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    python manage.py migrate &lt;span class="nv"&gt;$$&lt;/span&gt;APP_NAME &lt;span class="nv"&gt;$$&lt;/span&gt;MIGRATION_NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  These commands automatically:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Find the latest migration file from the develop branch (or any target branch you specify)&lt;/li&gt;
&lt;li&gt;Extract the app name and migration number&lt;/li&gt;
&lt;li&gt;Execute the appropriate migrate command to roll back to that specific migration&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Roll back your local database to match the develop branch&lt;/span&gt;
make local-rollback

&lt;span class="c"&gt;# Roll back your development environment&lt;/span&gt;
make dev-rollback

&lt;span class="c"&gt;# Roll back staging to prepare for a deployment&lt;/span&gt;
make staging-rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Pro Tips for Migration Management
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commit often&lt;/strong&gt;: Small, focused migrations are easier to manage than large, complex ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use meaningful migration names&lt;/strong&gt;: This helps identify what each migration does when you need to roll back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep migrations in sync&lt;/strong&gt;: Try to avoid having migration conflicts between branches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test migration rollbacks&lt;/strong&gt;: Ensure your migrations can be reversed without data loss.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Switching branches doesn't have to mean losing your development data. By properly managing your migrations and using automated tools like these Makefile aliases, you can maintain a smooth workflow across multiple feature branches. The few extra seconds spent rolling back migrations properly will save you hours of recreating lost data.&lt;/p&gt;

&lt;p&gt;What migration strategies have worked well for your team? Share your tips in the comments below!&lt;/p&gt;




&lt;p&gt;Follow for more Django tips and development workflows!&lt;/p&gt;

</description>
      <category>database</category>
      <category>git</category>
      <category>django</category>
      <category>python</category>
    </item>
    <item>
      <title>Responsive Card Layout with CSS Grid: A Step-by-Step Guide</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Sun, 03 Aug 2025 15:10:51 +0000</pubDate>
      <link>https://dev.to/m97chahboun/responsive-card-layout-with-css-grid-a-step-by-step-guide-3ej1</link>
      <guid>https://dev.to/m97chahboun/responsive-card-layout-with-css-grid-a-step-by-step-guide-3ej1</guid>
      <description>&lt;p&gt;In this post, I'll walk you through the implementation of a responsive card layout using CSS Grid, which I recently deployed on my GitHub repository: &lt;a href="https://github.com/M97Chahboun/css_flexible_wrap" rel="noopener noreferrer"&gt;css_flexible_wrap&lt;/a&gt;. This layout adapts dynamically to various screen sizes, ensuring a visually appealing and functional design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview of the Project
&lt;/h2&gt;

&lt;p&gt;The main goal of this project is to create a card layout that maintains uniformity across rows while being responsive to the size of the display. Utilizing CSS Grid allows for a flexible and efficient arrangement of cards.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Design&lt;/strong&gt;: The layout adjusts based on screen size, maintaining a consistent look across devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Columns&lt;/strong&gt;: The number of columns changes automatically according to the container's width.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS Grid&lt;/strong&gt;: Efficient layout management using CSS Grid properties.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Clone the Repository
&lt;/h3&gt;

&lt;p&gt;To get started, clone the repository to your local machine using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/M97Chahboun/css_flexible_wrap.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Navigate to the Project Directory
&lt;/h3&gt;

&lt;p&gt;Change into the project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;css_flexible_wrap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Open the HTML File
&lt;/h3&gt;

&lt;p&gt;Open &lt;code&gt;index.html&lt;/code&gt; in your preferred web browser to view the layout in action.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Showcase
&lt;/h3&gt;

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

&lt;h2&gt;
  
  
  Implementation Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HTML Structure
&lt;/h3&gt;

&lt;p&gt;The basic structure of the HTML file includes several card elements wrapped in a container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 1&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 2&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 3&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 4&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 5&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 6&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CSS Styling
&lt;/h3&gt;

&lt;p&gt;The CSS utilizes the following properties to create a responsive grid layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card-container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fill&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f3f4f6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tailwind CSS Equivalent
&lt;/h3&gt;

&lt;p&gt;For those using Tailwind CSS, the equivalent implementation can be achieved with utility classes like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"grid grid-cols-[repeat(auto-fill,minmax(280px,1fr))] gap-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200 p-4 rounded-lg shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 1&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200 p-4 rounded-lg shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 2&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200 p-4 rounded-lg shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 3&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200 p-4 rounded-lg shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 4&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200 p-4 rounded-lg shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 5&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"bg-gray-200 p-4 rounded-lg shadow"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Card 6&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;This layout is fully customizable. You can modify the card styles by adjusting the &lt;code&gt;.card&lt;/code&gt; class in the CSS file or tweak the grid settings by changing the &lt;code&gt;grid-template-columns&lt;/code&gt; property to fit your design needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project serves as a great starting point for anyone looking to implement a responsive card layout using CSS Grid. Feel free to explore the repository and experiment with the code. You can find the project on GitHub: &lt;a href="https://github.com/M97Chahboun/css_flexible_wrap" rel="noopener noreferrer"&gt;css_flexible_wrap&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://github.com/bixat/flexible_wrap" rel="noopener noreferrer"&gt;FlexibleWrap flutter package&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>tailwindcss</category>
      <category>design</category>
    </item>
    <item>
      <title>Announcing Bixat Key Mouse: A Cross-Platform Dart Package for Keyboard and Mouse Simulation 🎉</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Wed, 16 Jul 2025 18:08:12 +0000</pubDate>
      <link>https://dev.to/m97chahboun/announcing-bixat-key-mouse-a-cross-platform-dart-package-for-keyboard-and-mouse-simulation-2l1h</link>
      <guid>https://dev.to/m97chahboun/announcing-bixat-key-mouse-a-cross-platform-dart-package-for-keyboard-and-mouse-simulation-2l1h</guid>
      <description>&lt;p&gt;We’re excited to introduce &lt;strong&gt;&lt;a href="https://pub.dev/packages/bixat_key_mouse" rel="noopener noreferrer"&gt;Bixat Key Mouse&lt;/a&gt;&lt;/strong&gt;, a powerful new package that allows developers to simulate keyboard and mouse events across multiple platforms, including Linux, Windows, macOS, and BSD. Whether you’re building applications that require automated interactions or creating testing tools, Bixat Key Mouse has you covered!&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;: Works seamlessly on Linux, Windows, macOS, and BSD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mouse Control&lt;/strong&gt;: Move the mouse to absolute or relative positions, and simulate mouse button presses and releases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Input&lt;/strong&gt;: Enter text programmatically with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard Simulation&lt;/strong&gt;: Simulate key presses and releases, including multiple key modifiers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Easy Installation
&lt;/h2&gt;

&lt;p&gt;Adding Bixat Key Mouse to your Flutter project is simple! Just add the package to your &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter pub add bixat_key_mouse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter pub get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📚 Getting Started
&lt;/h2&gt;

&lt;p&gt;To start using Bixat Key Mouse in your Dart code, import the package:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Here’s a quick example showcasing its capabilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;BixatKeyMouse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;moveMouseAbs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;BixatKeyMouse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pressMouseButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;BixatKeyMouse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enterText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello, world!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;BixatKeyMouse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;simulateKeyPress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KeyModifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🤝 Join the Community
&lt;/h2&gt;

&lt;p&gt;We welcome contributions! If you have ideas for improvements or want to report issues, feel free to submit a Pull Request. Let’s build a great toolkit together!&lt;/p&gt;

&lt;h2&gt;
  
  
  📜 License
&lt;/h2&gt;

&lt;p&gt;Bixat Key Mouse is licensed under the MIT License.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;We can’t wait to see what you build with Bixat Key Mouse! Whether you’re automating tasks, performing UI tests, or simply experimenting, this package is designed to make your development process smoother and more efficient.&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>NexSh — Stop Googling, Start Talking</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Sun, 25 May 2025 20:50:05 +0000</pubDate>
      <link>https://dev.to/m97chahboun/nexsh-stop-googling-start-talking-1mnj</link>
      <guid>https://dev.to/m97chahboun/nexsh-stop-googling-start-talking-1mnj</guid>
      <description>&lt;p&gt;How many times have you stopped what you’re doing to search for that one git command, or the right find syntax, or the exact ffmpeg parameters? Probably too many to count.&lt;/p&gt;

&lt;p&gt;With NexSh, those days are over. Our AI-powered command interpretation lets you use natural language to express your intent.&lt;/p&gt;

&lt;p&gt;Want to find all Python files modified in the last week? Instead of: &lt;code&gt;find . -name "*.py" -type f -mtime -7&lt;/code&gt; Just type: "Show me all Python files I've changed in the last 7 days."&lt;br&gt;
Need to list processes using the most memory? Instead of: &lt;code&gt;ps aux --sort -rss&lt;/code&gt; Just type: "What's using the most memory on my system?"&lt;br&gt;
NexSh takes your words and, through smart conversion, translates them into precise, executable shell commands. It’s like having a seasoned terminal guru sitting right beside you, ready to translate your thoughts into perfect syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Basic Commands: Features Designed for Your Workflow
&lt;/h2&gt;

&lt;p&gt;But we didn’t stop at just understanding your commands. We packed NexSh with features that solve real-world productivity pains:&lt;/p&gt;

&lt;p&gt;🎨 Interactive Experience: Say goodbye to bland, monochrome output. Our shell provides colorful output with intuitive formatting, making it easier to parse complex information and identify key details at a glance. Errors are highlighted, important data stands out, and your terminal becomes a more visually informative space.&lt;/p&gt;

&lt;p&gt;📝 Enhanced History: Ever lose that perfect, complex command you crafted weeks ago? &lt;strong&gt;Our enhanced history&lt;/strong&gt; lets you search and recall past commands easily, not just by keyword, but by what you meant to do. “Find that Docker command I used for database migration,” and it’s there.&lt;/p&gt;

&lt;p&gt;🛡️ Safety First: Accidentally deleting important files or executing risky commands can be a developer's worst fear. NexSh serves as your protective ally, &lt;strong&gt;alerting you before running potentially harmful commands&lt;/strong&gt;. This added layer of security can help you avoid significant headaches down the line.&lt;/p&gt;

&lt;p&gt;🚀 Multiple Modes: Whether you prefer an interactive shell for deep work or need to execute a single commandquickly from a script, NexSh adapts to your workflow.&lt;/p&gt;

&lt;p&gt;💻 Cross-Platform: We know you don’t stick to just one OS. That’s why NexSh is built to work seamlessly across Linux, macOS, and Windows, ensuring a consistent, intelligent experience no matter your environment.&lt;/p&gt;

&lt;p&gt;❌ Command failure explanations: Offers explanations and potential solutions when a command fails&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Experience a Smarter Shell?
&lt;/h2&gt;

&lt;p&gt;The command line doesn’t have to be a barrier. With NexSh, it becomes an intuitive, powerful extension of your thoughts, freeing you to focus on what you’re building, not on remembering arcane syntax.&lt;br&gt;
We’re just getting started, and we’re excited for you to try it out.&lt;br&gt;
Ready to boost your command line productivity?&lt;br&gt;
Check out NexSh on GitHub: &lt;a href="https://github.com/M97Chahboun/nexsh" rel="noopener noreferrer"&gt;https://github.com/M97Chahboun/nexsh&lt;/a&gt;&lt;br&gt;
Let us know what you think and join us in building the future of the command line!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Fly High with Flutter Rocket: The Ultimate Package for Flutter Developers</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Thu, 24 Apr 2025 17:47:26 +0000</pubDate>
      <link>https://dev.to/m97chahboun/fly-high-with-flutter-rocket-the-ultimate-package-for-flutter-developers-3o0c</link>
      <guid>https://dev.to/m97chahboun/fly-high-with-flutter-rocket-the-ultimate-package-for-flutter-developers-3o0c</guid>
      <description>&lt;p&gt;Are you a Flutter developer looking to supercharge your app development process? Meet &lt;strong&gt;Flutter Rocket&lt;/strong&gt;—a modular, powerful, and easy-to-use package that aims to simplify state management, API handling, and UI development in Flutter. Created by the talented team, Flutter Rocket is designed to help you build high-quality apps faster and with less effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Key Features
&lt;/h2&gt;

&lt;p&gt;Flutter Rocket offers a wide range of features that make it an indispensable tool for Flutter developers:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Effortless State Management&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simplify your state management with tools like &lt;code&gt;RocketValue&lt;/code&gt; and &lt;code&gt;RocketMiniView&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Easily bind and update data in your UI, reducing boilerplate code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Streamlined API Handling&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handle API requests seamlessly with &lt;code&gt;RocketRequest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Save and retrieve models or values anywhere in your app using the &lt;code&gt;Rocket&lt;/code&gt; object.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Modular Design&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Flutter Rocket is built as a collection of modular packages, each focusing on a specific functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rocket_model&lt;/strong&gt; for managing data models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rocket_client&lt;/strong&gt; for API communication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rocket_view&lt;/strong&gt; for dynamic UI rendering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;rocket_singleton&lt;/strong&gt; for global state management.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Customizable UI Components&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use widgets like &lt;code&gt;RocketView&lt;/code&gt; to create dynamic and responsive interfaces with minimal code.&lt;/li&gt;
&lt;li&gt;Customize loaders and handle errors gracefully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;API Integration Simulation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simulate API responses by providing custom mock data for specific endpoints.&lt;/li&gt;
&lt;li&gt;Simulated Latency: Mimic real-world network delays to test how your application handles different response times.&lt;/li&gt;
&lt;li&gt;Toggle Simulation Mode: Seamlessly switch between real API calls and simulated responses.&lt;/li&gt;
&lt;li&gt;Error Simulation: Test error handling by simulating various HTTP errors (e.g., 404, 500).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Why Use Flutter Rocket?
&lt;/h2&gt;

&lt;p&gt;Here’s why you should consider Flutter Rocket for your next project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save Time&lt;/strong&gt;: With its modular architecture and pre-built tools, you can focus on building features instead of reinventing the wheel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve Code Quality&lt;/strong&gt;: Reduce complexity and maintain cleaner, more readable code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seamless Integration&lt;/strong&gt;: Easily integrate Flutter Rocket with your existing Flutter projects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Add Flutter Rocket to your project by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter pub add flutter_rocket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Here’s a quick example to showcase the simplicity of Flutter Rocket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MiniViewRocket&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;RocketValue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;myStringValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, Flutter!"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mini&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;MiniViewRocket&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;RocketMiniView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="n"&gt;myStringValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;builder:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myStringValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;floatingActionButton:&lt;/span&gt; &lt;span class="n"&gt;FloatingActionButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;myStringValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Value Updated!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Learn More
&lt;/h2&gt;

&lt;p&gt;Ready to take your Flutter development to the next level? Check out the full documentation and examples on the &lt;a href="https://github.com/JahezAcademy/flutter_rocket" rel="noopener noreferrer"&gt;Flutter Rocket GitHub repository&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Let’s Build Something Amazing!
&lt;/h2&gt;

&lt;p&gt;Whether you’re a seasoned Flutter pro or just starting, Flutter Rocket is a tool you’ll want in your toolkit. Give it a try today and see the difference it can make in your projects!&lt;/p&gt;




&lt;p&gt;If you enjoyed this post and found it helpful, don’t forget to clap 👏 and share it with your fellow developers. Have questions or feedback? Drop a comment below!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing FlexibleWrap: A New Way to Design Dynamic Flutter Layouts</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Mon, 02 Dec 2024 11:38:57 +0000</pubDate>
      <link>https://dev.to/m97chahboun/introducing-flexiblewrap-a-new-way-to-design-dynamic-flutter-layouts-56fb</link>
      <guid>https://dev.to/m97chahboun/introducing-flexiblewrap-a-new-way-to-design-dynamic-flutter-layouts-56fb</guid>
      <description>&lt;p&gt;In the world of Flutter development, creating responsive and dynamic layouts can often be challenging. Today, we're excited to introduce &lt;strong&gt;FlexibleWrap&lt;/strong&gt;, a Flutter package that simplifies the process of arranging widgets in a flexible wrap layout. Let’s dive into its features and how you can get started.&lt;br&gt;
&lt;a href="https://bixat.github.io/flexible_wrap/" rel="noopener noreferrer"&gt;FlexibleWrap Demo&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;FlexibleWrap&lt;/strong&gt; is designed to help developers create layouts where widgets can automatically wrap onto the next line based on the available space. This is particularly useful for designing interfaces similar to a shopping cart or a list of cards, where the arrangement can change depending on the screen size.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Wrapping&lt;/strong&gt;: Automatically wraps widgets onto the next line based on the available space, ensuring a seamless user experience across devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible Spacing&lt;/strong&gt;: Customize the spacing between items to achieve your desired visual layout, enhancing the overall look of your application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expanded Items&lt;/strong&gt;: Supports expanding items to fill the available space on the row, maintaining a consistent and appealing layout.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customization Options&lt;/strong&gt;: The package allows you to specify one row behavior using &lt;code&gt;isOneRowExpanded&lt;/code&gt;, giving you greater control over your layout.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To begin using FlexibleWrap in your Flutter application, follow these simple steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add the Dependency&lt;/strong&gt;: Open your &lt;code&gt;pubspec.yaml&lt;/code&gt; file and add FlexibleWrap under dependencies:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Import the Package&lt;/strong&gt;: Import FlexibleWrap into your Dart file:
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Basic Usage&lt;/strong&gt;: Here’s a simple example of how to implement FlexibleWrap in your widget tree:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;   &lt;span class="n"&gt;FlexibleWrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="nl"&gt;isOneRowExpanded:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nl"&gt;spacing:&lt;/span&gt; &lt;span class="mf"&gt;12.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
         &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="nl"&gt;width:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="nl"&gt;decoration:&lt;/span&gt; &lt;span class="n"&gt;BoxDecoration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="nl"&gt;borderRadius:&lt;/span&gt; &lt;span class="n"&gt;BorderRadius&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;circular&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
           &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
             &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;ListTile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
               &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                 &lt;span class="s"&gt;"Lorem Ipsum is simply dummy text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                 &lt;span class="nl"&gt;overflow:&lt;/span&gt; &lt;span class="n"&gt;TextOverflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ellipsis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="nl"&gt;subtitle:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                 &lt;span class="s"&gt;"Lorem Ipsum has been the industry's standard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                 &lt;span class="nl"&gt;overflow:&lt;/span&gt; &lt;span class="n"&gt;TextOverflow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ellipsis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="nl"&gt;leading:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert_emoticon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="nl"&gt;size:&lt;/span&gt; &lt;span class="mf"&gt;60.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="nl"&gt;trailing:&lt;/span&gt; &lt;span class="n"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                 &lt;span class="n"&gt;Icons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;favorite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="p"&gt;),&lt;/span&gt;
             &lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="p"&gt;),&lt;/span&gt;
         &lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;FlexibleWrap&lt;/strong&gt;, you can easily create responsive and visually appealing layouts in your Flutter applications. It’s a powerful tool to help you manage space efficiently and enhance your UI design. &lt;/p&gt;

&lt;p&gt;Feel free to contribute to the project or report any issues on &lt;a href="https://github.com/bixat/flexible_wrap" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Happy coding!&lt;/p&gt;

&lt;p&gt;For further details, visit the &lt;a href="https://pub.dev/packages/flexible_wrap" rel="noopener noreferrer"&gt;FlexibleWrap package page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>ui</category>
    </item>
    <item>
      <title>Customizing Django Admin: A Comprehensive Guide to Overriding Admin Methods</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Sat, 09 Mar 2024 20:24:53 +0000</pubDate>
      <link>https://dev.to/m97chahboun/customizing-django-admin-a-comprehensive-guide-to-overriding-admin-methods-2j14</link>
      <guid>https://dev.to/m97chahboun/customizing-django-admin-a-comprehensive-guide-to-overriding-admin-methods-2j14</guid>
      <description>&lt;p&gt;In the world of web development, Django stands out as a powerful and flexible framework that simplifies the process of building complex web applications. One of the key features of Django is its built-in admin interface, which provides a ready-to-use interface for managing the data in your application. However, the default admin interface might not always meet the specific needs of your project. This is where the ability to override methods in the Admin class comes into play. In this article, we will explore some of the most commonly overridden methods in the Admin class, providing you with the tools to customize the Django admin interface to fit your project's requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Admin Class
&lt;/h2&gt;

&lt;p&gt;The Admin class in Django is a subclass of ModelAdmin, which is designed to provide a wide range of methods that can be overridden to customize the behavior of the admin interface for a specific model. These methods allow you to tailor the admin interface to your needs, from the form fields displayed to the actions available to the user.&lt;br&gt;
Common Methods to Override&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. get_form&lt;/strong&gt;&lt;br&gt;
This method allows you to customize the form used in the admin interface for a specific model. You can use it to add or remove fields, change field types, or add custom validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. get_queryset&lt;/strong&gt;&lt;br&gt;
This method allows you to customize the queryset used to retrieve objects for the admin interface. You can use it to filter the objects that are displayed in the admin interface based on certain conditions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. get_list_display&lt;/strong&gt;&lt;br&gt;
This method allows you to customize the fields that are displayed in the list view of the admin interface. You can use it to change the order of fields, add custom fields, or remove fields from the list view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. get_list_filter&lt;/strong&gt;&lt;br&gt;
This method allows you to customize the filters that are available in the list view of the admin interface. You can use it to add or remove filters based on the fields of your model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. get_search_fields&lt;/strong&gt;&lt;br&gt;
This method allows you to customize the fields that are searchable from the search box in the list view of the admin interface. You can use it to add or remove fields from the search functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. get_actions&lt;/strong&gt;&lt;br&gt;
This method allows you to customize the actions that are available in the list view of the admin interface. You can use it to add custom actions that can be applied to multiple objects at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. save_model&lt;/strong&gt;&lt;br&gt;
This method is called when an object is saved from the admin interface. You can override it to add custom save logic, such as logging changes or updating related objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. delete_model&lt;/strong&gt;&lt;br&gt;
This method is called when an object is deleted from the admin interface. You can override it to add custom delete logic, such as cascading deletes or logging deletions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. has_add_permission, has_change_permission, has_delete_permission, has_view_permission&lt;/strong&gt;&lt;br&gt;
These methods allow you to customize the permissions for adding, changing, deleting, and viewing objects in the admin interface. You can use them to implement custom permission logic based on the user or the object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. get_readonly_fields&lt;/strong&gt;&lt;br&gt;
This method allows you to specify fields that should be read-only in the admin interface. You can use it to prevent certain fields from being edited.&lt;br&gt;
Implementing Custom Admin Methods&lt;br&gt;
To implement custom admin methods, you need to create a subclass of ModelAdmin and override the methods you're interested in. Then, register your model with the custom admin class using admin.site.register. Here's an example of how you might override some of these methods in a custom Admin class for a model named MyModel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MyModel&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyModelAdmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelAdmin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Customize the form used in the admin interface
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the form here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;
    &lt;span class="c1"&gt;# Customize the queryset used to retrieve objects
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;queryset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the queryset here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;queryset&lt;/span&gt;
    &lt;span class="c1"&gt;# Customize the fields displayed in the list view
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_list_display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;list_display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_list_display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the list display here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list_display&lt;/span&gt;
    &lt;span class="c1"&gt;# Customize the filters available in the list view
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_list_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;list_filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_list_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the list filter here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list_filter&lt;/span&gt;
    &lt;span class="c1"&gt;# Customize the fields that are searchable
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_search_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;search_fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_search_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the search fields here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;search_fields&lt;/span&gt;
    &lt;span class="c1"&gt;# Customize the actions available
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_actions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;actions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_actions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the actions here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;
    &lt;span class="c1"&gt;# Custom save logic
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Custom save logic here
&lt;/span&gt;        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;save_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Custom delete logic
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Custom delete logic here
&lt;/span&gt;        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;delete_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Custom permission logic
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;has_add_permission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Custom permission logic here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;has_add_permission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Custom read-only fields
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_readonly_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;readonly_fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get_readonly_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Customize the read-only fields here
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;readonly_fields&lt;/span&gt;
&lt;span class="c1"&gt;# Register the custom admin class with the model
&lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyModelAdmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example demonstrates how to override some of the most commonly used methods in the Admin class. You can customize these methods further based on your specific requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Customizing the Django admin interface is a powerful way to tailor the admin experience to your project's needs. By overriding methods in the Admin class, you can add custom functionality, enforce specific permissions, and ensure that the admin interface is both user-friendly and secure. Whether you're adding custom actions, filtering objects, or customizing the form fields, the flexibility of the Django admin interface allows you to create a powerful and efficient admin experience for your application.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Enhancing Responsive Flutter App Development</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Mon, 26 Feb 2024 14:46:56 +0000</pubDate>
      <link>https://dev.to/m97chahboun/enhancing-responsive-flutter-app-development-55i6</link>
      <guid>https://dev.to/m97chahboun/enhancing-responsive-flutter-app-development-55i6</guid>
      <description>&lt;p&gt;The responsive template i have created for Flutter apps is designed to provide a flexible and dynamic user interface that adapts seamlessly to different screen sizes. It achieves this by employing a concept called UIConfigurations, which manages the configuration settings for various widgets based on the available screen space.&lt;br&gt;
UIConfigurations acts as a central repository for storing and organizing the configurations of individual widgets or entire screens. Each configuration item within UIConfigurations represents a specific widget or screen and contains the necessary settings and properties required to adjust its appearance and behavior based on the screen size.&lt;br&gt;
By utilizing UIConfigurations, your template allows developers to define different layouts, styles, and interactions for widgets and screens depending on the available screen real estate. This ensures that the app’s user interface remains consistent and optimized across a wide range of devices, including smartphones, tablets, and desktops.&lt;br&gt;
The flexibility provided by UIConfigurations enables developers to create responsive Flutter apps without having to manually handle each individual widget’s behavior for different screen sizes. Instead, they can rely on the predefined configurations within UIConfigurations, which can be easily accessed and applied to the corresponding widgets or screens.&lt;br&gt;
Overall, your responsive template for Flutter apps, powered by UIConfigurations, simplifies the development process and enhances the user experience by automatically adjusting the app’s UI elements to fit the screen size, resulting in a visually appealing and user-friendly interface on any device.&lt;br&gt;
&lt;a href="https://github.com/bixat/flutter_responsive_template" rel="noopener noreferrer"&gt;https://github.com/bixat/flutter_responsive_template&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;br&gt;
And you can use ui configuration like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:responsive_template/constants/styles.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:responsive_template/responsiveness/extensions.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:responsive_template/ui/home/widgets/body.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeScreen&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;homeConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;backgroundColor:&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
              &lt;span class="n"&gt;Padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;8.0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textTheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayMedium&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
                      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="n"&gt;FontSizes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s48&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="p"&gt;),&lt;/span&gt;
              &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Expanded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Introducing GitHub Snitch: Automate Bug Reporting and Issue Management</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Sat, 17 Feb 2024 16:49:57 +0000</pubDate>
      <link>https://dev.to/m97chahboun/introducing-github-snitch-automate-bug-reporting-and-issue-management-2d57</link>
      <guid>https://dev.to/m97chahboun/introducing-github-snitch-automate-bug-reporting-and-issue-management-2d57</guid>
      <description>&lt;p&gt;GitHub Snitch is a versatile Flutter package that simplifies the process of reporting bugs and managing issues on GitHub. With its comprehensive set of features, GitHub Snitch empowers developers to automate bug reporting, submit comments on existing issues, and efficiently handle error tracking. In this article, we will explore the key features of GitHub Snitch, its usage, and how it can enhance your GitHub workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features:
&lt;/h2&gt;

&lt;p&gt;GitHub Snitch offers a range of powerful features that streamline bug reporting and issue management. Let's take a closer look at what GitHub Snitch has to offer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automated Bug Reporting:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub Snitch enables developers to automatically report bugs on GitHub issues. By calling the listenToExceptions method in the main function, developers can configure GitHub Snitch to create issues with specific labels, assignees, and milestones. This feature saves valuable time and ensures efficient bug tracking.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manual Bug Reporting:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In addition to automated bug reporting, GitHub Snitch also allows developers to manually report bugs using the report method. This method provides flexibility, enabling developers to report issues with customized details, including titles, descriptions, screenshots, labels, assignees, and milestones.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Offline Support:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub Snitch is equipped with offline support, allowing developers to save bug reports locally and submit them later when a connection becomes available. This feature ensures that no bug report is lost even in challenging network conditions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Comprehensive Issue Management:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub Snitch provides seamless integration with GitHub's issue management system. Developers can retrieve reported issues along with all associated comments, allowing for efficient collaboration and tracking of issue resolutions. GitHub Snitch also enables users to submit comments on existing issues, facilitating effective communication between developers and repository owners.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enhanced Issue Clarification:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub Snitch allows developers to include screenshots in their bug reports, providing better issue clarification. By attaching relevant screenshots, developers can enhance the understanding of the reported issues, leading to quicker resolutions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Duplicate Issue Handling:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub Snitch intelligently handles duplicate bug reports by automatically adding a comment (+1) to the duplicate issues. This feature helps consolidate duplicated reports, reducing redundancy and improving issue management efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upcoming Features:
&lt;/h2&gt;

&lt;p&gt;GitHub Snitch is continuously evolving to meet the needs of developers. Some of the upcoming features in the pipeline include:&lt;/p&gt;

&lt;p&gt;Notifications for Chat:&lt;br&gt;
GitHub Snitch plans to introduce support for notifications, enabling developers to engage in real-time conversations with users and repository owners. This feature will facilitate efficient communication and collaboration within the GitHub ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for Effective Usage:
&lt;/h2&gt;

&lt;p&gt;To maximize the benefits of GitHub Snitch, here are a few tips to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Empty Repositories for Bug Reporting:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is recommended to use empty repositories dedicated to bug reporting. This practice allows developers to transfer important items from the empty repository to the main repository seamlessly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilize External Image Hosting for Screenshots:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When including screenshots in issue comments, it is advisable to use external image hosting services. Uploading screenshots to external websites and adding the image links to comments ensures smooth rendering and avoids any limitations associated with using screenshots directly from GitHub repositories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leverage Ready Screens or Customize Your Own:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub Snitch provides flexible options for reporting bugs and issues. Developers can choose to utilize ready-made screens by calling GhSnitch.openReportScreen(context), or they can build their own screens using methods like GhSnitch.report and GhSnitch.submitComment. Tailor the bug reporting process to suit your specific requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started:
&lt;/h2&gt;

&lt;p&gt;To begin using GitHub Snitch, follow these steps:&lt;/p&gt;

&lt;p&gt;Install the GitHub Snitch package.&lt;br&gt;
Generate a fine-grained personal access token with the necessary repository permissions, including "Issues Access: Read and write".&lt;br&gt;
Store the sensitive keys, such as the personal access token, owner username, and repository name, using environment variables.&lt;br&gt;
Usage:&lt;br&gt;
To integrate GitHub Snitch into your application, follow these steps:&lt;br&gt;
Pass the necessary keys as --dart-define parameters when running or building the app.&lt;br&gt;
Initialize GitHub Snitch using the environment keys.&lt;br&gt;
Utilize GitHub Snitch's methods, such as report and listenToExceptions, to report bugs, listen to exceptions, and manage issues.&lt;/p&gt;

&lt;p&gt;GitHub Snitch is a powerful Flutter package that simplifies bug reporting and issue management on GitHub. By automating bug reports, facilitating issue comments, and offering comprehensive issue management capabilities, GitHub Snitch empowers developers to streamline their workflow and enhance collaboration. If you're looking to improve your GitHub workflow, GitHub Snitch is an excellent tool to consider. Start leveraging GitHub Snitch today and experience efficient and effective bug reporting and issue management on GitHub.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Guide to Using Any Programming Language in GitHub Actions</title>
      <dc:creator>CHAHBOUN Mohammed</dc:creator>
      <pubDate>Thu, 20 Oct 2022 18:49:59 +0000</pubDate>
      <link>https://dev.to/m97chahboun/how-to-use-any-programming-language-on-github-workflow-399m</link>
      <guid>https://dev.to/m97chahboun/how-to-use-any-programming-language-on-github-workflow-399m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Cover: Captured from flutter CI/CD Template (not published &lt;br&gt;
yet)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Many times we need to process some data before using it in our Github workflows, but we don't find the appropriate action.&lt;br&gt;
For that, I did some research on how we can use any programming language to process our data easily &amp;amp; use it on Github workflow&lt;br&gt;
I found this example on &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter" rel="noopener noreferrer"&gt;Github Doc&lt;/a&gt; :&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
As you see we can save some output on GITHUB_OUTPUT &amp;amp; use it later in&lt;br&gt;
GITHUB_OUTPUT. It's the path of a temporary file generated by the runner.&lt;br&gt;
Now we will use some programming language (Dart for an example) to process some data &amp;amp; use it on our Github workflow&lt;br&gt;
We will use an example for Bump Flutter app version using this &lt;a href="https://rubygems.org/gems/fastlane-plugin-flutter_bump_version" rel="noopener noreferrer"&gt;Fastlane plugin&lt;/a&gt; based on PR's labels&lt;br&gt;
Now this is the dart script :&lt;br&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
We process input data by removing all labels except major, minor &amp;amp; patch, and split it by (,)&lt;br&gt;
Then in line 16 we get environment variables &amp;amp; select GITHUB_OUTPUT in line 17 to get the path of the temporary file generated by the runner&lt;br&gt;
After it, we open the file by Dart &amp;amp; write our output ({name}={value}) that we need in Github workflow&lt;br&gt;
Now we will create our Github workflow &amp;amp; use the Dart script onto it&lt;br&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;
First, we need to use a setup for Dart lang action (line 18) (or any language used).&lt;br&gt;
Then on line 21 we run the Dart script and pass PR labels as args &amp;amp; this script will return just the labels we need for the bump version (patch,minor, major) &amp;amp; in line 37 we use (env.parts) as the output of the script to use it as an input for the bump version by &lt;a href="https://rubygems.org/gems/fastlane-plugin-flutter_bump_version" rel="noopener noreferrer"&gt;Fastlane plugin&lt;/a&gt;&lt;br&gt;
Now when merging PR. The workflow will get labels &amp;amp; remove unused labels by Dart script &amp;amp; pass the output to &lt;a href="https://rubygems.org/gems/fastlane-plugin-flutter_bump_version" rel="noopener noreferrer"&gt;Fastlane plugin&lt;/a&gt; to bump the version &amp;amp; push a new commit&lt;br&gt;
You can use these steps on any programming language

</description>
    </item>
  </channel>
</rss>
