<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-4112172627431459458</id><updated>2026-03-24T21:30:08.272+08:00</updated><category term="Programming"/><category term="Arduino"/><category term="Electronics"/><category term="CSharp"/><category term="Projects"/><category term="Spare Time"/><category term="Hardware"/><category term="Dart"/><category term="Flutter"/><category term="Python"/><category term="College Exercises"/><category term="MySQL"/><category term="PHP"/><category term="Troubleshooting"/><category term="Errors &amp; Solutions"/><category term="REST API"/><category term="Java"/><category term="Kicad"/><category term="Software"/><category term="Desktop"/><category term="DevExpress"/><category term="Gist"/><category term="Laravel"/><category term="Windows Form"/><category term="3D"/><category term="ATmega8"/><category term="Globe"/><category term="LDR"/><category term="POSTMAN"/><category term="Queueing"/><category term="SQLite"/><category term="Talkie"/><category term="Tutorials"/><category term="Web"/><category term=".NET"/><category term="3310"/><category term="5110"/><category term="API"/><category term="APScheduler"/><category term="Android"/><category term="BeautifulSoup"/><category term="Bluetooth"/><category term="Chrome Extension"/><category term="Computer Vision"/><category term="Console"/><category term="Debugging"/><category term="EasyUI"/><category term="FTP"/><category term="FileSystemWatcher"/><category term="GCode"/><category term="GPS"/><category term="GSM"/><category term="GUI"/><category term="Git"/><category term="Google Maps"/><category term="Gyroscope"/><category term="H-Bridge"/><category term="Html"/><category term="Inno Script"/><category term="Installation"/><category term="Interface"/><category term="JQuery"/><category term="Joystick605620"/><category term="Keypad 4x4"/><category term="L293D"/><category term="LED"/><category term="Laravel Passport"/><category term="Library"/><category term="Linux"/><category term="Location"/><category term="MAX232"/><category term="MSP-FET430UIF"/><category term="Microcontroller"/><category term="Mock"/><category term="Nokia"/><category term="OpenCV"/><category term="OpenPyxl"/><category term="POV"/><category term="Pandas"/><category term="PyQt5"/><category term="RC"/><category term="RPI-1031"/><category term="SQL"/><category term="SSH.Net"/><category term="Schematic"/><category term="Scrapy"/><category term="Sensor"/><category term="Setup"/><category term="Sinewave"/><category term="Source Tree"/><category term="Supabase"/><category term="Tkinter"/><category term="VB6"/><category term="Virtual COM Ports"/><category term="Wireless"/><category term="XtraReport"/><category term="com0com"/><category term="node"/><category term="npm"/><title type="text">tarsier-marianz</title><subtitle type="html">A thoughtfully curated collection of insightful materials, practical solutions, and valuable information focused on technology, programming, and personal development. It features a compilation of my experiments, personal projects, snippets, and real-world errors and solutions encountered along the way. Serving as a go-to reference and support hub, this blog is designed to help readers tackle challenges, learn new skills, and grow both personally and professionally.</subtitle><link href="https://tarsier-marianz.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default?redirect=false" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" rel="next" type="application/atom+xml"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>72</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" content="noindex" name="robots"/><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-2879822059358747118</id><published>2025-03-29T23:56:00.005+08:00</published><updated>2025-03-29T23:56:45.209+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><title type="text">&#128293; How to Create a Beautiful Custom Arrow Button in Flutter with Ripple Effect</title><content type="html">&lt;div class="separator" style="clear: both;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZmVSP6RZGIF6qv_0xw3WPfLzAjGgYPd69lLImRuCI-_i9dt6d79_Kl9WnxUXBmKHDl-_5nDeTkfJYqxw0oGYb3roc17ExXAM_68bV3oRMEG6E8tUHS9h6gENn8YZm7LYU_P0iCvZg-MYkuj38AuQUX6LYBeKJOZjT1xmyY89QL6U-wWfyBb_Zgo6L1mVH/s1600/thumbnail-blog-43.png" style="display: block; padding: 1em 0px; text-align: center;"&gt;&lt;img alt="" border="0" data-original-height="800" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZmVSP6RZGIF6qv_0xw3WPfLzAjGgYPd69lLImRuCI-_i9dt6d79_Kl9WnxUXBmKHDl-_5nDeTkfJYqxw0oGYb3roc17ExXAM_68bV3oRMEG6E8tUHS9h6gENn8YZm7LYU_P0iCvZg-MYkuj38AuQUX6LYBeKJOZjT1xmyY89QL6U-wWfyBb_Zgo6L1mVH/s600/thumbnail-blog-43.png" width="600" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p data-end="412" data-start="200"&gt;In this article, we'll walk you through how to build a &lt;strong data-end="279" data-start="255"&gt;custom button widget&lt;/strong&gt; in Flutter that looks modern, stylish, and functional — similar to what you would see in &lt;a href="https://camo.envatousercontent.com/7c2a0b7047dec8b92ce333fe39955a753dcef9a4/687474703a2f2f62656e7a6174696e65696e666f746563682e636f6d2f686f6d6570726f647563742f4f6e6c696e6573656c6c696e672f53746570436f756e746572416e64726f69644e61746976654170702f3033757064617465646665622e706e67" target="_blank"&gt;fitness apps&lt;/a&gt; showing total calories burned.&lt;/p&gt;
&lt;p data-end="612" data-start="414"&gt;We’ll add:&amp;nbsp;&lt;/p&gt;&lt;p data-end="612" data-start="414"&gt;✅ Unique &lt;strong data-end="454" data-start="434"&gt;Arrow Clip Shape&lt;/strong&gt;&lt;br data-end="457" data-start="454" /&gt;
✅ Smooth &lt;strong data-end="485" data-start="466"&gt;Rounded Corners&lt;/strong&gt;&lt;br data-end="488" data-start="485" /&gt;
✅ Optional &lt;strong data-end="522" data-start="499"&gt;Gradient Background&lt;/strong&gt;&lt;br data-end="525" data-start="522" /&gt;
✅ Proper &lt;strong data-end="551" data-start="534"&gt;Ripple Effect&lt;/strong&gt; on tap&lt;br data-end="561" data-start="558" /&gt;
✅ Customizable content (title, icon, color, radius, etc).&lt;/p&gt;&lt;p data-end="612" data-start="414"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p data-end="612" data-start="414"&gt;Flutter provides great built-in buttons like &lt;code data-end="714" data-start="698"&gt;ElevatedButton&lt;/code&gt; and &lt;code data-end="731" data-start="719"&gt;TextButton&lt;/code&gt;, but sometimes you need a more visually appealing, &lt;strong data-end="809" data-start="783"&gt;app-specific component&lt;/strong&gt; to match your design language.&lt;br data-end="843" data-start="840" /&gt;
This is exactly what we’ll achieve.&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN9wp9xsiVSk8F2z54rGHMLpCPLVPJ33_ebSeJY4rmwugZ2t3rHApDVj_NKYDI3qyXbpZzrzZgWluAhhzmHzqQHrqFQ13bLuP4Ikie_s90q5cO3Ekgf-wDGsCWJXokn5gjZAtJn1g51RHaztD3sUxVjSQwa2M-NFvQe-bb-wAAq7NPigQn_WUN1kMeBS2z/s1520/custom%20button.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1520" data-original-width="720" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN9wp9xsiVSk8F2z54rGHMLpCPLVPJ33_ebSeJY4rmwugZ2t3rHApDVj_NKYDI3qyXbpZzrzZgWluAhhzmHzqQHrqFQ13bLuP4Ikie_s90q5cO3Ekgf-wDGsCWJXokn5gjZAtJn1g51RHaztD3sUxVjSQwa2M-NFvQe-bb-wAAq7NPigQn_WUN1kMeBS2z/w304-h640/custom%20button.png" width="304" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;&#128736;️ How to Implement&lt;/h2&gt;&lt;h4 style="text-align: left;"&gt;1. Create an Arrow Clipper&lt;/h4&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;

&lt;p data-end="1402" data-start="1334" style="text-align: left;"&gt;We need to clip the left side of the button into an &lt;strong data-end="1401" data-start="1386"&gt;arrow shape&lt;/strong&gt;:&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ArrowClipper&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;CustomClipper&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Path&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Path&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;getClip(Size&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;size)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;radius&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;path&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Path();&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.moveTo(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;radius);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.quadraticBezierTo(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;radius,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.lineTo(size.width&lt;/span&gt; &lt;span style="color: #f92672;"&gt;*&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0.80&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.lineTo(size.width,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;size.height&lt;/span&gt; &lt;span style="color: #f92672;"&gt;/&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.lineTo(size.width&lt;/span&gt; &lt;span style="color: #f92672;"&gt;*&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0.80&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;size.height);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.lineTo(radius,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;size.height);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.quadraticBezierTo(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;size.height,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;size.height&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;radius);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;path.close();&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;path;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;bool&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;shouldReclip(covariant&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;CustomClipper&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Path&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;oldClipper)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h3 data-end="2037" data-start="2000"&gt;2. Build the Custom Button Widget&lt;/h3&gt;
&lt;p data-end="2087" data-start="2039"&gt;Here’s the full reusable &lt;code data-end="2079" data-start="2064"&gt;CalorieButton&lt;/code&gt; widget:&lt;/p&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;CalorieButton&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;value;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;VoidCallback&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;onTap;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;borderRadius;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;solidColor;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;title;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IconData&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;icon;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;height;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;width;&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;CalorieButton({&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;super&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.key,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.value,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.onTap,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.borderRadius&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.gradientColors,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.solidColor&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.title&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Total Calories'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'kCal'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.icon&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;LucideIcons.flame,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.height&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;70&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.width&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;250&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Material(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.white,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;elevation:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;borderRadius:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BorderRadius.circular(borderRadius),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;clipBehavior:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Clip.antiAlias,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;InkWell(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;onTap:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;onTap,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;splashColor:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors[&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;].withOpacity(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0.2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;SizedBox(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;height:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;height,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;width,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Row(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
              &lt;span style="color: #75715e;"&gt;// Left arrow shape&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;ClipPath(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;clipper:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ArrowClipper(),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;80&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;decoration:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BoxDecoration(&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;gradient:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;LinearGradient(&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;colors:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;begin:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Alignment.topLeft,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;end:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Alignment.bottomRight,&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #75715e;"&gt;//color: gradientColors == null ? solidColor : null,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Center(&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Icon(&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;icon,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.white,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;size:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;28&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;

              &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;SizedBox(width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;

              &lt;span style="color: #75715e;"&gt;// Text content&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;Expanded(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Column(&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MainAxisAlignment.center,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;crossAxisAlignment:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;CrossAxisAlignment.start,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;title,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.grey[&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;600&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;fontSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;14&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;SizedBox(height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
                      &lt;span style="color: #e6db74;"&gt;'$&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;value&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors[&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;fontSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;fontWeight:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FontWeight.bold,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;SizedBox(height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;??&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;''&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.grey,&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;fontSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;12&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;

              &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Padding(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;padding:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.only(right:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Icon(&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;Icons.chevron_right,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.grey,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;size:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;24&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;h4 style="text-align: left;"&gt;3. Example Usage:&lt;/h4&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;CalorieButton(&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;value:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4800&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Total Steps'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;description:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Steps'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;icon:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;LucideIcons.footprints,&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;onTap:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{},&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;gradientColors:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;Colors.red,&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;Color(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0xFFcd2828&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;Color(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0xFF982121&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;Color(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0xFF761313&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/2879822059358747118/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2025/03/how-to-create-beautiful-custom-arrow.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/2879822059358747118" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/2879822059358747118" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2025/03/how-to-create-beautiful-custom-arrow.html" rel="alternate" title="&#128293; How to Create a Beautiful Custom Arrow Button in Flutter with Ripple Effect" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZmVSP6RZGIF6qv_0xw3WPfLzAjGgYPd69lLImRuCI-_i9dt6d79_Kl9WnxUXBmKHDl-_5nDeTkfJYqxw0oGYb3roc17ExXAM_68bV3oRMEG6E8tUHS9h6gENn8YZm7LYU_P0iCvZg-MYkuj38AuQUX6LYBeKJOZjT1xmyY89QL6U-wWfyBb_Zgo6L1mVH/s72-c/thumbnail-blog-43.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-2575714960607910941</id><published>2025-01-17T20:50:00.002+08:00</published><updated>2025-01-18T18:01:26.085+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><title type="text">Creating a Laravel Command to Clear Log Files</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHdY8fH6fa7qQb03UBZzqvVCquIkRqfxnXjK-quABeIS9IderxGJnxNcELyqr0N2L1lV2ihQNyv7oFdn4ts0CB0eESuYOcJcK_boGttMpeH_O6OcHiEDSmBfpdcilIrzgeoHzUZF4ubQsPL4DlLR_cQyvHk2tNQPwMgPT5CZMqJJATORzGhXRkkBKXOg/s1190/laravel-logs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="388" data-original-width="1190" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHdY8fH6fa7qQb03UBZzqvVCquIkRqfxnXjK-quABeIS9IderxGJnxNcELyqr0N2L1lV2ihQNyv7oFdn4ts0CB0eESuYOcJcK_boGttMpeH_O6OcHiEDSmBfpdcilIrzgeoHzUZF4ubQsPL4DlLR_cQyvHk2tNQPwMgPT5CZMqJJATORzGhXRkkBKXOg/w640-h208/laravel-logs.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;In this tutorial, we’ll create a custom Laravel console command to clean up old log files in the &lt;code&gt;&lt;span style="color: #e69138;"&gt;storage/logs&lt;/span&gt;&lt;/code&gt; directory, while preserving the &lt;code&gt;&lt;span style="color: #e69138;"&gt;.gitignore&lt;/span&gt;&lt;/code&gt; file. This is useful for maintaining a clean server and saving disk space.&lt;p&gt;&lt;/p&gt;&lt;p&gt;Laravel logs application activities in the &lt;code&gt;&lt;span style="color: #e69138;"&gt;storage/logs&lt;/span&gt;&lt;/code&gt; directory. Over time, these logs can accumulate and occupy significant storage space. Deleting these files manually can be tedious, so we'll automate the process with a custom Artisan command.&lt;/p&gt;
&lt;h3&gt;Steps:&lt;/h3&gt;
&lt;strong&gt;1. Generate the Console Command&lt;/strong&gt;&lt;br /&gt;Run the following Artisan command to create a new console command:&lt;br /&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;php&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;artisan&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;make:command&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ClearLogFiles&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;2. Edit the Command&lt;/strong&gt;&lt;br /&gt;Open the generated file located in &lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;app/Console/Commands/ClearLogFiles.php&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;3. Update the Command Logic&lt;/strong&gt;&lt;br /&gt;Replace the contents of the file with the following:
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;namespace&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;App\Console\Commands&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;use&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Illuminate\Console\Command&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;use&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Illuminate\Support\Facades\File&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ClearLogFiles&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Command&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #e6db74;"&gt;/**&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     * The name and signature of the console command.&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     *&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     * @var string&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     */&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;protected&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$signature&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'logs:clear'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

    &lt;span style="color: #e6db74;"&gt;/**&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     * The console command description.&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     *&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     * @var string&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     */&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;protected&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Clear all log files in storage/logs except .gitignore'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

    &lt;span style="color: #e6db74;"&gt;/**&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     * Execute the console command.&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     *&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     * @return int&lt;/span&gt;
&lt;span style="color: #e6db74;"&gt;     */&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;handle&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;$logPath&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;storage_path&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'logs'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Get the full path to the logs directory&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Check if the logs directory exists&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;is_dir($logPath))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;error&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'The logs directory does not exist.'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Get all files in the logs directory&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;$files&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;File&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;files&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($logPath);&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;foreach&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($files&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$file)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #75715e;"&gt;// Skip the .gitignore file&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($file&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getFilename&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;!==&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'.gitignore'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #a6e22e;"&gt;File&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;delete&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($file&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getPathname&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;());&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Delete the file&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;info&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Log files cleared successfully, except .gitignore.'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;strong&gt;4. Register the Command (Optional)&lt;/strong&gt;&lt;br /&gt;Open &lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;app/Console/Kernel.php&lt;/b&gt;&lt;/span&gt;&lt;/code&gt; and add the command to the &lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;$commands&lt;/b&gt;&lt;/span&gt;&lt;/code&gt; array:
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;protected&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$commands&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
    &lt;span style="color: #a6e22e;"&gt;\App\Console\Commands\ClearLogFiles&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;class&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;];&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
  &lt;strong&gt;5. Run the Command&lt;/strong&gt;&lt;br /&gt;Use the following Artisan command to clear the logs
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;php&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;artisan&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;logs:clear&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Why Preserve &lt;code&gt;.gitignore&lt;/code&gt;?&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;.gitignore&lt;/span&gt;&lt;/b&gt;&lt;/code&gt; file is essential in projects using Git. It ensures the &lt;b&gt;&lt;span style="color: #e69138;"&gt;&lt;code&gt;logs&lt;/code&gt; &lt;/span&gt;&lt;/b&gt;directory is excluded from version control while keeping the folder structure intact. Deleting it may cause unnecessary errors.&lt;/p&gt;&lt;p&gt;This command simplifies log management in your Laravel application, keeping your server clean and efficient.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/2575714960607910941/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2025/01/creating-laravel-command-to-clear-log.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/2575714960607910941" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/2575714960607910941" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2025/01/creating-laravel-command-to-clear-log.html" rel="alternate" title="Creating a Laravel Command to Clear Log Files" type="text/html"/><author><name>Mar</name><uri>http://www.blogger.com/profile/13191156366773651504</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//1.bp.blogspot.com/-kTOceCWfl48/Z1riVgNK7uI/AAAAAAAAApY/Hvvyd7vktTsWkQXir5xVPyccjikIc8yGQCK4BGAYYCw/s1600/ACg8ocLO63CIO9zSJgUOxboEI3UczkxXdsoNAnn0Ui_REUghAPfGiuQZ%253Ds83-c-mo" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKHdY8fH6fa7qQb03UBZzqvVCquIkRqfxnXjK-quABeIS9IderxGJnxNcELyqr0N2L1lV2ihQNyv7oFdn4ts0CB0eESuYOcJcK_boGttMpeH_O6OcHiEDSmBfpdcilIrzgeoHzUZF4ubQsPL4DlLR_cQyvHk2tNQPwMgPT5CZMqJJATORzGhXRkkBKXOg/s72-w640-h208-c/laravel-logs.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-6225761812590261830</id><published>2024-12-22T01:22:00.010+08:00</published><updated>2024-12-24T11:24:05.331+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><title type="text">How to Create and Publish a Dart/Flutter Package to pub.dev</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQnqMqAABZuuyOwiz0atYqgv-7e9a0qqKjPzhPFbRwb4OyZJqaqQ4d40d1CbXssgWGr53UWNltF8mOEZGDpjuTtralBW5WatgWTfLVXgWb7JU1H_prEc2Oj8t1RYJ1kl3SbW3VUUTH19Qgu42fbvTzWZY-h8IZZGh5V3Mjq1CHHUkyvKAggHrc6CZCZfs/s996/flutter_package.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="367" data-original-width="996" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQnqMqAABZuuyOwiz0atYqgv-7e9a0qqKjPzhPFbRwb4OyZJqaqQ4d40d1CbXssgWGr53UWNltF8mOEZGDpjuTtralBW5WatgWTfLVXgWb7JU1H_prEc2Oj8t1RYJ1kl3SbW3VUUTH19Qgu42fbvTzWZY-h8IZZGh5V3Mjq1CHHUkyvKAggHrc6CZCZfs/w640-h236/flutter_package.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Creating and publishing a Dart/Flutter package to &lt;code&gt;pub.dev&lt;/code&gt; allows you to share your code with the community. This guide will take you through the entire process step-by-step—from creating a package project to publishing it.&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Step 1: Create a New Package&lt;/h2&gt;&lt;h3&gt;Using the Dart Command Line&lt;/h3&gt;&lt;p&gt;Run the following command to create a new package:&lt;/p&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: white;"&gt;create&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: white;"&gt;t&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;package&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;simple&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;your_package_name&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Replace &lt;span style="color: #e69138;"&gt;&lt;code&gt;your_package_name&lt;/code&gt; &lt;/span&gt;with the name of your package. In my case &lt;a href="https://pub.dev/packages/tarsier_logger" target="_blank"&gt;tarsier_logger &lt;/a&gt;is the name of my package. This command generates a new Dart package with a basic structure.&lt;/p&gt;&lt;h3&gt;Using the Flutter Command Line (if it's a Flutter package)&lt;/h3&gt;&lt;p&gt;For Flutter-specific packages, use:&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #a6e22e;"&gt;flutter&lt;/span&gt; &lt;span style="color: white;"&gt;create&lt;/span&gt; &lt;span style="color: #f92672;"&gt;--&lt;/span&gt;&lt;span style="color: white;"&gt;template&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;package&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;your_package_name&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Folder Structure&lt;/h3&gt;&lt;p&gt;Your package folder will look like this:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #a6e22e;"&gt;your_package_name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;lib&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;└──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;your_package_name&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;dart&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;test&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;pubspec&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;yaml&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;README&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;md&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;CHANGELOG&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;md&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;LICENSE&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h2&gt;Step 2: Implement Your Package Code&lt;/h2&gt;&lt;h3&gt;Edit the Main Library File&lt;/h3&gt;&lt;p&gt;Open the &lt;code&gt;&lt;span style="color: #e69138;"&gt;lib/your_package_name.dart&lt;/span&gt;&lt;/code&gt; file and add your functionality. For example:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;library&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;your_package_name;&lt;/span&gt;

&lt;span style="color: #75715e;"&gt;/// A simple utility to greet users.&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Greeter&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name;&lt;/span&gt;

  &lt;span style="color: #f8f8f2;"&gt;Greeter(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.name);&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;/// Returns a greeting message.&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;greet()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Hello, $&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;!'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This is where you build your package logic, classes, or widgets. In my created package &lt;a href="https://github.com/marianz-bonfire/tarsier_logger/blob/master/lib/src/tarsier_logger_base.dart" target="_blank"&gt;tarsier_logger&lt;/a&gt;, this is what it looks like.&amp;nbsp;&lt;span&gt;&lt;a href="https://github.com/marianz-bonfire/tarsier_logger/blob/master/lib/src/tarsier_logger_base.dart"&gt; 
  &lt;img alt="Github Code Badge" src="https://img.shields.io/badge/github-code-blue" /&gt;
&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Step 3: Add Metadata in &lt;code&gt;pubspec.yaml&lt;/code&gt;&lt;/h2&gt;&lt;p&gt;Edit the &lt;code&gt;&lt;span style="color: #e69138;"&gt;pubspec.yaml&lt;/span&gt;&lt;/code&gt; file to include essential metadata:&lt;/p&gt;&lt;/div&gt; &lt;!--HTML generated using hilite.me--&gt;
    &lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;your_package_name&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;A&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Dart&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Flutter&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;package&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;for&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;greeting&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;version&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;homepage&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;https&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;://&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;github&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;com&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;/&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;yourusername&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;/&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;your_package_name&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;environment&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;sdk&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"&amp;gt;=2.18.0 &amp;lt;3.0.0"&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;dependencies&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
  &lt;span style="color: #75715e;"&gt;#&lt;/span&gt; &lt;span style="color: #75715e;"&gt;Add package dependencies here&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;dev_dependencies&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;test&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;^&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;22&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Key fields:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt;: Unique package name.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;description&lt;/code&gt;&lt;/strong&gt;: A short summary of what your package does.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;version&lt;/code&gt;&lt;/strong&gt;: Start with &lt;code&gt;1.0.0&lt;/code&gt; for new packages.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;environment.sdk&lt;/code&gt;&lt;/strong&gt;: Defines the compatible Dart SDK versions.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Step 4: Add Documentation&lt;/h2&gt;&lt;h3&gt;Create a &lt;code&gt;README.md&lt;/code&gt; File&lt;/h3&gt;&lt;p&gt;Write a clear and concise &lt;code&gt;README.md&lt;/code&gt; that describes your package. Include usage examples, like this:&lt;/p&gt;&lt;/div&gt;
 &lt;!--HTML generated using hilite.me--&gt;
&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; color: white; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;   &lt;span style="color: white;"&gt;#&lt;/span&gt;&lt;span style="color: white;"&gt; your_package_name&lt;/span&gt;

&lt;span style="color: white;"&gt;A Dart/Flutter package for greeting users.&lt;/span&gt;

&lt;span style="color: white;"&gt;## Usage&lt;/span&gt;
&lt;span style="color: white;"&gt;
```dart
import 'package:your_package_name/your_package_name.dart';

void main() {
  var greeter = Greeter('Alice');
  print(greeter.greet()); // Output: Hello, Alice!
}
&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Add a &lt;span style="font-family: monospace;"&gt;&lt;span style="font-size: 15.21px;"&gt;CHANGELOG&amp;nbsp;&lt;/span&gt;&lt;/span&gt;File&lt;/h3&gt;&lt;p&gt;Contains the version and its changes. Example:&lt;/p&gt;&lt;/div&gt; 
&lt;!--HTML generated using hilite.me--&gt;
&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; color: white; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;   &lt;span style="color: white;"&gt;### Add a `CHANGELOG.md` File&lt;/span&gt;
&lt;span style="color: white;"&gt;Document changes for each version. Example:&lt;/span&gt;
&lt;span style="color: white;"&gt;
```markdown
&lt;/span&gt;
&lt;span style="color: white;"&gt;#&lt;/span&gt;&lt;span style="color: white;"&gt; CHANGELOG&lt;/span&gt;

&lt;span style="color: white;"&gt;## [1.0.0] - YYYY-MM-DD&lt;/span&gt;
&lt;span style="color: white;"&gt;### Added&lt;/span&gt;
&lt;span style="color: white;"&gt;
- Initial release of the package.
- Added `Greeter` class for greeting users.
&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Add a &lt;code&gt;LICENSE&lt;/code&gt; File&lt;/h3&gt;&lt;p&gt;Use a standard open-source license like MIT. Example:&lt;/p&gt;&lt;/div&gt;   &lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; color: white; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;   &lt;span style="color: white;"&gt;MIT License&lt;/span&gt;
&lt;span style="color: white;"&gt;Copyright (c) 2024 Your Name&lt;/span&gt;

&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Step 5: Test Your Package&lt;/h2&gt;&lt;p&gt;Write unit tests in the &lt;code&gt;test&lt;/code&gt; folder. Example:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:your_package_name/your_package_name.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:test/test.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;main()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;test(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Greeter should return correct greeting'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;greeter&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Greeter(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Alice'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;expect(greeter.greet(),&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Hello, Alice!'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Run tests using:&lt;/div&gt;   &lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; color: white; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: white;"&gt;test&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Step 6: Prepare for Publishing&lt;/h2&gt;&lt;h3&gt;Verify Your Package&lt;/h3&gt;&lt;p&gt;Run this command to check your package for potential issues:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;pub&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;publish&lt;/span&gt; &lt;span style="color: #f92672;"&gt;--&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;dry&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;run&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
or&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;pub&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;publish&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;n&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Fix any errors or warnings, such as missing &lt;code&gt;README.md&lt;/code&gt;, &lt;code&gt;CHANGELOG.md&lt;/code&gt;, or &lt;code&gt;LICENSE&lt;/code&gt; files.&lt;/p&gt;&lt;h3&gt;Format Your Code (Optional)&lt;/h3&gt;&lt;p&gt;Ensure your code is properly formatted:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;format&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt; .&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Step 7: Publish Your Package&lt;/h2&gt;&lt;h3&gt;Authenticate with pub.dev&lt;/h3&gt;&lt;p&gt;If this is your first time publishing, authenticate with &lt;code&gt;pub.dev&lt;/code&gt; using:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;pub&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt; login&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;In my case, I used Android Studio in development and already logged-in to my account so I am not required and no need to run the above command.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Publish Your Package&lt;/h3&gt;&lt;p&gt;When ready, publish your package:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ffde59;"&gt;dart&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;pub&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt; publish&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Follow the prompts to confirm the upload.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGO7TX9iAnjY3FnaOhBBKvP1IeoArURjz_bu_tUW6-4XUKUkKoGnNAfG2-h6YOyeVY0ly9EUo68EW6gtG7Jv4Q2qA5Kq15vZRgcNxakFFR9YkocTMOekaodTV4Xbq5MTAEzzMIFfIKyoK0N56vaMT9d-kOjJvSGcXArI0PLjSw-iu6yM6dwfeSi0tjiJY/s996/flutter_package.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="367" data-original-width="996" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGO7TX9iAnjY3FnaOhBBKvP1IeoArURjz_bu_tUW6-4XUKUkKoGnNAfG2-h6YOyeVY0ly9EUo68EW6gtG7Jv4Q2qA5Kq15vZRgcNxakFFR9YkocTMOekaodTV4Xbq5MTAEzzMIFfIKyoK0N56vaMT9d-kOjJvSGcXArI0PLjSw-iu6yM6dwfeSi0tjiJY/w640-h236/flutter_package.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h2&gt;Step 8: Verify on pub.dev&lt;/h2&gt;&lt;p&gt;Once published, visit your package page on &lt;code&gt;pub.dev&lt;/code&gt;:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;https://pub.dev/packages/your_package_name&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Check that:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;code&gt;README.md&lt;/code&gt; renders correctly.&lt;/li&gt;&lt;li&gt;The documentation is clear and includes examples.&lt;/li&gt;&lt;li&gt;All metadata (description, license, version) is accurate.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/6225761812590261830/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/how-to-create-and-publish-dartflutter.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/6225761812590261830" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/6225761812590261830" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/how-to-create-and-publish-dartflutter.html" rel="alternate" title="How to Create and Publish a Dart/Flutter Package to pub.dev" type="text/html"/><author><name>Mar</name><uri>http://www.blogger.com/profile/13191156366773651504</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//1.bp.blogspot.com/-kTOceCWfl48/Z1riVgNK7uI/AAAAAAAAApY/Hvvyd7vktTsWkQXir5xVPyccjikIc8yGQCK4BGAYYCw/s1600/ACg8ocLO63CIO9zSJgUOxboEI3UczkxXdsoNAnn0Ui_REUghAPfGiuQZ%253Ds83-c-mo" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQnqMqAABZuuyOwiz0atYqgv-7e9a0qqKjPzhPFbRwb4OyZJqaqQ4d40d1CbXssgWGr53UWNltF8mOEZGDpjuTtralBW5WatgWTfLVXgWb7JU1H_prEc2Oj8t1RYJ1kl3SbW3VUUTH19Qgu42fbvTzWZY-h8IZZGh5V3Mjq1CHHUkyvKAggHrc6CZCZfs/s72-w640-h236-c/flutter_package.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-5954086666391840405</id><published>2024-12-21T02:11:00.000+08:00</published><updated>2024-12-21T02:11:05.437+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><title type="text">&#129520; pubspec_checker package for Flutter</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYNtPHQpB5nLWGfCiDooVVeUcpADcg_b7nZNBXPEZ3JR1PfzER2JVL7meXvLcC6YplJUxtO85LoaD4maqCB6munot_qo3Yx0RIWF21E-2m6Gn20Ql_rJQH9sOoRyWTqIurtGMCX-a1UDwu6AZOq29UzoGwBF7yt1LNabQlANdHlSmVEANL-z09mFc0p_Q/s1195/demo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="439" data-original-width="1195" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYNtPHQpB5nLWGfCiDooVVeUcpADcg_b7nZNBXPEZ3JR1PfzER2JVL7meXvLcC6YplJUxtO85LoaD4maqCB6munot_qo3Yx0RIWF21E-2m6Gn20Ql_rJQH9sOoRyWTqIurtGMCX-a1UDwu6AZOq29UzoGwBF7yt1LNabQlANdHlSmVEANL-z09mFc0p_Q/w640-h236/demo.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h1 id="pubspec_checker"&gt;&lt;br /&gt;&lt;/h1&gt;
&lt;p&gt;A simple Flutter package that checks the compatibility of all dependencies in the &lt;code&gt;pubspec.yaml&lt;/code&gt; file for specified platforms. This package reads the &lt;code&gt;pubspec.yaml&lt;/code&gt; file, fetches the package information from &lt;code&gt;pub.dev&lt;/code&gt;, and verifies the platforms (like &lt;code&gt;Android&lt;/code&gt;, &lt;code&gt;iOS&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;, &lt;code&gt;macOS&lt;/code&gt;, &lt;code&gt;Windows&lt;/code&gt;, and &lt;code&gt;Linux&lt;/code&gt;) against the provided list.
&lt;/p&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Platform Compatibility Check:&lt;ul&gt;
&lt;li&gt;Specify platforms (e.g., &lt;code&gt;android&lt;/code&gt;, &lt;code&gt;ios&lt;/code&gt;, &lt;code&gt;web&lt;/code&gt;, etc.) to check which packages are supported.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Detailed Reporting:&lt;ul&gt;
&lt;li&gt;List all packages with their supported platforms.
Optionally show package links for more details.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Easy to Use:&lt;ul&gt;
&lt;li&gt;Command-line arguments for quick execution and flexibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Add &lt;code&gt;pubspec_checker&lt;/code&gt; to your Flutter or Dart project:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-yaml"&gt;&lt;span class="hljs-selector-tag"&gt;dev_dependencies&lt;/span&gt;:
  &lt;span class="hljs-selector-tag"&gt;pubspec_checker&lt;/span&gt;: ^1&lt;span class="hljs-selector-class"&gt;.0&lt;/span&gt;&lt;span class="hljs-selector-class"&gt;.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run this command:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-bash"&gt;flutter pub &lt;span class="hljs-keyword"&gt;get&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;Command-Line Interface (CLI)
To use the package, run the following command:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-bash"&gt;dart &lt;span class="hljs-keyword"&gt;run&lt;/span&gt;&lt;span class="bash"&gt; pubspec_checker &amp;lt;platforms&amp;gt; [options]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Parameters&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;platforms&amp;gt;&lt;/code&gt;: The platforms to check compatibility for. Supported values are:&lt;ul&gt;
&lt;li&gt;android&lt;/li&gt;
&lt;li&gt;ios&lt;/li&gt;
&lt;li&gt;web&lt;/li&gt;
&lt;li&gt;windows&lt;/li&gt;
&lt;li&gt;linux&lt;/li&gt;
&lt;li&gt;macos&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Options&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-s&lt;/code&gt; or &lt;code&gt;--show&lt;/code&gt;: Display the list of packages with their supported platforms.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--l&lt;/code&gt; or &lt;code&gt;--links&lt;/code&gt;: Display the links to the package details.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="examples"&gt;Examples&lt;/h2&gt;
&lt;p&gt;Check compatibility for &lt;code&gt;android&lt;/code&gt; and &lt;code&gt;ios&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-bash"&gt;dart &lt;span class="hljs-keyword"&gt;run&lt;/span&gt;&lt;span class="bash"&gt; pubspec_checker android ios&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Check compatibility for &lt;code&gt;web&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-bash"&gt;dart &lt;span class="hljs-keyword"&gt;run&lt;/span&gt;&lt;span class="bash"&gt; pubspec_checker web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-bash"&gt;dart &lt;span class="hljs-keyword"&gt;run&lt;/span&gt;&lt;span class="bash"&gt; pubspec_checker:web&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example Output:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-bash"&gt;PS D:\Repository\pubspec_checker\example&amp;gt; dart run pubspec_checker windows ios
Building package executable...
Built pubspec_checker:pubspec_checker.
------- Started checking compatibility for &lt;span class="hljs-string"&gt;"windows"&lt;/span&gt; -------
(2) Supported:
  ✅  file_picker
  ✅  connectivity_plus
(5) Not Supported:
  ❌  pusher_client
  ❌  disk_space
  ❌  open_file_plus
  ❌  sqflite_sqlcipher
  ❌  flutter_pdfview
------- Compatibility&lt;span class="hljs-built_in"&gt; check &lt;/span&gt;completed for &lt;span class="hljs-string"&gt;"windows"&lt;/span&gt; --------
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="additional-information"&gt;Additional information&lt;/h2&gt;
&lt;p&gt;If you want to use the package programmatically, here’s how you can do it:&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-dart"&gt;&lt;span class="hljs-keyword"&gt;import&lt;/span&gt; &lt;span class="hljs-string"&gt;'package:pubspec_checker/pubspec_checker.dart'&lt;/span&gt;;

&lt;span class="hljs-keyword"&gt;void&lt;/span&gt; main() &lt;span class="hljs-keyword"&gt;async&lt;/span&gt; {
  &lt;span class="hljs-keyword"&gt;final&lt;/span&gt; checker = PlatformChecker([&lt;span class="hljs-string"&gt;'ios'&lt;/span&gt;, &lt;span class="hljs-string"&gt;'android'&lt;/span&gt;]);
  &lt;span class="hljs-keyword"&gt;final&lt;/span&gt; reader = PubspecReader();

  &lt;span class="hljs-keyword"&gt;final&lt;/span&gt; dependencies = reader.getDependencies();
  &lt;span class="hljs-keyword"&gt;final&lt;/span&gt; results = &lt;span class="hljs-keyword"&gt;await&lt;/span&gt; checker.checkPackageCompatibility(dependencies);

  &lt;span class="hljs-keyword"&gt;for&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; package &lt;span class="hljs-keyword"&gt;in&lt;/span&gt; results.entries) {
    &lt;span class="hljs-built_in"&gt;print&lt;/span&gt;(&lt;span class="hljs-string"&gt;'Package: &lt;span class="hljs-subst"&gt;${package.key}&lt;/span&gt;, Supported Platforms: &lt;span class="hljs-subst"&gt;${package.value.join(&lt;span class="hljs-string"&gt;", "&lt;/span&gt;)}&lt;/span&gt;'&lt;/span&gt;);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="contributing"&gt;Contributing&lt;/h2&gt;
&lt;p&gt;Contributions are welcome! If you encounter any issues or have feature requests, please open an issue or submit a pull request on &lt;a href="https://github.com/marianz-bonfire/pubspec_checker"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="license"&gt;License&lt;/h2&gt;
&lt;p&gt;This package is licensed under the &lt;a href="https://mit-license.org/"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;
</content><link href="https://tarsier-marianz.blogspot.com/feeds/5954086666391840405/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/pubspecchecker-package-for-flutter.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5954086666391840405" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5954086666391840405" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/pubspecchecker-package-for-flutter.html" rel="alternate" title="&#129520; pubspec_checker package for Flutter" type="text/html"/><author><name>Tarsier</name><uri>http://www.blogger.com/profile/08584138108762253429</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCE67Hc7WblXvVQhxcuFJyiRhLlzC3pVTxw1TrgJiXpanzav0ZM-Kl_9De9_8XjNRQQnmAmBkBayirwteTzVf20tVZQXkWwPUe2lOA3Tuu5qlGKJjeqP-JzdJ99gQVkfSinByjkZz7n3irbNBuk8Wsh4JuQyo5Km9Z8adp4_0QeI94bDo/s220/reading-tarsier.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYNtPHQpB5nLWGfCiDooVVeUcpADcg_b7nZNBXPEZ3JR1PfzER2JVL7meXvLcC6YplJUxtO85LoaD4maqCB6munot_qo3Yx0RIWF21E-2m6Gn20Ql_rJQH9sOoRyWTqIurtGMCX-a1UDwu6AZOq29UzoGwBF7yt1LNabQlANdHlSmVEANL-z09mFc0p_Q/s72-w640-h236-c/demo.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-5571212104596986897</id><published>2024-12-16T01:30:00.094+08:00</published><updated>2024-12-18T10:13:33.806+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><title type="text">How to Create a Custom Dropdown Color Menu in Flutter</title><content type="html">&lt;p&gt;&amp;nbsp;Dropdown menus are a common UI component in Flutter, but sometimes you need something more personalized to fit your app’s design. This tutorial walks you through creating a &lt;strong&gt;custom dropdown color menu&lt;/strong&gt; in Flutter. You’ll learn how to display color options in a dropdown and allow users to select one, with the selected color updating the UI dynamically.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Step 1: Setting Up the Flutter Project&lt;/strong&gt;&lt;/h3&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Create a new Flutter project or open an existing one:&lt;br /&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.1em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #a6e22e;"&gt;flutter&lt;/span&gt; &lt;span style="color: #ffde59;"&gt;create&lt;/span&gt; &lt;span style="color: white;"&gt;custom_dropdown_menu&lt;/span&gt;
&lt;span style="color: #ffde59;"&gt;cd&lt;/span&gt; &lt;span style="color: white;"&gt;custom_dropdown_menu&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Open the project in your favorite IDE (e.g., &lt;b&gt;VS Code&lt;/b&gt; or &lt;b&gt;Android Studio&lt;/b&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Step 2: Building the Color Dropdown Menu&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;To create a dropdown menu that displays color options, we’ll use Flutter’s &lt;code&gt;DropdownButton&lt;/code&gt; widget. However, we’ll customize it to show color swatches instead of regular text.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Code: Custom Dropdown Color Menu&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Below is the full implementation:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-width: .1em .1em .1em .1em; border: 0.1em solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;main()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;runApp(ColorDropdownApp());&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ColorDropdownApp&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MaterialApp(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;debugShowCheckedModeBanner:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;home:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ColorDropdownScreen(),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ColorDropdownScreen&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatefulWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;_ColorDropdownScreenState&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createState()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_ColorDropdownScreenState();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;_ColorDropdownScreenState&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;State&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ColorDropdownScreen&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #75715e;"&gt;// List of colors for the dropdown&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;colors&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Colors.red,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Colors.green,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Colors.blue,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Colors.yellow,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Colors.purple,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Colors.orange,&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;];&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// Currently selected color&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedColor&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red;&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Scaffold(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;appBar:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;AppBar(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Custom Dropdown Color Menu'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;backgroundColor:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedColor,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Center(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Column(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MainAxisAlignment.center,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
              &lt;span style="color: #e6db74;"&gt;'Select a Color:'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(fontSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;SizedBox(height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #75715e;"&gt;// Dropdown Button&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;DropdownButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;value:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedColor,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;icon:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Icon(Icons.arrow_drop_down),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;iconSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;24&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;elevation:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;dropdownColor:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.white,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.black),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;onChanged:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;newColor)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;setState(()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;selectedColor&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;newColor&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;items:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;colors.map&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;DropdownMenuItem&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;((Color&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;color)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DropdownMenuItem&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;value:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;color,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;color,&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;}).toList(),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;SizedBox(height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;40&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #75715e;"&gt;// Display selected color&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
              &lt;span style="color: #e6db74;"&gt;'You selected:'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(fontSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;18&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedColor,&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;div&gt;&lt;h3&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h3&gt;&lt;strong&gt;Step 3: Running the Application&lt;/strong&gt;&lt;/h3&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Save the code to &lt;span style="color: #fd3a13;"&gt;&lt;code&gt;main.dart&lt;/code&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Run the application&lt;br /&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;flutter&lt;/span&gt; &lt;span style="color: white;"&gt;run&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;strong&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Output&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhScJ6nihzvGUC98Hmkwh8fFA80Og2Tn3ym3Zay84uCl_nZNLqB-J67YKDULIHjfPwbn8VHEfScrKJvbMiQ15ZMH_ZqFHTpiuz_TlgqW1MSEdGCRJWIYBAy6cmbPJKLrksB0KE2DWZNLbjrK6DQlGxbpK4xjXWaiwh4jLnI2MfkDGyub1WY5QCK4IIdzuE/s1110/EtDYmagnXc.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="616" data-original-width="1110" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhScJ6nihzvGUC98Hmkwh8fFA80Og2Tn3ym3Zay84uCl_nZNLqB-J67YKDULIHjfPwbn8VHEfScrKJvbMiQ15ZMH_ZqFHTpiuz_TlgqW1MSEdGCRJWIYBAy6cmbPJKLrksB0KE2DWZNLbjrK6DQlGxbpK4xjXWaiwh4jLnI2MfkDGyub1WY5QCK4IIdzuE/w640-h356/EtDYmagnXc.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;How It Works&lt;/strong&gt;&lt;/h3&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;DropdownButton Widget&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Displays a list of color options in a dropdown menu.&lt;/li&gt;&lt;li&gt;The &lt;span style="color: #e69138;"&gt;&lt;code&gt;DropdownButton&lt;/code&gt; &lt;/span&gt;widget has &lt;code&gt;items&lt;/code&gt;, which is a list of &lt;span style="color: #e69138;"&gt;&lt;code&gt;DropdownMenuItem&lt;/code&gt; &lt;/span&gt;widgets. Each menu item contains a &lt;code&gt;Container&lt;/code&gt; filled with a color swatch.&lt;/li&gt;&lt;/ul&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Dynamic State Update&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;span style="color: #e69138;"&gt;&lt;code&gt;onChanged&lt;/code&gt; &lt;/span&gt;callback updates the &lt;span style="color: #e69138;"&gt;&lt;code&gt;selectedColor&lt;/code&gt; &lt;/span&gt;variable whenever a new color is chosen, triggering a rebuild of the widget tree to reflect the updated color.&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Selected Color Preview&lt;/strong&gt;:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The selected color is displayed in a square box below the dropdown.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;&lt;b&gt;Code Enhancement&lt;/b&gt;&lt;/h3&gt;&lt;p style="text-align: left;"&gt;Let's enhance the custom dropdown menu to use a &lt;code&gt;&lt;span style="color: #e69138;"&gt;List&amp;lt;Map&amp;lt;String, dynamic&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt; instead of &lt;code&gt;&lt;span style="color: #e69138;"&gt;List&amp;lt;Color&amp;gt;&lt;/span&gt;&lt;/code&gt;. This allows us to associate a name with each color, making the menu more informative and flexible.&lt;/p&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Updated Code: Custom Dropdown with Color Names&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Here’s the enhanced version of the code:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;main()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;runApp(ColorDropdownApp());&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ColorDropdownApp&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MaterialApp(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;debugShowCheckedModeBanner:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;home:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ColorDropdownScreen(),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ColorDropdownScreen&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatefulWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;_ColorDropdownScreenState&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createState()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_ColorDropdownScreenState();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;_ColorDropdownScreenState&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;State&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ColorDropdownScreen&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #75715e;"&gt;// List of colors with names&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Map&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dynamic&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_colors&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Red'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Green'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.green},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Blue'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.blue},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Yellow'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.yellow},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Purple'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.purple},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Orange'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.orange},&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;];&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// Currently selected color&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Map&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dynamic&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_selectedColor&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Red'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red};&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_selectedColorName&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Red'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Scaffold(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;appBar:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;AppBar(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Enhanced Dropdown Color Menu'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;backgroundColor:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_selectedColor[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Center(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Column(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MainAxisAlignment.center,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
              &lt;span style="color: #e6db74;"&gt;'Select a Color:'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(fontSize:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;SizedBox(height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #75715e;"&gt;// Dropdown Button&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
              &lt;span style="color: #75715e;"&gt;// Set the background color of the container dynamically&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;decoration:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BoxDecoration(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_selectedColor[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;borderRadius:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BorderRadius.circular(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;8.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;padding:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.symmetric(horizontal:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;8.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;

              &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DropdownButtonHideUnderline(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DropdownButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;
                  &lt;span style="color: #75715e;"&gt;// Define the dropdown items&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;items:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_colors.map((colorMap)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DropdownMenuItem&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;value:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;colorMap[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Row(&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
                          &lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
                            &lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                            &lt;span style="color: #f8f8f2;"&gt;height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                            &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;colorMap[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Display color preview&lt;/span&gt;
                            &lt;span style="color: #f8f8f2;"&gt;margin:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.only(right:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;8&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                          &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                          &lt;span style="color: #f8f8f2;"&gt;Text(colorMap[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]),&lt;/span&gt;
                        &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;}).toList(),&lt;/span&gt;
                  &lt;span style="color: #75715e;"&gt;// Hint text&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;hint:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;_selectedColorName,&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;style:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextStyle(color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.white),&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;onChanged:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedName)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;setState(()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;_selectedColorName&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedName&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
                      &lt;span style="color: #75715e;"&gt;// Update background color based on the selected color&lt;/span&gt;
                      &lt;span style="color: #f8f8f2;"&gt;_selectedColor&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_colors.firstWhere((element)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;element[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;selectedName);&lt;/span&gt;
                    &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;Output of the enhanced code&lt;/h3&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm7nVMKDkwmSZm6ZArXRlDXCbKTlYNO2TtYQRM7P37qR979cOk6rU_Nnp9EuOa7pbgDctU30mnlkPkt13hfyKXEyUxpx2Ap8rOM7e4QWaOplJ0ABxT-6hUKrFrr3bEtWXoP6LAE4JqN0Ha9mgeHellVPTnaBYm2uGGxNZmbS3cERnwm8w8NTu7TWD9BRQ/s1213/3LfY7iSovd.gif" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="573" data-original-width="1213" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm7nVMKDkwmSZm6ZArXRlDXCbKTlYNO2TtYQRM7P37qR979cOk6rU_Nnp9EuOa7pbgDctU30mnlkPkt13hfyKXEyUxpx2Ap8rOM7e4QWaOplJ0ABxT-6hUKrFrr3bEtWXoP6LAE4JqN0Ha9mgeHellVPTnaBYm2uGGxNZmbS3cERnwm8w8NTu7TWD9BRQ/w640-h302/3LfY7iSovd.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Explanation of Enhancements&lt;/strong&gt;&lt;/h3&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;1. Using &lt;code&gt;&lt;span style="color: #e69138;"&gt;List&amp;lt;Map&amp;lt;String, dynamic&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Each color is represented as a map with &lt;span style="color: #e69138;"&gt;&lt;code&gt;name&lt;/code&gt; &lt;/span&gt;and &lt;span style="color: #e69138;"&gt;&lt;code&gt;color&lt;/code&gt; &lt;/span&gt;keys:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Red'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Updated &lt;span style="color: #e69138;"&gt;&lt;code&gt;_selectedColor&lt;/code&gt; &lt;/span&gt;State:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The dropdown now holds a map for the selected color:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;Map&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dynamic&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_selectedColor&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Red'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;3. Wrapped&amp;nbsp;&lt;/strong&gt;&lt;strong&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;DropdownButton &lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;&lt;strong&gt;with the container and removed the underline.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Once the selected color menu is changed then the container background will be updated.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;/p&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
  &lt;span style="color: #75715e;"&gt;// Set the background color of the container dynamically&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;decoration:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BoxDecoration(&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_selectedColor[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;borderRadius:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BorderRadius.circular(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;8.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;padding:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.symmetric(horizontal:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;8.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DropdownButtonHideUnderline(&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;...),&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;strong&gt;&lt;div&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;4. Custom &lt;code&gt;&lt;span style="color: #e69138;"&gt;DropdownMenuItem&lt;/span&gt;&lt;/code&gt;:&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Each menu item displays a small color swatch alongside the color name using a &lt;span style="color: #e69138;"&gt;&lt;code&gt;Row&lt;/code&gt; &lt;/span&gt;widget:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt; &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DropdownMenuItem&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;value:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;colorMap[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Row(&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;Container(&lt;/span&gt;
		&lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
		&lt;span style="color: #f8f8f2;"&gt;height:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
		&lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;colorMap[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'color'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Display color preview&lt;/span&gt;
		&lt;span style="color: #f8f8f2;"&gt;margin:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.only(right:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;8&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
	  &lt;span style="color: #f8f8f2;"&gt;Text(colorMap[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]),&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;5. Dynamic Updates:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;When a new color is selected, the &lt;code&gt;onChanged&lt;/code&gt; callback updates &lt;code&gt;&lt;span style="color: #e69138;"&gt;_selectedColor&lt;/span&gt;&lt;/code&gt;, triggering a UI refresh to reflect the selected color and its name.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The dropdown uses the &lt;span style="color: #e69138;"&gt;&lt;code&gt;_colors&lt;/code&gt; &lt;/span&gt;list to generate menu items.&lt;/li&gt;&lt;li&gt;Each menu item is a combination of a color swatch and the color name.&lt;/li&gt;&lt;li&gt;When the user selects a color, the &lt;span style="color: #e69138;"&gt;&lt;code&gt;onChanged&lt;/code&gt; &lt;/span&gt;callback updates &lt;code&gt;&lt;span style="color: #e69138;"&gt;_selectedColor&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;The app bar and the color preview box update dynamically based on the selected color.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This enhancement adds functionality and improves the user experience by displaying both color swatches and names in the dropdown menu. Using &lt;code&gt;&lt;span style="color: #e69138;"&gt;List&amp;lt;Map&amp;gt;&lt;/span&gt;&lt;/code&gt; makes the implementation more flexible and extendable. You can now easily add more properties (e.g., hex codes, descriptions) to the colors if needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can explore the source code on the Github repository.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;!--GitHub Button HTML with Inline CSS and JavaScript Hover--&gt;
&lt;a href="https://github.com/marianz-bonfire/blogs/tree/master/custom_dropdown_menu" onmouseout="this.style.backgroundColor='#fd3a13'" onmouseover="this.style.backgroundColor='#333'" style="align-items: center; background-color: #fd3a13; border-radius: 5px; color: white; display: inline-flex; font-family: Arial, sans-serif; font-size: 16px; padding: 10px 15px; text-decoration: none; transition: background-color 0.3s;" target="_blank"&gt;
    &lt;img alt="GitHub Logo" src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" style="height: 20px; margin-right: 8px; width: 20px;" /&gt;
    View on GitHub
&lt;/a&gt;
</content><link href="https://tarsier-marianz.blogspot.com/feeds/5571212104596986897/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/how-to-create-custom-dropdown-color.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5571212104596986897" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5571212104596986897" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/how-to-create-custom-dropdown-color.html" rel="alternate" title="How to Create a Custom Dropdown Color Menu in Flutter" type="text/html"/><author><name>Tarsier</name><uri>http://www.blogger.com/profile/08584138108762253429</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCE67Hc7WblXvVQhxcuFJyiRhLlzC3pVTxw1TrgJiXpanzav0ZM-Kl_9De9_8XjNRQQnmAmBkBayirwteTzVf20tVZQXkWwPUe2lOA3Tuu5qlGKJjeqP-JzdJ99gQVkfSinByjkZz7n3irbNBuk8Wsh4JuQyo5Km9Z8adp4_0QeI94bDo/s220/reading-tarsier.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhScJ6nihzvGUC98Hmkwh8fFA80Og2Tn3ym3Zay84uCl_nZNLqB-J67YKDULIHjfPwbn8VHEfScrKJvbMiQ15ZMH_ZqFHTpiuz_TlgqW1MSEdGCRJWIYBAy6cmbPJKLrksB0KE2DWZNLbjrK6DQlGxbpK4xjXWaiwh4jLnI2MfkDGyub1WY5QCK4IIdzuE/s72-w640-h356-c/EtDYmagnXc.gif" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-1692736535589265256</id><published>2024-12-15T23:56:00.048+08:00</published><updated>2024-12-18T04:07:25.541+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="com0com"/><category scheme="http://www.blogger.com/atom/ns#" term="Installation"/><category scheme="http://www.blogger.com/atom/ns#" term="Setup"/><category scheme="http://www.blogger.com/atom/ns#" term="Virtual COM Ports"/><title type="text">How to Set Up Virtual Serial COM Ports Using com0com</title><content type="html">&lt;p&gt;&amp;nbsp;Virtual serial COM ports are essential for testing and debugging serial communication between software applications. &lt;strong&gt;&lt;a href="https://com0com.sourceforge.net/" target="_blank"&gt;com0com&lt;/a&gt;&lt;/strong&gt; is a free, open-source virtual serial port emulator that allows you to create pairs of virtual COM ports that communicate with each other. This step-by-step tutorial will guide you through downloading, installing, and configuring com0com to set up virtual COM ports.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Step 1: Download com0com&lt;/strong&gt;&lt;/h3&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Visit the official &lt;strong&gt;&lt;a href="https://sourceforge.net/projects/com0com/files/latest/download" target="_blank"&gt;com0com project page&lt;/a&gt;&lt;/strong&gt; on &lt;a rel="noopener" target="_new"&gt;SourceForge&lt;/a&gt; or GitHub.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Download the latest version of com0com for your operating system.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Make&amp;nbsp;sure to choose the correct version for your OS architecture (32-bit or 64-bit).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Step 2: Install com0com&lt;/strong&gt;&lt;/h3&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Extract the downloaded zip file to a folder on your computer.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Open the extracted folder and locate the installer executable (&lt;code&gt;&lt;span style="color: #e69138;"&gt;setup_com0com_x64.exe&lt;/span&gt;&lt;/code&gt; for 64-bit systems or &lt;code&gt;&lt;span style="color: #e69138;"&gt;setup_com0com_x86.exe&lt;/span&gt;&lt;/code&gt; for 32-bit systems).&amp;nbsp;&lt;span style="color: #e69138; font-family: monospace;"&gt;setup_com0com_v3.0.0.0_W7_x64_signed.exe&lt;/span&gt;&amp;nbsp;in my case.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Right-click the installer and select &lt;strong&gt;&lt;span style="color: #e69138;"&gt;Run as Administrator&lt;/span&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4.&amp;nbsp;&lt;/span&gt;Follow the installation wizard:&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Accept the license agreement.&lt;/li&gt;&lt;li&gt;Choose the installation directory (default is recommended).&lt;/li&gt;&lt;li&gt;Click &lt;span style="color: #e69138;"&gt;&lt;strong&gt;Install&lt;/strong&gt; &lt;/span&gt;to complete the process.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 5.&amp;nbsp;&lt;/span&gt;After installation, you might see a driver installation prompt. Click &lt;span style="color: #e69138;"&gt;&lt;strong&gt;Install&lt;/strong&gt; &lt;/span&gt;or &lt;span style="color: #e69138;"&gt;&lt;strong&gt;Allow&lt;/strong&gt; &lt;/span&gt;to proceed with the virtual driver setup.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Step 3: Verify com0com Installation&lt;/strong&gt;&lt;/h3&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Open the &lt;strong&gt;&lt;span style="color: #b45f06;"&gt;Device Manager&lt;/span&gt;&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;Press &lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;Win + X&lt;/b&gt;&lt;/span&gt;&lt;/code&gt; and select &lt;strong&gt;&lt;span style="color: #b45f06;"&gt;Device Manager&lt;/span&gt;&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Expand the &lt;strong&gt;&lt;span style="color: #b45f06;"&gt;Ports (COM &amp;amp; LPT)&lt;/span&gt;&lt;/strong&gt; section.&lt;br /&gt;Look for devices labeled like &lt;code&gt;&lt;span style="color: #e69138;"&gt;com0com - bus for serial port pair&lt;/span&gt;&lt;/code&gt;. This confirms that com0com has been successfully installed.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4j3ZCOgBBIWK6IjF4xFuYloY7fR7DXhyaK-AFEcDIyJPvY8yrXFfnMQbPG1bdMCbnNQDik-N_CnakiWD89W20G_zjZBm1UoludXKv2UgXFXh9MXzk6VUhEceNAbEj06nRvN947NsREcNpLXjdZrJlsVcuSVef3CnC4es9q3xcmHU8zFyFsRn0luVwPv4/s724/com0com.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="724" data-original-width="626" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4j3ZCOgBBIWK6IjF4xFuYloY7fR7DXhyaK-AFEcDIyJPvY8yrXFfnMQbPG1bdMCbnNQDik-N_CnakiWD89W20G_zjZBm1UoludXKv2UgXFXh9MXzk6VUhEceNAbEj06nRvN947NsREcNpLXjdZrJlsVcuSVef3CnC4es9q3xcmHU8zFyFsRn0luVwPv4/w554-h640/com0com.png" width="554" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;&lt;strong&gt;Step 4: Configure Virtual COM Ports&lt;/strong&gt;&lt;/h3&gt;&lt;p style="text-align: left;"&gt;com0com creates pairs of virtual COM ports that are interconnected. For example, data sent to &lt;b&gt;&lt;span style="color: #e69138;"&gt;&lt;code&gt;COM10&lt;/code&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;will be received by &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;COM11&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;and vice versa.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Using the GUI Configuration Tool&lt;/strong&gt;&lt;/h4&gt;&lt;h4&gt;&lt;br /&gt;&lt;strong&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDcMkKabBvRVeYsfGdEHcrBDj5NFcZc07Daatf3_VLRlr2pqMdeWivIYdp6nadcpPRD-T6q20T1yhvivjphyphenhyphenLm1Gc-iksj5m33_k0YM7C2xz-zSVSB_VprdeYg-R6ZC8DbkvFAZvxOWA58zkWhTFRvS-Br23fyEfF8qnRfYWKruvBjQWaOUpNwexqNPi0/s1673/com0com_setup_labeled.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="769" data-original-width="1673" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDcMkKabBvRVeYsfGdEHcrBDj5NFcZc07Daatf3_VLRlr2pqMdeWivIYdp6nadcpPRD-T6q20T1yhvivjphyphenhyphenLm1Gc-iksj5m33_k0YM7C2xz-zSVSB_VprdeYg-R6ZC8DbkvFAZvxOWA58zkWhTFRvS-Br23fyEfF8qnRfYWKruvBjQWaOUpNwexqNPi0/w640-h294/com0com_setup_labeled.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;During installation, com0com may have installed a GUI tool named &lt;b&gt;&lt;span style="color: #e69138;"&gt;Virtual Null Modem&lt;/span&gt;&lt;/b&gt;. Launch it from the Start menu or in the desktop icon.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;To create a new pair of virtual com ports click Add Pair button.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;(&lt;span style="color: #cc0000;"&gt;&lt;i&gt;Optional&lt;/i&gt;&lt;/span&gt;) Verify the added pair in Device Manager. (&lt;i&gt;You can refer above &lt;b&gt;&lt;span style="color: #38761d;"&gt;Step 3: Verify com0com Installation&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;).&lt;/li&gt;&lt;li&gt;Rename the port with your preferred port name.&lt;/li&gt;&lt;li&gt;Save the changes after renaming the ports by clicking Apply button.&lt;/li&gt;&lt;li&gt;(&lt;span style="color: #990000;"&gt;&lt;i&gt;Optional&lt;/i&gt;&lt;/span&gt;) Verify whether the rename ports have been applied successfully.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Step 5: Test the Virtual COM Ports&lt;/strong&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Use any serial communication software (e.g., &lt;span style="color: #38761d;"&gt;&lt;a href="https://www.putty.org/" target="_blank"&gt;PuTTY&lt;/a&gt;&lt;/span&gt;, &lt;span style="color: #38761d;"&gt;&lt;a href="https://teratermproject.github.io/index-en.html" target="_blank"&gt;Tera Term&lt;/a&gt;&lt;/span&gt;, or &lt;span style="color: #38761d;"&gt;HyperTerminal&lt;/span&gt;) to test the setup.&lt;/li&gt;&lt;li&gt;Open one instance of your terminal software and connect it to &lt;code&gt;&lt;span style="color: #38761d;"&gt;COM10&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Open another instance and connect it to &lt;code&gt;&lt;span style="color: #38761d;"&gt;COM11&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Send some data from one terminal. You should see the data appear on the other terminal, confirming successful communication between the virtual COM ports.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Using &lt;span style="color: #e69138;"&gt;&lt;strong&gt;com0com&lt;/strong&gt; &lt;/span&gt;to set up virtual serial COM ports is a simple yet powerful way to simulate and test serial communication between applications without requiring physical hardware. This method is invaluable for developers working on serial communication protocols, data logging, or hardware interfacing projects.&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/1692736535589265256/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/how-to-set-up-virtual-serial-com-ports.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1692736535589265256" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1692736535589265256" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/how-to-set-up-virtual-serial-com-ports.html" rel="alternate" title="How to Set Up Virtual Serial COM Ports Using com0com" type="text/html"/><author><name>Tarsier</name><uri>http://www.blogger.com/profile/08584138108762253429</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCE67Hc7WblXvVQhxcuFJyiRhLlzC3pVTxw1TrgJiXpanzav0ZM-Kl_9De9_8XjNRQQnmAmBkBayirwteTzVf20tVZQXkWwPUe2lOA3Tuu5qlGKJjeqP-JzdJ99gQVkfSinByjkZz7n3irbNBuk8Wsh4JuQyo5Km9Z8adp4_0QeI94bDo/s220/reading-tarsier.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4j3ZCOgBBIWK6IjF4xFuYloY7fR7DXhyaK-AFEcDIyJPvY8yrXFfnMQbPG1bdMCbnNQDik-N_CnakiWD89W20G_zjZBm1UoludXKv2UgXFXh9MXzk6VUhEceNAbEj06nRvN947NsREcNpLXjdZrJlsVcuSVef3CnC4es9q3xcmHU8zFyFsRn0luVwPv4/s72-w554-h640-c/com0com.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-1132305261691493721</id><published>2024-12-15T22:09:00.007+08:00</published><updated>2024-12-16T23:37:57.007+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="Electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="H-Bridge"/><category scheme="http://www.blogger.com/atom/ns#" term="L293D"/><title type="text">Interfacing Arduino L293D Driver with NPN Bipolar Transistor to Save Output Pins for Motor Direction Control</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWgLVyvMztemlzAhTNbzheS5OBb21XeFdRTZFqRRNNnioCQO-8QhCmc_OxPVTaAvQJvVstO-RV0PWK8SoU1MdeNYDLUSPlYUlSXu3n9qVkkdV0deipqIb9kUYMaSXy_6F7KlnHETYN8n7mXxnjuuzffm2lOnEVt4EK80YeOsBE9FkqdxyTZ-Hj7FNR6w/s1241/L293D_BiPolar.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="437" data-original-width="1241" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWgLVyvMztemlzAhTNbzheS5OBb21XeFdRTZFqRRNNnioCQO-8QhCmc_OxPVTaAvQJvVstO-RV0PWK8SoU1MdeNYDLUSPlYUlSXu3n9qVkkdV0deipqIb9kUYMaSXy_6F7KlnHETYN8n7mXxnjuuzffm2lOnEVt4EK80YeOsBE9FkqdxyTZ-Hj7FNR6w/w640-h226/L293D_BiPolar.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;Efficient utilization of microcontroller pins is crucial when working on Arduino projects, especially when pins are limited. A common scenario arises when controlling motor direction using an &lt;a href="https://www.ti.com/lit/ds/symlink/l293.pdf" target="_blank"&gt;L293D &lt;/a&gt;motor driver. Typically, an &lt;b&gt;&lt;a href="https://www.theengineeringknowledge.com/h-bridge-dc-motor-driver/" target="_blank"&gt;H-bridge&lt;/a&gt;&lt;/b&gt; like the &lt;a href="https://www.ti.com/lit/ds/symlink/l293.pdf" target="_blank"&gt;L293D &lt;/a&gt;requires two Arduino pins to control the motor's direction. However, with some ingenuity, we can reduce this to a single pin by integrating an &lt;span style="color: #e69138;"&gt;&lt;strong&gt;NPN bipolar transistor&lt;/strong&gt;.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This article explains how to interface the Arduino with an &lt;b&gt;&lt;a href="https://www.alldatasheet.com/datasheet-pdf/view/22432/STMICROELECTRONICS/L293D.html" target="_blank"&gt;L293D &lt;/a&gt;motor driver&lt;/b&gt; and an &lt;b&gt;NPN transistor&lt;/b&gt; to control motor direction while saving an output pin.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Understanding the L293D Motor Driver&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The &lt;a href="https://cdn-shop.adafruit.com/datasheets/l293d.pdf" target="_blank"&gt;L293D &lt;/a&gt;is a dual &lt;a href="https://www.theengineeringknowledge.com/h-bridge-dc-motor-driver/" target="_blank"&gt;H-bridge&lt;/a&gt; motor driver IC widely used for controlling DC motors and stepper motors. Each H-bridge requires two input pins from the Arduino to determine the direction of the motor, as shown below:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;IN1 &amp;amp; IN2&lt;/span&gt;&lt;/strong&gt;: Used to control the direction of Motor A.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;IN3 &amp;amp; IN4&lt;/span&gt;&lt;/strong&gt;: Used to control the direction of Motor B.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Standard Motor Direction Control&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Setting &lt;span style="color: #e69138;"&gt;IN1 = HIGH&lt;/span&gt; and &lt;span style="color: #e69138;"&gt;IN2 = LOW&lt;/span&gt; rotates the motor forward.&lt;/li&gt;&lt;li&gt;Setting &lt;span style="color: #e69138;"&gt;IN1 = LOW&lt;/span&gt; and &lt;span style="color: #e69138;"&gt;IN2 = HIGH&lt;/span&gt; rotates the motor backward.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;If you’re controlling multiple motors, the number of pins required can quickly add up, leaving fewer pins for other peripherals or sensors. For each motor, two Arduino pins are typically reserved for direction control.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;The Solution: Using an NPN Transistor&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;We can save one Arduino pin per motor by using an &lt;strong&gt;&lt;span style="color: #e69138;"&gt;NPN bipolar transistor&lt;/span&gt;&lt;/strong&gt; as an electronic switch. The idea is to control one of the motor driver inputs (&lt;b&gt;e.g., IN2&lt;/b&gt;) indirectly using the transistor while directly controlling the other (&lt;b&gt;e.g., IN1&lt;/b&gt;) with the Arduino.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;One Arduino pin (&lt;b&gt;D4&lt;/b&gt;) directly connects to &lt;strong&gt;IN1&lt;/strong&gt; of the &lt;a href="https://www.alldatasheet.com/datasheet-pdf/view/22432/STMICROELECTRONICS/L293D.html" target="_blank"&gt;L293D&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;The second motor input, &lt;strong&gt;IN2&lt;/strong&gt;, is connected to the collector of an NPN transistor.&lt;/li&gt;&lt;li&gt;The emitter of the transistor is connected to the ground.&lt;/li&gt;&lt;li&gt;A pull-down resistor ensures that the input to &lt;b&gt;IN2 &lt;/b&gt;remains &lt;b&gt;LOW &lt;/b&gt;when the transistor is off.&lt;/li&gt;&lt;li&gt;The base of the transistor is connected to the same Arduino pin as &lt;b&gt;IN1 &lt;/b&gt;through a current-limiting resistor. This creates an inverted signal for &lt;b&gt;IN2&lt;/b&gt;, ensuring complementary logic to &lt;b&gt;IN1&lt;/b&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;&lt;strong&gt;Logic Table&lt;/strong&gt;&lt;/h4&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Arduino Pin (IN1)&lt;/th&gt;&lt;th&gt;Transistor (IN2)&lt;/th&gt;&lt;th&gt;Motor Direction&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;HIGH&lt;/td&gt;&lt;td&gt;LOW&lt;/td&gt;&lt;td&gt;Forward&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LOW&lt;/td&gt;&lt;td&gt;HIGH&lt;/td&gt;&lt;td&gt;Reverse&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;h3&gt;&lt;strong&gt;Circuit Diagram&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Here’s the schematic for interfacing an Arduino with an &lt;a href="https://www.alldatasheet.com/datasheet-pdf/view/22432/STMICROELECTRONICS/L293D.html" target="_blank"&gt;L293D &lt;/a&gt;motor driver and an NPN transistor:&lt;/p&gt;&lt;strong&gt;Components Required&lt;/strong&gt;:&lt;br /&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;Arduino Board (e.g., Uno or Nano)&lt;/li&gt;&lt;li&gt;L293D Motor Driver IC&lt;/li&gt;&lt;li&gt;NPN Bipolar Transistor (e.g., 2N2222 or BC547)&lt;/li&gt;&lt;li&gt;1 kΩ Resistor (for the transistor base)&lt;/li&gt;&lt;li&gt;10 kΩ Resistor (pull-down for IN2)&lt;/li&gt;&lt;li&gt;DC Motor&lt;/li&gt;&lt;li&gt;External Power Supply (if needed)&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Code Implementation&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Below is the Arduino code to control the motor direction with a single output pin:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;#&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;define&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MOTOR_PIN&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Define the pin controlling the motor&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;#&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;define&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ENA_PIN&lt;/span&gt;  &lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;setup&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Serial&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;begin&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;9600&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

  &lt;span style="color: #f8f8f2;"&gt;pinMode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;MOTOR_PIN&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;OUTPUT&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;pinMode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ENA_PIN&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;OUTPUT&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;loop&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #75715e;"&gt;// Rotate motor forward&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;digitalWrite&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;MOTOR_PIN&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HIGH&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;delay&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;2000&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Run for 2 seconds&lt;/span&gt;
  
  &lt;span style="color: #75715e;"&gt;// Rotate motor backward&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;digitalWrite&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;MOTOR_PIN&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;LOW&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;delay&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;2000&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Run for 2 seconds&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Working Explanation&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;When &lt;span style="color: #e69138;"&gt;&lt;code&gt;MOTOR_PIN&lt;/code&gt; &lt;/span&gt;is set to &lt;strong&gt;&lt;span style="color: #38761d;"&gt;HIGH&lt;/span&gt;&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;IN1 &lt;/span&gt;receives a &lt;span style="color: #38761d;"&gt;HIGH &lt;/span&gt;signal directly.&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;IN2 &lt;/span&gt;is pulled &lt;span style="color: #38761d;"&gt;LOW &lt;/span&gt;via the NPN transistor, creating a forward direction for the motor.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;When &lt;span style="color: #e69138;"&gt;&lt;code&gt;MOTOR_PIN&lt;/code&gt; &lt;/span&gt;is set to &lt;strong&gt;&lt;span style="color: #38761d;"&gt;LOW&lt;/span&gt;&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;IN1 &lt;/span&gt;receives a &lt;span style="color: #38761d;"&gt;LOW &lt;/span&gt;signal directly.&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;IN2 &lt;/span&gt;is set to &lt;span style="color: #38761d;"&gt;HIGH &lt;/span&gt;through the pull-down resistor and the absence of base current in the transistor, creating a reverse direction for the motor.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This setup inverts the signal for IN2 using the transistor, eliminating the need for an additional Arduino pin.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Advantages of This Approach&lt;/strong&gt;&lt;/h3&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;1.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Pin Efficiency&lt;/span&gt;&lt;/strong&gt;: Each motor requires only one Arduino pin, freeing up more pins for other components.&lt;br /&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;2.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Cost-Effective&lt;/span&gt;&lt;/strong&gt;: NPN transistors are inexpensive and readily available.&lt;br /&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;3.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Simple Logic&lt;/span&gt;&lt;/strong&gt;: The complementary logic simplifies control without additional software complexity.&lt;br /&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;4.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Scalabilit&lt;/span&gt;y&lt;/strong&gt;: Ideal for projects involving multiple motors and limited microcontroller pins.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;By integrating an NPN bipolar transistor with the &lt;a href="https://www.alldatasheet.com/datasheet-pdf/view/22432/STMICROELECTRONICS/L293D.html" target="_blank"&gt;L293D &lt;/a&gt;motor driver, you can significantly optimize the use of Arduino pins in your motor control projects. This approach is particularly beneficial for applications where pin availability is limited but motor control functionality is essential. Try implementing this circuit in your next project to improve efficiency and scalability!&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/1132305261691493721/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/interfacing-arduino-l293d-driver-with.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1132305261691493721" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1132305261691493721" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/interfacing-arduino-l293d-driver-with.html" rel="alternate" title="Interfacing Arduino L293D Driver with NPN Bipolar Transistor to Save Output Pins for Motor Direction Control" type="text/html"/><author><name>Tarsier</name><uri>http://www.blogger.com/profile/08584138108762253429</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCE67Hc7WblXvVQhxcuFJyiRhLlzC3pVTxw1TrgJiXpanzav0ZM-Kl_9De9_8XjNRQQnmAmBkBayirwteTzVf20tVZQXkWwPUe2lOA3Tuu5qlGKJjeqP-JzdJ99gQVkfSinByjkZz7n3irbNBuk8Wsh4JuQyo5Km9Z8adp4_0QeI94bDo/s220/reading-tarsier.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWgLVyvMztemlzAhTNbzheS5OBb21XeFdRTZFqRRNNnioCQO-8QhCmc_OxPVTaAvQJvVstO-RV0PWK8SoU1MdeNYDLUSPlYUlSXu3n9qVkkdV0deipqIb9kUYMaSXy_6F7KlnHETYN8n7mXxnjuuzffm2lOnEVt4EK80YeOsBE9FkqdxyTZ-Hj7FNR6w/s72-w640-h226-c/L293D_BiPolar.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-66532065642592679</id><published>2024-12-08T22:06:00.000+08:00</published><updated>2024-12-11T22:13:02.254+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Arduino"/><category scheme="http://www.blogger.com/atom/ns#" term="Electronics"/><category scheme="http://www.blogger.com/atom/ns#" term="Joystick605620"/><category scheme="http://www.blogger.com/atom/ns#" term="RC"/><title type="text">Joystick-605620: 3-Axis Joystick with Push Button</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDNNDogw-Duw8xUg9iQ9WjLpYA6B5xZOrohAsgpuNa9PK7pzJ4ASMVeIkX_Qte_xxage5fLYHjZnxNdNxC3Vqizw7Ybur2ZDPX6j_blaEcbOCIBWB44BVFQN0baa90rxoVXmmNVXZi4LlxN18Rcv-KmxlXB0vb1xX7uQPYIgM6q9g8UGCsFxtWbpW-4vVM/s1807/JoystickConnectionLEDs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1181" data-original-width="1807" height="418" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDNNDogw-Duw8xUg9iQ9WjLpYA6B5xZOrohAsgpuNa9PK7pzJ4ASMVeIkX_Qte_xxage5fLYHjZnxNdNxC3Vqizw7Ybur2ZDPX6j_blaEcbOCIBWB44BVFQN0baa90rxoVXmmNVXZi4LlxN18Rcv-KmxlXB0vb1xX7uQPYIgM6q9g8UGCsFxtWbpW-4vVM/w640-h418/JoystickConnectionLEDs.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;is a simple Arduino-based application that demonstrates the use of a &lt;strong&gt;3-axis joystick&lt;/strong&gt; with an integrated &lt;strong&gt;push button&lt;/strong&gt;. This project aims to provide hands-on experience in interfacing a joystick module with Arduino, showcasing how to read and process analog and digital signals from the joystick for various applications.&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Objective&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The primary goal of this project is to help beginners and hobbyists understand:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;How to interface a &lt;strong&gt;3-axis joystick module&lt;/strong&gt; with Arduino.&lt;/li&gt;&lt;li&gt;Reading analog input from the joystick's axes (X, Y, and Z).&lt;/li&gt;&lt;li&gt;Detecting and processing button presses from the joystick's push button.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Analog Input Reading&lt;/strong&gt;: Demonstrates how to read analog signals from the joystick's X, Y, and Z axes using Arduino’s analog pins.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Push Button Detection&lt;/strong&gt;: Explains how to configure a digital input pin to detect button presses.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Signal Processing&lt;/strong&gt;: Provides examples of interpreting joystick inputs to control devices or navigate menus in Arduino applications.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Components Used&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;3-Axis Joystick Module&lt;/strong&gt; (with push button).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Arduino Board&lt;/strong&gt; (e.g., Uno, Nano, or Mega).&lt;/li&gt;&lt;li&gt;Resistors and jumper wires for connections.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;This project serves as a foundation for developing more advanced applications, such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Remote control systems.&lt;/li&gt;&lt;li&gt;User input for robots or drones.&lt;/li&gt;&lt;li&gt;Custom controllers for gaming or navigation.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;This project is a basic demonstration intended for educational purposes and to inspire creativity. Users are encouraged to modify and expand the application for their specific needs.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style="text-align: left;"&gt;Github Repository&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="https://github.com/Tarsier-Marianz/Joystick605620" target="_blank" 
   style="display: inline-flex; align-items: center; background-color: #24292e; color: #fff; padding: 10px 15px; border-radius: 5px; text-decoration: none; font-family: Arial, sans-serif; font-size: 16px; transition: background-color 0.3s;"
   onmouseover="this.style.backgroundColor='#333'"
   onmouseout="this.style.backgroundColor='#24292e'"&gt;
    &lt;img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub Logo" 
         style="width: 20px; height: 20px; margin-right: 8px;"&gt;
    View on GitHub
&lt;/a&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/66532065642592679/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/joystick-605620-3-axis-joystick-with.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/66532065642592679" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/66532065642592679" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/joystick-605620-3-axis-joystick-with.html" rel="alternate" title="Joystick-605620: 3-Axis Joystick with Push Button" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDNNDogw-Duw8xUg9iQ9WjLpYA6B5xZOrohAsgpuNa9PK7pzJ4ASMVeIkX_Qte_xxage5fLYHjZnxNdNxC3Vqizw7Ybur2ZDPX6j_blaEcbOCIBWB44BVFQN0baa90rxoVXmmNVXZi4LlxN18Rcv-KmxlXB0vb1xX7uQPYIgM6q9g8UGCsFxtWbpW-4vVM/s72-w640-h418-c/JoystickConnectionLEDs.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-7968070646867061580</id><published>2024-12-08T21:59:00.000+08:00</published><updated>2024-12-12T22:44:08.768+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Errors &amp; Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel Passport"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Troubleshooting"/><title type="text">Troubleshooting Laravel Passport Migration Errors: "Table Already Exists"</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXmfpyM8PHIK6tg2SQiNuvbjNndZH9KIcEnx1SDgqr6ARxKJsyvr7zXU4hNvDJ4vGuSKgD1nej8fbE5DhrmbCw-68yLssuBukIxjrTFqxKXq4EA6qTLbslMLxVkje-mSvtavP8kKJC_u1p6G-l7Edj1szWenReMCbCeZrHYjX6lFqoFZBMSeIAc2RLjc/s1305/5205_103108511PM_1734013868_msedge.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="476" data-original-width="1305" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXmfpyM8PHIK6tg2SQiNuvbjNndZH9KIcEnx1SDgqr6ARxKJsyvr7zXU4hNvDJ4vGuSKgD1nej8fbE5DhrmbCw-68yLssuBukIxjrTFqxKXq4EA6qTLbslMLxVkje-mSvtavP8kKJC_u1p6G-l7Edj1szWenReMCbCeZrHYjX6lFqoFZBMSeIAc2RLjc/w640-h234/5205_103108511PM_1734013868_msedge.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When setting up Laravel Passport for authentication, you might encounter migration issues during &lt;code&gt;php artisan migrate&lt;/code&gt;. One common error is:&lt;p&gt;&lt;/p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;SQLSTATE[42S01]&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;Base table or view already exists&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1050 Table '&lt;/span&gt;&lt;span style="color: #e69138;"&gt;oauth_access_tokens&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;' already exists&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This error typically arises when the tables associated with Passport already exist in the database, causing a conflict during migration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The Laravel migration process tries to create tables such as:&lt;/p&gt;&lt;code&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;oauth_auth_codes&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_access_tokens&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_clients&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_personal_access_clients&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_refresh_tokens&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/code&gt;&lt;p&gt;If any of these tables already exist in your database, the migration process will fail.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;To resolve this issue, follow these steps:&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;1. Identify Existing Tables&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Check if the following Passport-related tables already exist in your database:&lt;/p&gt;&lt;code&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;oauth_auth_codes&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_access_tokens&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_clients&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_personal_access_clients&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;oauth_refresh_tokens&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/code&gt;&lt;p&gt;You can do this using a database management tool like &lt;span style="color: #38761d;"&gt;&lt;b&gt;phpMyAdmin &lt;/b&gt;&lt;/span&gt;or through the &lt;span style="color: #38761d;"&gt;&lt;b&gt;MySQL &lt;/b&gt;&lt;/span&gt;command line.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;2. Remove Existing Tables&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;If the tables exist, you can remove them manually or run the following SQL query in your database query editor:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;SET&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FOREIGN_KEY_CHECKS&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;DROP&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IF&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;EXISTS&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;database_name.oauth_auth_codes;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;DROP&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IF&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;EXISTS&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;database_name.oauth_access_tokens;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;DROP&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IF&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;EXISTS&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;database_name.oauth_clients;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;DROP&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IF&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;EXISTS&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;database_name.oauth_personal_access_clients;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;DROP&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IF&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;EXISTS&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;database_name.oauth_refresh_tokens;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;SET&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FOREIGN_KEY_CHECKS&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;strong&gt;Note&lt;/strong&gt;: Replace &lt;span style="color: #2b00fe;"&gt;&lt;b&gt;&lt;code&gt;database_name&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;with the actual name of your database.&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This will delete all the Passport-related tables, bypassing any foreign key constraints.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;3. Clear Migration Cache (&lt;i&gt;&lt;span style="color: #e69138;"&gt;Optional&lt;/span&gt;&lt;/i&gt;)&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;If the migration records still persist in the &lt;span style="color: #e69138;"&gt;&lt;code&gt;migrations&lt;/code&gt; &lt;/span&gt;table, clear them to ensure a clean migration process. Run the following query:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;DELETE&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;FROM&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;migrations&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;migration&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;LIKE&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'%oauth%'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;&lt;strong&gt;4. Re-run Laravel Migrations&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;After clearing the tables, run the migration command again:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;php&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;artisan&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;migrate&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This will recreate all Passport-related tables in your database.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Why Does This Happen?&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The error occurs if:&lt;/p&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;The Passport tables already exist in the database due to a previous migration or manual table creation.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;A database restore or rollback was incomplete, leaving behind residual tables.&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/7968070646867061580/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/10/troubleshooting-laravel-passport.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7968070646867061580" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7968070646867061580" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/10/troubleshooting-laravel-passport.html" rel="alternate" title="Troubleshooting Laravel Passport Migration Errors: &quot;Table Already Exists&quot;" type="text/html"/><author><name>Mar</name><uri>http://www.blogger.com/profile/13191156366773651504</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//1.bp.blogspot.com/-kTOceCWfl48/Z1riVgNK7uI/AAAAAAAAApY/Hvvyd7vktTsWkQXir5xVPyccjikIc8yGQCK4BGAYYCw/s1600/ACg8ocLO63CIO9zSJgUOxboEI3UczkxXdsoNAnn0Ui_REUghAPfGiuQZ%253Ds83-c-mo" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSXmfpyM8PHIK6tg2SQiNuvbjNndZH9KIcEnx1SDgqr6ARxKJsyvr7zXU4hNvDJ4vGuSKgD1nej8fbE5DhrmbCw-68yLssuBukIxjrTFqxKXq4EA6qTLbslMLxVkje-mSvtavP8kKJC_u1p6G-l7Edj1szWenReMCbCeZrHYjX6lFqoFZBMSeIAc2RLjc/s72-w640-h234-c/5205_103108511PM_1734013868_msedge.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-7374643727659939168</id><published>2024-12-08T07:32:00.005+08:00</published><updated>2024-12-12T09:49:40.561+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Errors &amp; Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="node"/><category scheme="http://www.blogger.com/atom/ns#" term="npm"/><category scheme="http://www.blogger.com/atom/ns#" term="Troubleshooting"/><title type="text">Troubleshooting: This version of npm is compatible with lockfileVersion@1</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVmIDD5qK6-YXDvNglZsGzWhukc4SwBaESsrUlse8cj2F4ph1AcLEeuJ0sho9L21jslr1CBYIoW8QlJNKI7Y32NqGBTATI8HG9hDr7imkh9nsaOujO8NudtLs2hyphenhyphenc02SIzrJf_1CmaxJH_NIp6nlfDwa4lSyOHiGiljmkXA1h0qqzkMN09JG7R9QEK_Sey/s1003/This%20version%20of%20npm%20is%20compatible%20with%20lockfileVersion.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="320" data-original-width="1003" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVmIDD5qK6-YXDvNglZsGzWhukc4SwBaESsrUlse8cj2F4ph1AcLEeuJ0sho9L21jslr1CBYIoW8QlJNKI7Y32NqGBTATI8HG9hDr7imkh9nsaOujO8NudtLs2hyphenhyphenc02SIzrJf_1CmaxJH_NIp6nlfDwa4lSyOHiGiljmkXA1h0qqzkMN09JG7R9QEK_Sey/w640-h204/This%20version%20of%20npm%20is%20compatible%20with%20lockfileVersion.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;When installing the &lt;code&gt;&lt;span style="color: #e69138;"&gt;laravel-echo&lt;/span&gt;&lt;/code&gt; and &lt;code&gt;&lt;span style="color: #e69138;"&gt;pusher-js&lt;/span&gt;&lt;/code&gt; packages. This issue arises because the version of &lt;code&gt;npm&lt;/code&gt; being used is incompatible with the lockfile version specified in your &lt;code&gt;&lt;span style="color: #e69138;"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt; file. Let’s dive into a detailed explanation and the solution:&lt;/p&gt;&lt;h4 style="text-align: left;"&gt;Error:&lt;/h4&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@0. I'll try to do my best with it!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This error typically occurs when you use an updated version of &lt;span style="color: #e69138;"&gt;&lt;code&gt;npm&lt;/code&gt; &lt;/span&gt;that expects &lt;code&gt;&lt;span style="color: #e69138;"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt; files to have &lt;span style="color: #e69138;"&gt;&lt;code&gt;lockfileVersion&lt;/code&gt; &lt;/span&gt;set to &lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;, but the existing &lt;code&gt;&lt;span style="color: #e69138;"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt; file is based on an earlier version (e.g.,&lt;span style="color: #e69138;"&gt;&lt;b&gt; &lt;code&gt;0&lt;/code&gt;&lt;/b&gt;&lt;/span&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Steps to Fix the Issue:&lt;/strong&gt;&lt;/h3&gt;&lt;h4&gt;&lt;strong&gt;1. Delete the Existing &lt;code&gt;&lt;span style="color: #e69138;"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt; File&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;The &lt;code&gt;&lt;span style="color: #e69138;"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt; file locks dependencies to specific versions for consistency. However, if it's outdated or corrupted, it can cause compatibility issues. Delete it by running:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;rm package-lock.json&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Alternatively, &lt;i&gt;manually locate and delete the file in your project directory.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;2. Clear npm Cache&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;To ensure no cached data interferes with the installation process, clear the &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;npm&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;cache:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;npm cache clean --force&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Adding the &lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;--force&lt;/b&gt;&lt;/span&gt;&lt;/code&gt; flag ensures the cache is cleaned, even if warnings arise. However, use it cautiously to avoid unintended side effects.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;3. Reinstall the Dependencies&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Run the command again to install the required packages:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;npm install --save laravel-echo pusher-js&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;The &lt;code&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;--save&lt;/span&gt;&lt;/b&gt;&lt;/code&gt; flag ensures that the dependencies are added to your &lt;b&gt;&lt;span style="color: #e69138;"&gt;&lt;code&gt;dependencies&lt;/code&gt; &lt;/span&gt;&lt;/b&gt;section in &lt;code&gt;&lt;span style="color: #e69138;"&gt;package.json&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;4. Verify Success&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Once the installation completes, check the &lt;span style="color: #e69138;"&gt;&lt;code&gt;node_modules&lt;/code&gt; &lt;/span&gt;directory to confirm that &lt;code&gt;&lt;span style="color: #e69138;"&gt;laravel-echo&lt;/span&gt;&lt;/code&gt; and &lt;code&gt;&lt;span style="color: #e69138;"&gt;pusher-js&lt;/span&gt;&lt;/code&gt; have been installed correctly.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Why Does This Happen?&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;This issue occurs due to differences in &lt;code&gt;&lt;span style="color: #e69138;"&gt;lockfileVersion&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;lockfileVersion@0:&lt;/strong&gt; Used in older &lt;code&gt;npm&lt;/code&gt; versions (e.g., &lt;code&gt;npm@5&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;lockfileVersion@1:&lt;/strong&gt; Introduced in &lt;code&gt;npm@6&lt;/code&gt;, offering improved reliability and consistency.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If your &lt;b&gt;&lt;span style="color: #e69138;"&gt;&lt;code&gt;npm&lt;/code&gt; &lt;/span&gt;&lt;/b&gt;version is updated but your &lt;code&gt;&lt;span style="color: #e69138;"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt; file is still using the older format, conflicts arise.&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/7374643727659939168/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/troubleshooting-this-version-of-npm-is.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7374643727659939168" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7374643727659939168" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/troubleshooting-this-version-of-npm-is.html" rel="alternate" title="Troubleshooting: This version of npm is compatible with lockfileVersion@1" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVmIDD5qK6-YXDvNglZsGzWhukc4SwBaESsrUlse8cj2F4ph1AcLEeuJ0sho9L21jslr1CBYIoW8QlJNKI7Y32NqGBTATI8HG9hDr7imkh9nsaOujO8NudtLs2hyphenhyphenc02SIzrJf_1CmaxJH_NIp6nlfDwa4lSyOHiGiljmkXA1h0qqzkMN09JG7R9QEK_Sey/s72-w640-h204-c/This%20version%20of%20npm%20is%20compatible%20with%20lockfileVersion.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-2723978870786649941</id><published>2024-12-08T06:51:00.029+08:00</published><updated>2024-12-12T07:09:12.422+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Errors &amp; Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Troubleshooting"/><title type="text">Troubleshooting: The server requested authentication method unknown to the client</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEGoixY2jt3SyWjarZzXgN0LXUtwwyoVZDvNhOBGcdDpVmFgTTb-bPBio9UTt-9g1715u8dPc9TqKnBcGFNMgQzrTE_73wmZYlzJGZHqkaXWpyroT4aOLqY-QJV2P-ltZQX3PPRlmFs0chV0TUi6wd_ZjvhWbXdiER3ak9nTivvw4v7P5qgmEpDy70phG-/s1434/The%20server%20requested%20authentication%20method%20unknown%20to%20the%20client.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="894" data-original-width="1434" height="398" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEGoixY2jt3SyWjarZzXgN0LXUtwwyoVZDvNhOBGcdDpVmFgTTb-bPBio9UTt-9g1715u8dPc9TqKnBcGFNMgQzrTE_73wmZYlzJGZHqkaXWpyroT4aOLqY-QJV2P-ltZQX3PPRlmFs0chV0TUi6wd_ZjvhWbXdiER3ak9nTivvw4v7P5qgmEpDy70phG-/w640-h398/The%20server%20requested%20authentication%20method%20unknown%20to%20the%20client.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="background-color: white;"&gt;&lt;span face="system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Ubuntu, Cantarell, Oxygen, Roboto, Helvetica, Arial, sans-serif"&gt;&lt;h2 style="text-align: left;"&gt;&lt;span style="color: #cc0000;"&gt;&lt;blockquote&gt;&lt;span style="font-size: medium;"&gt;The server requested authentication method unknown to the client&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style="font-size: 14px;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 14px;"&gt;The cause of this is MySQL v8.0+, it changes the default method to authentication of the database. Therefore, you need to get your hand on the MySQL server to fix it.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;b&gt;METHOD 1.&lt;/b&gt; &lt;span style="font-weight: normal;"&gt;Run this query to your MySQL query editor or you can run it in CLI.&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;ALTER&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;USER&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'root'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'localhost'&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IDENTIFIED&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;WITH&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;mysql_native_password&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;BY&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'password'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;METHOD 2.&lt;/b&gt; &lt;span style="font-weight: normal;"&gt;Change MySQL server configuration to use a native password as the default method for authentication. In my case, I used &lt;a href="https://laragon.org/download/" target="_blank"&gt;laragon &lt;/a&gt;and it can be found &lt;/span&gt;&lt;span style="color: #e69138; font-family: courier; font-weight: normal;"&gt;C:\laragon\bin\mysql\mysql-&amp;lt;version&amp;gt;\my.ini&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;. find the &lt;/span&gt;&lt;span style="color: #e69138; font-family: courier;"&gt;[mysqld]&lt;/span&gt;&lt;span style="font-weight: normal;"&gt; section and add the following line:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;[mysqld]&lt;/span&gt;
&lt;span style="color: #a6e22e;"&gt;default_authentication_plugin&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;mysql_native_password&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then restart MySQL server.&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/2723978870786649941/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/troubleshooting-server-requested.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/2723978870786649941" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/2723978870786649941" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/12/troubleshooting-server-requested.html" rel="alternate" title="Troubleshooting: The server requested authentication method unknown to the client" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEGoixY2jt3SyWjarZzXgN0LXUtwwyoVZDvNhOBGcdDpVmFgTTb-bPBio9UTt-9g1715u8dPc9TqKnBcGFNMgQzrTE_73wmZYlzJGZHqkaXWpyroT4aOLqY-QJV2P-ltZQX3PPRlmFs0chV0TUi6wd_ZjvhWbXdiER3ak9nTivvw4v7P5qgmEpDy70phG-/s72-w640-h398-c/The%20server%20requested%20authentication%20method%20unknown%20to%20the%20client.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-6397992940759112818</id><published>2024-11-22T11:05:00.004+08:00</published><updated>2024-11-22T13:21:23.428+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><title type="text">Flutter: Gradient rounded button</title><content type="html">&lt;p&gt;&amp;nbsp;To create a gradient rounded button, we will use the &lt;span style="color: #e69138;"&gt;&lt;code&gt;Container&lt;/code&gt; &lt;/span&gt;widget with a &lt;span style="color: #e69138;"&gt;&lt;code&gt;BoxDecoration&lt;/code&gt; &lt;/span&gt;that includes both a &lt;span style="color: #e69138;"&gt;&lt;code&gt;LinearGradient&lt;/code&gt; &lt;/span&gt;for the background color and &lt;span style="color: #e69138;"&gt;&lt;code&gt;BorderRadius&lt;/code&gt; &lt;/span&gt;for the rounded corners. Wrap this &lt;span style="color: #e69138;"&gt;&lt;code&gt;Container&lt;/code&gt; &lt;/span&gt;inside a &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;GestureDetector&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;or &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;InkWell&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;to make it respond to touch events.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here’s a code snippet for our stateless widget (&lt;b&gt;&lt;span style="color: #ffa400;"&gt;gradient_rounded_button.dart&lt;/span&gt;&lt;/b&gt;):&lt;/p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;import&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;package&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;flutter&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;material&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;dart'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;borderRadius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;VoidCallback&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

  &lt;span style="color: #f8f8f2;"&gt;const&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;({&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;borderRadius&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;30&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;});&lt;/span&gt;

  &lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;override&lt;/span&gt;
  &lt;span style="color: #a6e22e;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GestureDetector&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;onTap&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Container&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;padding&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.symmetric&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;vertical&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;15&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;horizontal&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;30&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;decoration&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;BoxDecoration&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;gradient&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;LinearGradient&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;colors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;begin&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Alignment.topLeft&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;end&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Alignment.bottomRight&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;borderRadius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BorderRadius.circular&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;borderRadius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;boxShadow&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;[&lt;/span&gt;
            &lt;span style="color: #a6e22e;"&gt;BoxShadow&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;last&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;withOpacity&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;offset&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Offset&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;blurRadius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;],&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Center&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;style&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;TextStyle&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.white&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;fontSize&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;fontWeight&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FontWeight.bold&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Explanation of important keys to make this widget&amp;nbsp;&lt;/h3&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Gradient&lt;/strong&gt;: The &lt;span style="color: #e69138;"&gt;&lt;code&gt;BoxDecoration&lt;/code&gt; &lt;/span&gt;uses a &lt;span style="color: #e69138;"&gt;&lt;code&gt;LinearGradient&lt;/code&gt; &lt;/span&gt;to apply a gradient effect with &lt;code&gt;&lt;span style="color: #e69138;"&gt;gradientColors&lt;/span&gt;&lt;/code&gt;, which you can customize by passing a list of colors.&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Rounded Corners&lt;/strong&gt;: The &lt;span style="color: #e69138;"&gt;&lt;code&gt;borderRadius&lt;/code&gt; &lt;/span&gt;property of &lt;span style="color: #e69138;"&gt;&lt;code&gt;BoxDecoration&lt;/code&gt; &lt;/span&gt;rounds the corners. Adjust the &lt;code&gt;&lt;span style="color: #e69138;"&gt;BorderRadius.circular&lt;/span&gt;&lt;/code&gt; value to change the level of roundness.&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Shadow&lt;/strong&gt;: The &lt;span style="color: #e69138;"&gt;&lt;code&gt;boxShadow&lt;/code&gt; &lt;/span&gt;property adds a subtle shadow effect, using the last color in &lt;span style="color: #e69138;"&gt;&lt;code&gt;gradientColors&lt;/code&gt; &lt;/span&gt;for a cohesive look.&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4.&amp;nbsp;&lt;/span&gt;Text and Gesture&lt;/strong&gt;: The &lt;span style="color: #e69138;"&gt;&lt;code&gt;GestureDetector&lt;/code&gt; &lt;/span&gt;wraps the &lt;code&gt;&lt;span style="color: #e69138;"&gt;Container&lt;/span&gt;&lt;/code&gt;, making the button tappable. &lt;span style="color: #e69138;"&gt;&lt;code&gt;Text&lt;/code&gt; &lt;/span&gt;styling is applied for better readability over the gradient background.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;Usage of the widget&lt;/h3&gt;&lt;p&gt;In the code above, the &lt;span style="color: #e69138;"&gt;&lt;code&gt;GradientRoundedButton&lt;/code&gt; &lt;/span&gt;widget is reusable. Pass the &lt;b&gt;text&lt;/b&gt;, &lt;b&gt;gradient colors&lt;/b&gt;,&amp;nbsp;&lt;b&gt;&lt;code&gt;borderRadius&lt;/code&gt;&amp;nbsp;&lt;/b&gt;, and an &lt;b&gt;&lt;code&gt;onPressed&lt;/code&gt; &lt;/b&gt;callback to create multiple gradient buttons with different styles. Here is an example on how to use the widget (&lt;b&gt;&lt;span style="color: #ffa400;"&gt;main.dart&lt;/span&gt;&lt;/b&gt;).&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;import&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;package&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;flutter&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;material&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;dart'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;main()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;runApp&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;MyApp&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;MyApp&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;override&lt;/span&gt;
  &lt;span style="color: #a6e22e;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;MaterialApp&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;home&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButtonDemo&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButtonDemo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;override&lt;/span&gt;
  &lt;span style="color: #a6e22e;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Scaffold&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;appBar&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;AppBar&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;title&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Gradient Rounded Button"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Center&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"PressMe"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;[&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Colors.blue&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.purple&lt;/span&gt;&lt;span style="color: #f92672;"&gt;],&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;print&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Button Pressed!"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;},&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;(&lt;b&gt;Hmmmm&lt;/b&gt;...) This is the sample result of the above code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaZSsoM38RDtjqK5dxNVxXzVeDjgYyLGwqmQUGY8EHwkyWs8RDYKJ4v-qwtUDwXTPMpag1R5bT0jnCJsk0Q-A_HNk80EkqGLNuEVxxtN8SZIzYGBOkw80YPFeQPqqoPjZ8Fon5wVPUZT0ANH3pnuV-qYrPJ94rhVl8wAmRVU2kfJjh7vcqAQTPXgO5cuVD/s1264/5120_063141081AM_1732228301_kds.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="681" data-original-width="1264" height="344" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaZSsoM38RDtjqK5dxNVxXzVeDjgYyLGwqmQUGY8EHwkyWs8RDYKJ4v-qwtUDwXTPMpag1R5bT0jnCJsk0Q-A_HNk80EkqGLNuEVxxtN8SZIzYGBOkw80YPFeQPqqoPjZ8Fon5wVPUZT0ANH3pnuV-qYrPJ94rhVl8wAmRVU2kfJjh7vcqAQTPXgO5cuVD/w640-h344/5120_063141081AM_1732228301_kds.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;The output sample above does not give users feedback when the user interacts with the UI. We need to enhance the widget we created to make the button feel more responsive and polished. And, in the current state of the button we need to wrap it with the other widget to define the width and height.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By adding hover effects, as well as specifying the width and height for buttons, we can enhance the user interface, especially in applications where user interaction is essential, such as on &lt;b&gt;&lt;i&gt;desktops &lt;/i&gt;&lt;/b&gt;or &lt;b&gt;&lt;i&gt;web &lt;/i&gt;&lt;/b&gt;platforms. Here’s why these additions are beneficial:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3 style="text-align: left;"&gt;1. &lt;strong&gt;Hover Effects&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #ffa400;"&gt;Improved User Experience&lt;/span&gt;&lt;/strong&gt;: Hover effects give users feedback when they interact with UI elements, making the application feel more responsive and polished.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Visual Cue&lt;/span&gt;&lt;/strong&gt;: Hovering can signal to the user that the element is clickable or interactive, which is particularly important on larger screens (like desktop and web) where the pointer is used.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Aesthetic Appeal&lt;/span&gt;&lt;/strong&gt;: Transitioning colors or shadows when hovering can add a level of visual sophistication, making the app feel more engaging and modern.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In Flutter, hover effects are especially relevant when building apps that run on desktops or web, where the user interacts with the UI via a mouse or trackpad rather than just touch.&lt;/p&gt;&lt;h3&gt;2. &lt;strong&gt;Width and Height&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Consistent Button Size&lt;/span&gt;&lt;/strong&gt;: Specifying width and height ensures the button remains consistent in size across different screens or layouts. Without set dimensions, the button might resize based on its content, leading to a less uniform appearance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Layout Control&lt;/span&gt;&lt;/strong&gt;: Setting dimensions allows you to control the exact placement and alignment of the button within its parent container, giving you more control over the overall layout.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Responsive Design&lt;/span&gt;&lt;/strong&gt;: On larger screens, having specific dimensions prevents UI elements from looking disproportionately small or large. You can also make the dimensions responsive to adapt to different screen sizes (e.g., by using &lt;code&gt;MediaQuery&lt;/code&gt; to set the size based on screen dimensions).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Updated Code Example with Hover Effects, and&amp;nbsp; Width and Height&lt;/h3&gt;&lt;p&gt;Here’s an updated code (&lt;b&gt;&lt;span style="color: #ffa400;"&gt;gradient_rounded_button.dart&lt;/span&gt;&lt;/b&gt;) that includes hover colors, and width and height for the button:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;StatefulWidget&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;height&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;hoverGradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;final&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;VoidCallback&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

  &lt;span style="color: #f8f8f2;"&gt;const&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;({&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;hoverGradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;height&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;});&lt;/span&gt;

  &lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;GradientRoundedButtonState&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createState()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;GradientRoundedButtonState()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;GradientRoundedButtonState&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;State&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;bool&lt;/span&gt; &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;isHovered&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;false&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

  &lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;override&lt;/span&gt;
  &lt;span style="color: #a6e22e;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;MouseRegion&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;onEnter&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(_)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;setState&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;isHovered&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;true&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;});&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;},&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;onExit&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(_)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;setState&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;isHovered&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;false&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;});&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;},&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GestureDetector&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;onTap&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;AnimatedContainer&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;height&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;height&lt;/span&gt; &lt;span style="color: #f92672;"&gt;??&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;50&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;duration&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Duration&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;milliseconds&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;padding&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;EdgeInsets.symmetric&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;vertical&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;15&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;horizontal&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;30&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;decoration&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;BoxDecoration&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;gradient&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;LinearGradient&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;colors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;isHovered&lt;/span&gt; &lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;hoverGradientColors&lt;/span&gt; &lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #66d9ef;"&gt;begin&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Alignment.topLeft&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #66d9ef;"&gt;end&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Alignment.bottomRight&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;borderRadius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BorderRadius.circular&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;30&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;boxShadow&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;[&lt;/span&gt;
              &lt;span style="color: #a6e22e;"&gt;BoxShadow&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(_&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;isHovered&lt;/span&gt; &lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;hoverGradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;last&lt;/span&gt; &lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;last&lt;/span&gt;&lt;span style="color: #f92672;"&gt;).&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;withOpacity&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;offset&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Offset&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;blurRadius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;],&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Center&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;widget&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;style&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;TextStyle&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.white&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;fontSize&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;fontWeight&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FontWeight.bold&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;As we can see in the updated codes, we changed from&amp;nbsp;&lt;code style="color: #e69138;"&gt;StatelessWidget&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;into&amp;nbsp;&lt;code style="color: #e69138;"&gt;StatefulWidget&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;and added some properties for&amp;nbsp;&lt;code style="color: #e69138;"&gt;hoverGradientColors&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp; ,&amp;nbsp;&lt;/span&gt;and &lt;code style="color: #e69138;"&gt;width&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;/&lt;code style="color: #e69138;"&gt;height&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;. And wrap it with&amp;nbsp;&lt;code style="color: #e69138;"&gt;MouseRegion&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;with a core functions&amp;nbsp;&lt;code style="color: #e69138;"&gt;onEnter&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;and&amp;nbsp;&lt;code style="color: #e69138;"&gt;onExit&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;that handles the changes of the hover state.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Explanation of the changes&lt;/h3&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;MouseRegion Widget&lt;/strong&gt;:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Wraps the button to detect mouse enter and exit events.&lt;/li&gt;&lt;li&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;onEnter&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;sets &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;_isHovered&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;to &lt;code&gt;&lt;span style="color: #e69138;"&gt;true&lt;/span&gt;&lt;/code&gt;, and &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;onExit&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;sets it to &lt;code&gt;&lt;span style="color: #e69138;"&gt;false&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;AnimatedContainer&lt;/strong&gt;:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Used to smoothly animate the gradient color change when hovering.&lt;/li&gt;&lt;li&gt;The &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;duration&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;property specifies the animation duration for the hover effect.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Gradient Colors on Hover&lt;/strong&gt;:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;When &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;_isHovered&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;is &lt;code&gt;&lt;span style="color: #e69138;"&gt;true&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;widget.hoverGradientColors&lt;/span&gt;&lt;/code&gt; is used for the gradient.&lt;/li&gt;&lt;li&gt;When &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;_isHovered&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;is &lt;code&gt;&lt;span style="color: #e69138;"&gt;false&lt;/span&gt;&lt;/code&gt;, the default &lt;code&gt;&lt;span style="color: #e69138;"&gt;widget.gradientColors&lt;/span&gt;&lt;/code&gt; is used.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4.&amp;nbsp;&lt;/span&gt;Hover Shadow&lt;/strong&gt;:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Adjusts the shadow color based on whether the button is hovered, creating a subtle shadow effect that changes with the gradient.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Usage of the changes&lt;/h3&gt;&lt;p&gt;In this example, you specify both the normal gradient colors (&lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;gradientColors&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;) and the hover gradient colors (&lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;hoverGradientColors&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;) when creating the &lt;code&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;GradientRoundedButton&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;. Now, when you hover over the button, it will smoothly transition to the hover gradient colors. Adjust the colors as needed for your desired hover effect.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the example of the updated code for (&lt;span style="color: #ffa400;"&gt;&lt;b&gt;main.dart&lt;/b&gt;&lt;/span&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButtonDemo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;@&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;override&lt;/span&gt;
  &lt;span style="color: #a6e22e;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Scaffold&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;appBar&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;AppBar&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;title&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Gradient Rounded Button"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Center&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GradientRoundedButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;text&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Press Me"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;gradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;[&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Colors.blue&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.purple&lt;/span&gt;&lt;span style="color: #f92672;"&gt;],&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;hoverGradientColors&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f92672;"&gt;[&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Colors.purple&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.blue&lt;/span&gt;&lt;span style="color: #f92672;"&gt;],&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;onPressed&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #75715e;"&gt;// Handle button press&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;print&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Button Pressed!"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;},&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f92672;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The final result of our changes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixe2Uq5e7ockuXh0If_jL9VYuQbIXVEMFbrXK0ALWwWMd8iqre2LhJCvIe2G1XvsVPW3xGU6nLGGEdsz2kxwWmNvT2WlcJKnqBJu9l2YeW4ycSRB9pzFEEsMB-3geKAB84guygWw72v1tsZDlIXcmXomcKz_5g4I6iocZySwXwLMdwYXJZbimRiIonDE5f/s1179/5122_063524613AM_1732228524_kds.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="681" data-original-width="1179" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixe2Uq5e7ockuXh0If_jL9VYuQbIXVEMFbrXK0ALWwWMd8iqre2LhJCvIe2G1XvsVPW3xGU6nLGGEdsz2kxwWmNvT2WlcJKnqBJu9l2YeW4ycSRB9pzFEEsMB-3geKAB84guygWw72v1tsZDlIXcmXomcKz_5g4I6iocZySwXwLMdwYXJZbimRiIonDE5f/w640-h370/5122_063524613AM_1732228524_kds.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;With these adjustments, the button will have a consistent size and a responsive hover effect, making it well-suited for web or desktop applications. You can modify &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; values as needed or even make them responsive based on the screen size.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/6397992940759112818/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/flutter-gradient-rounded-button.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/6397992940759112818" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/6397992940759112818" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/flutter-gradient-rounded-button.html" rel="alternate" title="Flutter: Gradient rounded button" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaZSsoM38RDtjqK5dxNVxXzVeDjgYyLGwqmQUGY8EHwkyWs8RDYKJ4v-qwtUDwXTPMpag1R5bT0jnCJsk0Q-A_HNk80EkqGLNuEVxxtN8SZIzYGBOkw80YPFeQPqqoPjZ8Fon5wVPUZT0ANH3pnuV-qYrPJ94rhVl8wAmRVU2kfJjh7vcqAQTPXgO5cuVD/s72-w640-h344-c/5120_063141081AM_1732228301_kds.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-8891937051389615870</id><published>2024-11-13T12:38:00.003+08:00</published><updated>2024-11-13T12:38:23.785+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="REST API"/><title type="text">Building a REST API Client in Java with Swing</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1l0M4KkNL3D5gFmdnXitvl5_KuWZswzu3tjkLD4bCGajBxvtgfeKVsFCF6rODdk8gFqDrukfjfprtUYODudbR-qAWQkislW6lsYqxRkcerfUuMAPzY9kjVAZPnepEH2y_agThcTg5hyKh8dHZsvO8mkU9atIJhBga8LKplOVlKIBXq74Bd8ZJtsWTC24/s800/java-api.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="400" data-original-width="800" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1l0M4KkNL3D5gFmdnXitvl5_KuWZswzu3tjkLD4bCGajBxvtgfeKVsFCF6rODdk8gFqDrukfjfprtUYODudbR-qAWQkislW6lsYqxRkcerfUuMAPzY9kjVAZPnepEH2y_agThcTg5hyKh8dHZsvO8mkU9atIJhBga8LKplOVlKIBXq74Bd8ZJtsWTC24/w640-h320/java-api.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;In this tutorial, we’ll walk through creating a REST API client in Java using the Swing library. This client will interact with a REST API server to manage product data. We'll cover CRUD (Create, Read, Update, Delete) operations, and focus on building a simple graphical interface to make these actions user-friendly.&lt;/p&gt;&lt;h3&gt;Prerequisites&lt;/h3&gt;&lt;p&gt;To follow this tutorial, it’s recommended that you review our &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" rel="noopener" target="_blank"&gt;previous article on building a REST API server with PHP&lt;/a&gt;, where we implemented basic CRUD endpoints for managing products and categories. Additionally, we previously created articles&amp;nbsp;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html" target="_blank"&gt;building a REST API Client in C# with Windows Form&lt;/a&gt;&amp;nbsp;and &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-python-with.html" rel="noopener" target="_blank"&gt;building a REST API Client in Python with PyQt5&lt;/a&gt;, which can serve as a helpful comparison.&lt;/p&gt;&lt;h3&gt;Project Overview&lt;/h3&gt;&lt;p&gt;Our Java Swing client will perform these actions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Retrieve and display a list of products&lt;/li&gt;&lt;li&gt;Add new products&lt;/li&gt;&lt;li&gt;Update existing products&lt;/li&gt;&lt;li&gt;Delete products&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For this, we'll use Java's &lt;span style="color: #e69138;"&gt;&lt;code&gt;HttpURLConnection&lt;/code&gt; &lt;/span&gt;for making HTTP requests and Swing components for the UI.&lt;/p&gt;&lt;h3&gt;Setting Up the Java Project&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Create a New Java Project&lt;/strong&gt; in your IDE of choice.&lt;/li&gt;&lt;li&gt;Add any necessary imports for &lt;code&gt;&lt;span style="color: #e69138;"&gt;HttpURLConnection&lt;/span&gt;&lt;/code&gt;, JSON parsing (&lt;a href="https://mavenlibs.com/jar/file/org.json/json" target="_blank"&gt;org.json&lt;/a&gt;), and Swing components.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Complete Code Implementation&lt;/h3&gt;&lt;p&gt;Below is a basic setup for the Swing client, with each CRUD operation explained.&lt;/p&gt;&lt;h4&gt;Main Java Swing Client Class&lt;/h4&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;javax.swing.*&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;javax.swing.table.DefaultTableModel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;java.awt.*&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;java.io.*&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;java.net.HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;java.net.URL&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;org.json.JSONArray&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;org.json.JSONObject&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ProductAPIClient&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JFrame&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTextField&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;nameField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;descriptionField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTextField&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;priceField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JButton&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;fetchButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;updateButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;deleteButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTable&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DefaultTableModel&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;tableModel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

    &lt;span style="color: #75715e;"&gt;//private static final String API_BASE_URL = "http://localhost:8000/api/products";&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;API_BASE_URL&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"https://bcssti.com/api-sample/products"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ProductAPIClient&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;setTitle&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Product API Client"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;setSize&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;600&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;400&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;setDefaultCloseOperation&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;JFrame&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;EXIT_ON_CLOSE&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;setLayout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FlowLayout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;nameField&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTextField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;descriptionField&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTextField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;15&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;priceField&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTextField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;createButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Create Product"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;fetchButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Get All Products"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;updateButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Update Product"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;deleteButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Delete Product"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Set up table model and JTable&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;tableModel&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DefaultTableModel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;[]{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"ID"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Name"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Description"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Price"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;},&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;tableModel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setPreferredScrollableViewportSize&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Dimension&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;550&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;JScrollPane&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;scrollPane&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JScrollPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JLabel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Name:"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;nameField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JLabel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Description:"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;descriptionField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JLabel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Price:"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;priceField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;createButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;fetchButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;updateButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;deleteButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;add&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;scrollPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;createButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;addActionListener&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createProduct&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;nameField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;descriptionField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;priceField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()));&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;fetchButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;addActionListener&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;getAllProducts&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;updateButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;addActionListener&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;updateProduct&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;nameField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;descriptionField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;priceField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()));&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;deleteButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;addActionListener&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;deleteProduct&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;nameField&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getText&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()));&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;createProduct&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Double&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;parseDouble&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;

            &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;API_BASE_URL&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"/"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;openConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestMethod&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"POST"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Accept"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Content-Type"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Cache-Control"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"no-cache"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setDoOutput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

            &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;OutputStream&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;os&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getOutputStream&lt;/span&gt;&lt;span style="color: #f92672;"&gt;())&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;System&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;out&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;println&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;toString&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;byte&lt;/span&gt;&lt;span style="color: #f92672;"&gt;[]&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;input&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;toString&lt;/span&gt;&lt;span style="color: #f92672;"&gt;().&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getBytes&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"utf-8"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;os&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;write&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;input&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;input&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;length&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;os&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;flush&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

            &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getResponseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;HTTP_OK&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product created successfully."&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getAllProducts&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to create product: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;disconnect&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getMessage&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;getAllProducts&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;API_BASE_URL&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;openConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestMethod&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"GET"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Cache-Control"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"no-cache"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

            &lt;span style="color: #f8f8f2;"&gt;BufferedReader&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;in&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;BufferedReader&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;InputStreamReader&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getInputStream&lt;/span&gt;&lt;span style="color: #f92672;"&gt;()));&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;inputLine&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;StringBuilder&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;content&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StringBuilder&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;

            &lt;span style="color: #66d9ef;"&gt;while&lt;/span&gt; &lt;span style="color: #f92672;"&gt;((&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;inputLine&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;in&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;readLine&lt;/span&gt;&lt;span style="color: #f92672;"&gt;())&lt;/span&gt; &lt;span style="color: #f92672;"&gt;!=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;content&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;append&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;inputLine&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;in&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;close&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;disconnect&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;

            &lt;span style="color: #f8f8f2;"&gt;JSONArray&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JSONArray&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;content&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;toString&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;

            &lt;span style="color: #75715e;"&gt;// Clear existing rows in the table model&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;tableModel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRowCount&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

            &lt;span style="color: #75715e;"&gt;// Populate the JTable with data&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;i&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;i&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;length&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;i&lt;/span&gt;&lt;span style="color: #f92672;"&gt;++)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getJSONObject&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;i&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getInt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"id"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getString&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getString&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getDouble&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;tableModel&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;addRow&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Object&lt;/span&gt;&lt;span style="color: #f92672;"&gt;[]{&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;id&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt;&lt;span style="color: #f92672;"&gt;});&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getMessage&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;updateProduct&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productId&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Integer&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;parseInt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showInputDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Enter Product ID to Update"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Double&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;parseDouble&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;

            &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;API_BASE_URL&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"?id="&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productId&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;openConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestMethod&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"PUT"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Content-Type"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Cache-Control"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"no-cache"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setDoOutput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

            &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;OutputStream&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;os&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getOutputStream&lt;/span&gt;&lt;span style="color: #f92672;"&gt;())&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;os&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;write&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;toString&lt;/span&gt;&lt;span style="color: #f92672;"&gt;().&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getBytes&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;os&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;flush&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

            &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getResponseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;HTTP_OK&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product updated successfully."&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getAllProducts&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to update product: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;disconnect&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getMessage&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;deleteProduct&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productId&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Integer&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;parseInt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showInputDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Enter Product ID to Delete"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;urlPath&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;API_BASE_URL&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"?id="&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productId&lt;/span&gt;&lt;span style="color: #f92672;"&gt;;&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;URL&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;urlPath&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;openConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestMethod&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"DELETE"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Cache-Control"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"no-cache"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;

            &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getResponseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;HTTP_OK&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product deleted successfully."&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getAllProducts&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to delete product: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"\n"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;urlPath&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;disconnect&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getMessage&lt;/span&gt;&lt;span style="color: #f92672;"&gt;());&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;main&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;String&lt;/span&gt;&lt;span style="color: #f92672;"&gt;[]&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;args&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;SwingUtilities&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;invokeLater&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;ProductAPIClient&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ProductAPIClient&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;client&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setVisible&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f92672;"&gt;});&lt;/span&gt;
    &lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Explanation of Key Sections&lt;/h3&gt;&lt;h4&gt;1.&amp;nbsp;&lt;strong&gt;Setting Up HTTP Requests with &lt;code&gt;HttpURLConnection&lt;/code&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;In the &lt;span style="color: #e69138;"&gt;&lt;code&gt;createProduct&lt;/code&gt; &lt;/span&gt;method, we use &lt;span style="color: #e69138;"&gt;&lt;code&gt;HttpURLConnection&lt;/code&gt; &lt;/span&gt;to set up a connection to our API:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;url&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;openConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestMethod&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"POST"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Content-Type"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setRequestProperty&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Cache-Control"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"no-cache"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setDoOutput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Here we use &lt;code&gt;&lt;span style="color: #e69138;"&gt;Cache-Control: no-cache&lt;/span&gt;&lt;/code&gt; to ensure that the request bypasses any local or proxy cache, so the client always gets the latest response directly from the server.&lt;/p&gt;&lt;h4&gt;2.&amp;nbsp;&lt;strong&gt;JSON Payload Construction and Transmission&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Using &lt;code&gt;&lt;span style="color: #e69138;"&gt;org.json.JSONObject&lt;/span&gt;&lt;/code&gt;, we create the JSON payload for our product:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JSONObject&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;jsonInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;put&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Double&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;parseDouble&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt;&lt;span style="color: #f92672;"&gt;));&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;After preparing the JSON object, we convert it to a byte array and send it to the server using &lt;code&gt;OutputStream&lt;/code&gt;.&lt;/p&gt;&lt;h4&gt;3. &lt;strong&gt;Handling Server Responses&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;We check the response code to confirm if the creation was successful:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getResponseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HttpURLConnection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;HTTP_OK&lt;/span&gt;&lt;span style="color: #f92672;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product created successfully."&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
	&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getAllProducts&lt;/span&gt;&lt;span style="color: #f92672;"&gt;();&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f92672;"&gt;{&lt;/span&gt;
	&lt;span style="color: #f8f8f2;"&gt;JOptionPane&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;showMessageDialog&lt;/span&gt;&lt;span style="color: #f92672;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to create product: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseCode&lt;/span&gt;&lt;span style="color: #f92672;"&gt;);&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;This feedback informs the user of the result and makes troubleshooting easier.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Wrapping Up&lt;/h3&gt;&lt;p&gt;In this article, we developed a basic Java client to interact with a REST API. This client enables CRUD operations on products and uses essential headers to manage data freshness and consistency. You can further enhance this client by:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Adding error handling and input validation&lt;/li&gt;&lt;li&gt;Creating a more advanced GUI layout&lt;/li&gt;&lt;li&gt;Implementing additional API endpoints like categories&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Additional Resources&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" rel="noopener" target="_blank"&gt;Server-side REST API tutorial&lt;/a&gt; from our previous article.&lt;/li&gt;&lt;li&gt;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html" rel="noopener" target="_blank"&gt;C# REST API Client&lt;/a&gt;&amp;nbsp;and &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-python-with.html" target="_blank"&gt;Python REST API Client&lt;/a&gt; were built previously, showing another approach for interacting with the API with different language.&lt;/li&gt;&lt;li&gt;A &lt;a href="https://bcssti.com/api-sample/postman/API%20Native%20PHP-Sample.postman_collection.json" rel="noopener" target="_blank"&gt;downloadable Postman collection&lt;/a&gt; for testing the API directly.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By following this guide, you’ll have a fully functional Java Swing client ready to manage product data in a RESTful environment&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/8891937051389615870/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-java-with.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/8891937051389615870" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/8891937051389615870" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-java-with.html" rel="alternate" title="Building a REST API Client in Java with Swing" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZ1l0M4KkNL3D5gFmdnXitvl5_KuWZswzu3tjkLD4bCGajBxvtgfeKVsFCF6rODdk8gFqDrukfjfprtUYODudbR-qAWQkislW6lsYqxRkcerfUuMAPzY9kjVAZPnepEH2y_agThcTg5hyKh8dHZsvO8mkU9atIJhBga8LKplOVlKIBXq74Bd8ZJtsWTC24/s72-w640-h320-c/java-api.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-1590081162028420361</id><published>2024-11-13T12:37:00.018+08:00</published><updated>2024-11-14T10:13:59.906+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><category scheme="http://www.blogger.com/atom/ns#" term="REST API"/><title type="text">Building a REST API Client in Flutter and Dart</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJYy0oLQXIILa8O9Y2h5liRaEHytqA2a_qyGle64bdvet5j5cR0m1JyZbyWEeEaTL3wX-sk4TcTAJth0M_szwN70Nv7eg5VVeRSMwiFP6EbOB8rLtv24H46QmtAz6k3iAZpa8VdRiHxbaG_eGm5Oao4_oHrjAHeoXLjILgvWjEKsXkfGf8A-2va0J056aB/s800/flutter-api.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="400" data-original-width="800" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJYy0oLQXIILa8O9Y2h5liRaEHytqA2a_qyGle64bdvet5j5cR0m1JyZbyWEeEaTL3wX-sk4TcTAJth0M_szwN70Nv7eg5VVeRSMwiFP6EbOB8rLtv24H46QmtAz6k3iAZpa8VdRiHxbaG_eGm5Oao4_oHrjAHeoXLjILgvWjEKsXkfGf8A-2va0J056aB/w640-h320/flutter-api.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;In this tutorial, we’ll create a Flutter application that performs &lt;b&gt;CRUD &lt;/b&gt;(&lt;i&gt;Create, Read, Update, Delete&lt;/i&gt;) operations on a REST API. This app will interact with a backend API to manage product data, demonstrating the basics of HTTP requests, handling responses, and updating UI components.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;Prerequisites&lt;/span&gt;&lt;/h3&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Flutter Setup&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: Ensure Flutter is installed and set up.&lt;/span&gt;&lt;br /&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;API Ready&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: You should have a REST API server set up. (If not, you can check out our&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" rel="noopener" style="--animation-rate: var(--batch-play-rate-1); --streaming-animation-state: var(--batch-play-state-1); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; scrollbar-color: var(--main-surface-tertiary) transparent; text-decoration-line: none;" target="_blank"&gt;&lt;span style="--animation-count: 8; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;previous&lt;/span&gt;&lt;span style="--animation-count: 9; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;tutorial&lt;/span&gt;&lt;span style="--animation-count: 10; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;on&lt;/span&gt;&lt;span style="--animation-count: 11; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;setting&lt;/span&gt;&lt;span style="--animation-count: 12; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;up&lt;/span&gt;&lt;span style="--animation-count: 13; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;a&lt;/span&gt;&lt;span style="--animation-count: 14; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;server&lt;/span&gt;&lt;span style="--animation-count: 15; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;-side&lt;/span&gt;&lt;span style="--animation-count: 16; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;API&lt;/span&gt;&lt;span style="--animation-count: 17; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;with&lt;/span&gt;&lt;span style="--animation-count: 18; --streaming-animation-state: var(--batch-play-state-2); --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&amp;nbsp;PHP&lt;/span&gt;&lt;/a&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;as a prerequisite.)&lt;/span&gt;&lt;br /&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Dependencies&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: Install the&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;http&lt;/code&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;package in&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span style="color: #e69138;"&gt;pubspec.yaml&lt;/span&gt;&lt;/code&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;to make HTTP requests.&lt;/span&gt;&lt;div&gt;&lt;br /&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;dependencies&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;flutter&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
    &lt;span style="color: #ae81ff;"&gt;sdk&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;flutter&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;http&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;^0.13.0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;Step 1: Setting Up the Model&lt;/span&gt;&lt;/h3&gt;&lt;div style="border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 0.5rem; text-align: left;"&gt;&lt;span&gt;To manage products in our Flutter app, let’s create a model class that will represent a product entity.&lt;/span&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;// models/product.dart&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Product&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price;&lt;/span&gt;

  &lt;span style="color: #f8f8f2;"&gt;Product({required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.id,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.name,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.description,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;required&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.price});&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// Factory method to create a Product from JSON&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;factory&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Product.fromJson(Map&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dynamic&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Product(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;id:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;] ?? 0,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;name:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;description:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'description'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;price:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.tryParse(json[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'price'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]) ?? 0.0,&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// Method to convert a Product instance to JSON&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Map&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dynamic&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;toJson()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt;
      &lt;span style="color: #e6db74;"&gt;'description'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt;
      &lt;span style="color: #e6db74;"&gt;'price'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;};&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; scrollbar-color: var(--gray-600) transparent;"&gt;&lt;span&gt;Step 2: Implementing the CRUD Operations&lt;/span&gt;&lt;/h3&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 0.5rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;We’ll create a&amp;nbsp;&lt;span style="color: #e69138;"&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;ProductService&lt;/code&gt;&amp;nbsp;&lt;/span&gt;class to handle the HTTP requests. Each function will correspond to a CRUD operation.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;// services/product_service.dart&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'dart:convert'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:http/http.dart'&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;http;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'../models/product.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ProductService&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #75715e;"&gt;//static const String apiUrl = 'http://localhost:8000/api/products';&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;apiUrl&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'https://bcssti.com/api-sample/products/'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// GET: Fetch all products&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Future&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;getAllProducts()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;http.&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;get&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(Uri.parse(apiUrl),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;headers:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #e6db74;"&gt;'Cache-Control'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'no-cache'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(response.statusCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;jsonResponse&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json.decode(response.body);&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;jsonResponse.map((data)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Product.fromJson(data)).toList();&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;throw&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Exception(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Failed to load products'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// POST: Add a new product&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Future&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createProduct(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;http.post(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;Uri.parse(apiUrl),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;headers:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'Content-Type'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'application/json'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'Cache-Control'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'no-cache'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json.encode({&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'description'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'price'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price}),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(response.statusCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Product.fromJson(json.decode(response.body));&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;throw&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Exception(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Failed to create product'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// PUT: Update a product by ID&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Future&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;updateProduct(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;http.put(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;Uri.parse(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'$&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;apiUrl?id=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;$&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;id&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;headers:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'Content-Type'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'application/json'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'Cache-Control'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'no-cache'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json.encode({&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'description'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'price'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price}),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(response.statusCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Product.fromJson(json.decode(response.body));&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;throw&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Exception(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Failed to update product'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #75715e;"&gt;// DELETE: Remove a product by ID&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Future&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;deleteProduct(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;http.delete(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;Uri.parse(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'$&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;apiUrl?id=&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;$&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;id&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;headers:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'Cache-Control'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'no-cache'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(response.statusCode&lt;/span&gt; &lt;span style="color: #f92672;"&gt;!=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;throw&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Exception(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Failed to delete product'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;Step 3: Setting Up the UI&lt;/span&gt;&lt;/h3&gt;&lt;p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin: 0px 0px 0.5rem; scrollbar-color: var(--gray-600) transparent;"&gt;&lt;span&gt;In the UI, we’ll add buttons to perform each operation (Fetch, Create, Update, and Delete) and display the products in a list.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;// main.dart&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'models/product.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'services/product_service.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;main()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;runApp(MyApp());&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;MyApp&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MaterialApp(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Product API Client'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;home:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ProductListScreen(),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ProductListScreen&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatefulWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;_ProductListScreenState&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createState()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_ProductListScreenState();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;_ProductListScreenState&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;State&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ProductListScreen&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ProductService&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productService&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ProductService();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[];&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;initState()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;super&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.initState();&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_fetchProducts();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_fetchProducts()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;fetchedProducts&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productService.getAllProducts();&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;setState(()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;fetchedProducts;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_createProduct(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productService.createProduct(name,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_fetchProducts();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_updateProduct(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;String&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productService.updateProduct(id,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_fetchProducts();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_deleteProduct(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productService.deleteProduct(id);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_fetchProducts();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_showDialog(Product&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;bool&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;add)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;nameController&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextEditingController(text:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.name);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;descriptionController&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextEditingController(text:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.description);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;priceController&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextEditingController(text:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.price.toString());&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;showDialog(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;context:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;builder:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;AlertDialog(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Update Product'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;content:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Column(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;mainAxisSize:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MainAxisSize.min,&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;children:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;TextField(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;controller:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;nameController,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;decoration:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;InputDecoration(labelText:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;TextField(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;controller:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;descriptionController,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;decoration:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;InputDecoration(labelText:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Description'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;TextField(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;controller:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;priceController,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;decoration:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;InputDecoration(labelText:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Price'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;keyboardType:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TextInputType.number,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;actions:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;TextButton(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;onPressed:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;Navigator.of(context).pop();&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Cancel'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;TextButton(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;onPressed:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;nameController.text;&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;descriptionController.text;&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;double&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.tryParse(priceController.text)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;??&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.price;&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(add)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;_createProduct(name,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                  &lt;span style="color: #f8f8f2;"&gt;_updateProduct(product.id,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price);&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;Navigator.of(context).pop();&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(add&lt;/span&gt; &lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Add'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Update'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Scaffold(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;appBar:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;AppBar(title:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Products API Client'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ListView.builder(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;itemCount:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products.length,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;itemBuilder:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(context,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;index)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
          &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products[index];&lt;/span&gt;
          &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ListTile(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(product.name),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;subtitle:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(product.price.toStringAsFixed(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;trailing:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;IconButton(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;icon:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Icon(Icons.delete),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;onPressed:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_deleteProduct(product.id),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;onTap:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_showDialog(product,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;floatingActionButton:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;FloatingActionButton(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;child:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;const&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Icon(Icons.add),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;onPressed:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_showDialog(Product(id:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;''&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;''&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;
  
  &lt;h3 style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 1.25em; line-height: 1.6; margin: 1rem 0px 0.5rem; scrollbar-color: var(--gray-600) transparent;"&gt;&lt;span&gt;Explanation of CRUD Functions in Flutter&lt;/span&gt;&lt;/h3&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;1. Fetch Products (&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; font-weight: 500; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span style="color: #e69138;"&gt;getAllProducts&lt;/span&gt;&lt;/code&gt;)&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: The&amp;nbsp;&lt;/span&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;getAllProducts&lt;/code&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;method retrieves all products from the API using a GET request. We parsed the JSON response and updated the&amp;nbsp;&lt;/span&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;products&lt;/code&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;list in the UI.&lt;/span&gt;&lt;br /&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;2. Create Product (&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; font-weight: 500; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span style="color: #e69138;"&gt;createProduct&lt;/span&gt;&lt;/code&gt;)&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: The&amp;nbsp;&lt;/span&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;createProduct&lt;/code&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;method sends a POST request with a JSON body containing product data. Once created, the product list is refreshed.&lt;/span&gt;&lt;br /&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;3. Update Product (&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; font-weight: 500; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span style="color: #e69138;"&gt;updateProduct&lt;/span&gt;&lt;/code&gt;)&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: This method sends a PUT request with updated product details. After successfully updating, the UI is refreshed to show the latest data.&lt;/span&gt;&lt;br /&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-size: 16px; font-weight: 600; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;4. Delete Product (&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; font-weight: 500; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;&lt;span style="color: #e69138;"&gt;deleteProduct&lt;/span&gt;&lt;/code&gt;)&lt;/span&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;: The&amp;nbsp;&lt;/span&gt;&lt;code style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-radius: 0.25rem; border: 0px solid rgb(227, 227, 227); box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, &amp;quot;SF Mono&amp;quot;, Menlo, Consolas, &amp;quot;Liberation Mono&amp;quot;, monospace; font-feature-settings: normal; font-size: 0.875em; font-variation-settings: normal; padding: 0.15rem 0.3rem; scrollbar-color: var(--main-surface-tertiary) transparent;"&gt;deleteProduct&lt;/code&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;&amp;nbsp;method uses a DELETE request to remove a product by ID. The UI is refreshed after deletion.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, Segoe UI, Helvetica, Apple Color Emoji, Arial, sans-serif, Segoe UI Emoji, Segoe UI Symbol"&gt;&lt;h3&gt;Additional Resources&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" rel="noopener" target="_blank"&gt;Server-side REST API tutorial&lt;/a&gt;&amp;nbsp;from our previous article.&lt;/li&gt;&lt;li&gt;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html" rel="noopener" target="_blank"&gt;C# REST API Client&lt;/a&gt;&amp;nbsp;,&amp;nbsp;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-python-with.html" target="_blank"&gt;Python REST API Client&lt;/a&gt;&amp;nbsp; and &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-java-with.html" target="_blank"&gt;Java REST API Client&lt;/a&gt; were built previously, showing another approach for interacting with the API with different language.&lt;/li&gt;&lt;li&gt;A&amp;nbsp;&lt;a href="https://bcssti.com/api-sample/postman/API%20Native%20PHP-Sample.postman_collection.json" rel="noopener" target="_blank"&gt;downloadable Postman collection&lt;/a&gt;&amp;nbsp;for testing the API directly.&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, Segoe UI, Helvetica, Apple Color Emoji, Arial, sans-serif, Segoe UI Emoji, Segoe UI Symbol"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span face="ui-sans-serif, -apple-system, system-ui, &amp;quot;Segoe UI&amp;quot;, Helvetica, &amp;quot;Apple Color Emoji&amp;quot;, Arial, sans-serif, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;" style="font-size: 16px;"&gt;With this setup, you’ve built a simple and complete CRUD-enabled Flutter app that interacts with a REST API. This tutorial provides a solid foundation for handling data in Flutter with an HTTP-based backend&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/1590081162028420361/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-flutter-and.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1590081162028420361" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1590081162028420361" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-flutter-and.html" rel="alternate" title="Building a REST API Client in Flutter and Dart" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJYy0oLQXIILa8O9Y2h5liRaEHytqA2a_qyGle64bdvet5j5cR0m1JyZbyWEeEaTL3wX-sk4TcTAJth0M_szwN70Nv7eg5VVeRSMwiFP6EbOB8rLtv24H46QmtAz6k3iAZpa8VdRiHxbaG_eGm5Oao4_oHrjAHeoXLjILgvWjEKsXkfGf8A-2va0J056aB/s72-w640-h320-c/flutter-api.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-4045415508380049421</id><published>2024-11-13T06:28:00.009+08:00</published><updated>2024-11-14T10:32:05.755+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="PyQt5"/><category scheme="http://www.blogger.com/atom/ns#" term="Python"/><category scheme="http://www.blogger.com/atom/ns#" term="REST API"/><title type="text">Building a REST API Client in Python with PyQt5</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS4G4FmRSWtY3W0pti-Hme-E818BguIMkJFvqe6WUzuyZUqeUACo9MWa3OcZY81fJkuwYuwdgffBkqbj22yw6ipAhNSSbHdHuzlfj7xAabI_ctwYXKLDcb83v567ZR2OIc-TWRroxmu9_0NbcHON9dJd64ja5zcsekYdrST6fzpqXHS9gUrRAqGGnSqAeI/s800/pythion-api.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" data-original-height="400" data-original-width="800" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS4G4FmRSWtY3W0pti-Hme-E818BguIMkJFvqe6WUzuyZUqeUACo9MWa3OcZY81fJkuwYuwdgffBkqbj22yw6ipAhNSSbHdHuzlfj7xAabI_ctwYXKLDcb83v567ZR2OIc-TWRroxmu9_0NbcHON9dJd64ja5zcsekYdrST6fzpqXHS9gUrRAqGGnSqAeI/w640-h320/pythion-api.png" width="640" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In this tutorial, we’ll explore how to build a Python-based GUI client using PyQt5 to interact with a REST API. We’ll cover the complete implementation of basic CRUD operations and explain key considerations for RESTful API interaction, including the use of headers like &lt;code&gt;Cache-Control&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;Prerequisites&lt;/h3&gt;&lt;p&gt;Before diving into the PyQt5 client, you’ll want to ensure you’ve followed the setup in the &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" rel="noopener" target="_blank"&gt;previous article on building a REST API with native PHP&lt;/a&gt; (link to prior blog), where we set up endpoints to handle product and category data. Additionally, we created a C# client for the same API, which you can review &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html" rel="noopener" target="_blank"&gt;here&lt;/a&gt;&amp;nbsp;from the previous article&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html" target="_blank"&gt; Building a REST API Client in C# with Windows Form&lt;/a&gt; to gain insights into other approaches for interacting with REST APIs.&lt;/p&gt;&lt;h3&gt;Overview of the Project&lt;/h3&gt;&lt;p&gt;This client will allow us to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Retrieve and display product lists from the server&lt;/li&gt;&lt;li&gt;Add new products&lt;/li&gt;&lt;li&gt;Update existing product information&lt;/li&gt;&lt;li&gt;Delete products&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Our PyQt5 client will communicate with our REST API server using Python’s &lt;code&gt;requests&lt;/code&gt; library, and it will leverage Qt widgets for user interface components.&lt;/p&gt;&lt;h3&gt;Setting Up the API Client&lt;/h3&gt;&lt;h4&gt;Step 1: Install Dependencies&lt;/h4&gt;&lt;p&gt;If you haven’t already, install &lt;b&gt;&lt;a href="https://pypi.org/project/PyQt5/" target="_blank"&gt;PyQt5 &lt;/a&gt;&lt;/b&gt;and the &lt;b&gt;&lt;a href="https://pypi.org/project/requests/" target="_blank"&gt;&lt;code&gt;requests&lt;/code&gt; &lt;/a&gt;&lt;/b&gt;library:&lt;/p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;pip&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;install&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;PyQt5&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;Step 2: Code for the PyQt5 API Client&lt;/h4&gt;&lt;p&gt;Below is a simplified structure for the PyQt5 client. Here’s how it’s set up:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Retrieve Products&lt;/strong&gt;: Get a list of all products from the API.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Create Product&lt;/strong&gt;: Add a new product.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Update Product&lt;/strong&gt;: Modify an existing product.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Delete Product&lt;/strong&gt;: Remove a product from the list.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Complete Source Code Implementation&lt;/h3&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;sys&lt;/span&gt;

&lt;span style="color: #f92672;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;from&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;PyQt5.QtWidgets&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QApplication,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QWidget,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QVBoxLayout,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QPushButton,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QLineEdit,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QMessageBox,&lt;/span&gt; \
    &lt;span style="color: #f8f8f2;"&gt;QFormLayout,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidget,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidgetItem,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QHeaderView&lt;/span&gt;

&lt;span style="color: #75715e;"&gt;# API_BASE_URL = 'http://localhost:5000'  # Replace with your API URL&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;API_BASE_URL&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'https://bcssti.com/api-sample'&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;HEADERS&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #e6db74;"&gt;'Cache-Control'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'no-cache'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #e6db74;"&gt;'Content-type'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'application/json'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #e6db74;"&gt;'User-Agent'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;


&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ApiClientApp&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(QWidget):&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;__init__&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;super()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;__init__()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setWindowTitle(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Product API Client"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setGeometry(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;600&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;400&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QVBoxLayout()&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;# Form layout for input fields&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;formLayout&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QFormLayout()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productIdInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QLineEdit()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productNameInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QLineEdit()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;descriptionInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QLineEdit()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productPriceInput&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QLineEdit()&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;formLayout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addRow(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"ID:"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productIdInput)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;formLayout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addRow(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Name:"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productNameInput)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;formLayout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addRow(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Description:"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;descriptionInput)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;formLayout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addRow(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Price:"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productPriceInput)&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addLayout(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;formLayout)&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;# Buttons&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;getAllButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QPushButton(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Get All Products"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;getButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QPushButton(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Get Product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;createButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QPushButton(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Create Product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;updateButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QPushButton(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Update Product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;deleteButton&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QPushButton(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Delete Product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addWidget(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;getAllButton)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addWidget(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;getButton)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addWidget(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;createButton)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addWidget(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;updateButton)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addWidget(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;deleteButton)&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;# Table to display products&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidget()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setColumnCount(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;3&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setHorizontalHeaderLabels([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"ID"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;])&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;horizontalHeader()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setSectionResizeMode(QHeaderView&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Stretch)&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;addWidget(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable)&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;# Connect buttons to functions&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;getAllButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;clicked&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;connect(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get_all_products)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;getButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;clicked&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;connect(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get_product)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;createButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;clicked&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;connect(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;create_product)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;updateButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;clicked&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;connect(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;update_product)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;deleteButton&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;clicked&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;connect(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;delete_product)&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setLayout(self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;layout)&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;get_all_products&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #75715e;"&gt;# try:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{API_BASE_URL}/products/"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;headers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HEADERS)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;raise_for_status()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;json()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;show_products_in_table(products)&lt;/span&gt;
        &lt;span style="color: #75715e;"&gt;# except requests.exceptions.RequestException as e:&lt;/span&gt;
        &lt;span style="color: #75715e;"&gt;#    QMessageBox.critical(self, "Error", f"Failed to fetch products: {e}")&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;get_product&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;product_id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productIdInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product_id:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;warning(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Warning"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Please enter a Product ID."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{API_BASE_URL}/products?id={product_id}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;headers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HEADERS)&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;raise_for_status()&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;json()&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productNameInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setText(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;descriptionInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setText(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productPriceInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setText(str(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)))&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;show_products_in_table([product])&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;except&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;exceptions&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;RequestException&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;critical(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Failed to fetch product: {e}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;create_product&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self):&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productNameInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;descriptionInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productPriceInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;or&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;warning(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Warning"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Please enter product name and price."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;float(price)}&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;post(f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{API_BASE_URL}/products"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;data,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;headers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HEADERS)&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;raise_for_status()&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;status_code&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;information(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Success"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;json()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product created"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get_all_products()&lt;/span&gt;  &lt;span style="color: #75715e;"&gt;# Refresh after update&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;warning(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Warning"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to add new  product."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get_all_products()&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;except&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;exceptions&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;RequestException&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;critical(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Failed to create product: {e}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;


&lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;update_product&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self):&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;product_id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productIdInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productNameInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;descriptionInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productPriceInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product_id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;or&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;or&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;price:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;warning(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Warning"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Please enter Product ID, name, and price."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;name,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;description,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;float(price)}&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;put(f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{API_BASE_URL}/products?id={product_id}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;data,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;headers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HEADERS)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;raise_for_status()&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;status_code&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;information(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Success"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;json()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product updated"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get_all_products()&lt;/span&gt;  &lt;span style="color: #75715e;"&gt;# Refresh after update&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;warning(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Warning"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to update product."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;except&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;exceptions&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;RequestException&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;critical(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Failed to update product: {e}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;


&lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;delete_product&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self):&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;product_id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productIdInput&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;text()&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f92672;"&gt;not&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product_id:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;warning(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Warning"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Please enter a Product ID."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;delete(f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{API_BASE_URL}/products?id={product_id}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;headers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;=&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;HEADERS)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;raise_for_status()&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;information(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Success"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;json()&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product deleted"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get_all_products()&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;except&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;requests&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;exceptions&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;RequestException&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;as&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;e:&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;QMessageBox&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;critical(self,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Error"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;f&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Failed to delete product: {e}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;


&lt;span style="color: #66d9ef;"&gt;def&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;show_products_in_table&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(self,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products):&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setRowCount(len(products))&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;for&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;row,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f92672;"&gt;in&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;enumerate(products):&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setItem(row,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidgetItem(str(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"id"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))))&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setItem(row,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidgetItem(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)))&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setItem(row,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidgetItem(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)))&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;self&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;productTable&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;setItem(row,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;3&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QTableWidgetItem(str(product&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;get(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;""&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;))))&lt;/span&gt;


&lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;__name__&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"__main__"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;app&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;QApplication(sys&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;argv)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;window&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ApiClientApp()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;window&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;show()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;sys&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;exit(app&lt;/span&gt;&lt;span style="color: #f92672;"&gt;.&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;exec_())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Key Points&lt;/h3&gt;&lt;h4&gt;1. &lt;strong&gt;Adding Headers&lt;/strong&gt;&lt;/h4&gt;&lt;div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; text-align: left; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;headers&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'Cache-Control'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'no-cache'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;The &lt;code&gt;&lt;span style="color: #e69138;"&gt;Cache-Control: no-cache&lt;/span&gt;&lt;/code&gt; header is important in REST API requests when working with frequently updated data, like our product data. It ensures that each request retrieves the latest data from the server rather than using potentially outdated cached responses.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;2. &lt;strong&gt;Error Handling and Input Validation&lt;/strong&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Input Validation&lt;/strong&gt;: We check if the name and price fields are populated before sending a request. This avoids sending incomplete data and improves user experience.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;: Wrapping the network request in a &lt;code&gt;&lt;span style="color: #e69138;"&gt;try-except&lt;/span&gt;&lt;/code&gt; block allows us to catch exceptions if the server is unreachable or if there’s an unexpected error.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;3. &lt;strong&gt;Why Use &lt;code&gt;&lt;span style="color: #e69138;"&gt;Cache-Control: no-cache&lt;/span&gt;&lt;/code&gt;?&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;In scenarios where data consistency is critical&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;—such as product listings that might change frequently—it’s essential to ensure we aren’t accidentally viewing stale data. &lt;code&gt;Cache-Control: no-cache&lt;/code&gt; instructs the client to validate data with the server always, ensuring that any changes on the server are immediately reflected in the client application.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Next Steps&lt;/h3&gt;&lt;p&gt;Now that we’ve created the Python client, you can further expand it by:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Adding new API endpoints for handling &lt;strong&gt;categories&lt;/strong&gt; or additional product attributes.&lt;/li&gt;&lt;li&gt;Implementing a &lt;strong&gt;refresh button&lt;/strong&gt; to update the list of products without restarting the application.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;You can also experiment with the downloadable &lt;a href="https://bcssti.com/api-sample/postman/API%20Native%20PHP-Sample.postman_collection.json" rel="noopener" target="_blank"&gt;POSTMAN collection&lt;/a&gt; from the previous articles, which provides a hands-on way to test API interactions.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/4045415508380049421/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-python-with.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/4045415508380049421" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/4045415508380049421" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-rest-api-client-in-python-with.html" rel="alternate" title="Building a REST API Client in Python with PyQt5" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS4G4FmRSWtY3W0pti-Hme-E818BguIMkJFvqe6WUzuyZUqeUACo9MWa3OcZY81fJkuwYuwdgffBkqbj22yw6ipAhNSSbHdHuzlfj7xAabI_ctwYXKLDcb83v567ZR2OIc-TWRroxmu9_0NbcHON9dJd64ja5zcsekYdrST6fzpqXHS9gUrRAqGGnSqAeI/s72-w640-h320-c/pythion-api.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-677401063732512179</id><published>2024-11-10T18:30:00.012+08:00</published><updated>2024-11-13T06:56:13.827+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSharp"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="REST API"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Form"/><title type="text">Building a REST API Client in C# with Windows Form</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitk93rJ3LAOSmwnv4d1wvQKuVFbO6GkDpM3Lum3Uu3-hIhbI4U1wQDMhEHplurimTHJRUqWbU6xYxMEXO9H1arx8OWhx-0Ln6f7lYXeqy0s4GnPxJFBS7lUSiDukjG5lbq7l_Qq-cbYPFAvrgcCRk6sOhJVQzf0n_tEnltW-2ZYHweYXPTv5bjxzENVsx-/s800/client-api.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="400" data-original-width="800" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitk93rJ3LAOSmwnv4d1wvQKuVFbO6GkDpM3Lum3Uu3-hIhbI4U1wQDMhEHplurimTHJRUqWbU6xYxMEXO9H1arx8OWhx-0Ln6f7lYXeqy0s4GnPxJFBS7lUSiDukjG5lbq7l_Qq-cbYPFAvrgcCRk6sOhJVQzf0n_tEnltW-2ZYHweYXPTv5bjxzENVsx-/w640-h320/client-api.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;span style="text-align: left;"&gt;In this tutorial, we'll build a simple C# Windows Forms application that connects to a REST API. Our goal is to interact with the &lt;/span&gt;&lt;code style="text-align: left;"&gt;products&lt;/code&gt;&lt;span style="text-align: left;"&gt; API endpoints we created earlier, using HTTP requests to view, add, update, and delete product records. This tutorial is beginner-friendly and demonstrates how to use &lt;/span&gt;&lt;code style="text-align: left;"&gt;&lt;span style="color: #e69138;"&gt;HttpClient&lt;/span&gt;&lt;/code&gt;&lt;span style="text-align: left;"&gt; in C# to communicate with RESTful services. Before diving into this tutorial, it's essential to complete our&amp;nbsp;&lt;/span&gt;&lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" style="text-align: left;" target="_blank"&gt;previous&amp;nbsp;tutorial&amp;nbsp;on&amp;nbsp;creating&amp;nbsp;a&amp;nbsp;REST&amp;nbsp;API&amp;nbsp;using&amp;nbsp;native&amp;nbsp;PHP&amp;nbsp;&lt;/a&gt;&lt;span style="text-align: left;"&gt;as a server-side foundation. In that guide, we built a simple REST API to manage products and categories, covering basic API endpoints like creating, updating, deleting, and retrieving product records.&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;Prerequisites&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;A basic understanding of C# and Windows Forms.&lt;/li&gt;&lt;li&gt;Visual Studio installed on your machine.&lt;/li&gt;&lt;li&gt;The REST API from the &lt;a href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" target="_blank"&gt;previous tutorial&lt;/a&gt; (running locally or on a server).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Project Setup&lt;/h3&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Create a new Windows Forms App&lt;/strong&gt; in Visual Studio. Open Visual Studio, select &lt;strong&gt;Create a new project&lt;/strong&gt;, and choose &lt;strong&gt;Windows Forms App (.NET Framework)&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;div&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Set up UI elements&lt;/strong&gt;. Design the form with input fields for &lt;code&gt;&lt;span style="color: #e69138;"&gt;ID&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;Name&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;Description&lt;/span&gt;&lt;/code&gt;, and &lt;code&gt;&lt;span style="color: #e69138;"&gt;Price&lt;/span&gt;&lt;/code&gt;, as well as buttons for &lt;b&gt;CRUD&lt;/b&gt; operations (&lt;i&gt;Get, Create, Update, Delete&lt;/i&gt;). Here’s a sample layout:&lt;br /&gt;&lt;ol&gt;&lt;ul&gt;&lt;li&gt;TextBox for &lt;code&gt;&lt;span style="color: #e69138;"&gt;ID&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;TextBox for &lt;code&gt;&lt;span style="color: #e69138;"&gt;Name&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;TextBox for &lt;code&gt;&lt;span style="color: #e69138;"&gt;Description&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;TextBox for &lt;code&gt;&lt;span style="color: #e69138;"&gt;Price&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Buttons labeled &lt;code&gt;&lt;span style="color: #e69138;"&gt;Get&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;Create&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;Update&lt;/span&gt;&lt;/code&gt;, and &lt;code&gt;&lt;span style="color: #e69138;"&gt;Delete&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;ListBox or DataGridView to display product data&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt; 3.&amp;nbsp;&lt;/b&gt;&lt;b&gt;In your project, create a&lt;/b&gt; &lt;span style="color: #e69138;"&gt;&lt;code&gt;Product&lt;/code&gt; &lt;/span&gt;&lt;b&gt;class &lt;/b&gt;to hold the product data. This class will be used to serialize and deserialize JSON.&lt;br /&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; text-align: left; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Product&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Id&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;get&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;set&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Name&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;get&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;set&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Description&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;get&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;set&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;decimal&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Price&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;get&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;set&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4.&amp;nbsp;&lt;/span&gt;Create a&amp;nbsp;&lt;/strong&gt;&lt;code style="color: #e69138;"&gt;ApiResponse&lt;/code&gt;&lt;span style="color: #e69138;"&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;Class&lt;/strong&gt; to represent the JSON response structure. This class will be used on message handling of some responses.&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ApiResponse&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Message&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;get&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;set&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Adding Code for API Calls&lt;/h3&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Add&amp;nbsp;necessary using statements&lt;/strong&gt; at the top of your code:&lt;div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Net.Http;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Net.Http.Headers;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Text;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Windows.Forms;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Newtonsoft.Json;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Collections.Generic;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Note: You’ll need to install &lt;code&gt;&lt;span style="color: #e69138;"&gt;Newtonsoft.Json&lt;/span&gt;&lt;/code&gt; from NuGet to handle JSON serialization and deserialization.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Initialize HttpClient&lt;/strong&gt;. We’ll set up &lt;code&gt;&lt;span style="color: #e69138;"&gt;HttpClient&lt;/span&gt;&lt;/code&gt; as a static client to make HTTP requests to the API.&lt;/div&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;readonly&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HttpClient&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;HttpClient();&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Define the API URL&lt;/strong&gt; (change &lt;code&gt;localhost&lt;/code&gt; to your API’s address if it’s running on a server).&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;readonly&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;apiUrl&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"http://localhost/api/products"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;//private readonly string apiUrl = "https://bcssti.com/api-sample/products/";&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Implementing CRUD Operations&lt;/h3&gt;&lt;h4&gt;1. Get Products (GET)&lt;/h4&gt;&lt;p&gt;This method fetches the list of all products from the API and displays them in a ListView or DataGridView.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;async&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GetProducts&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client.GetAsync(apiUrl);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response.EnsureSuccessStatusCode();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseBody&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response.Content.ReadAsStringAsync();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.DeserializeObject&amp;lt;List&amp;lt;Product&amp;gt;&amp;gt;(responseBody);&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Display the products in a ListView or DataGridView&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;productListBox.DataSource&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products;&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;productListBox.DisplayMember&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Display name or other relevant info&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ex)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Error: {ex.Message}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;2. Get Product by ID (GET)&lt;/h4&gt;&lt;p&gt;This method retrieves a single product based on its ID.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;async&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GetProductById&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client.GetAsync(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{apiUrl}?id={id}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response.EnsureSuccessStatusCode();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseBody&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response.Content.ReadAsStringAsync();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.DeserializeObject&amp;lt;Product&amp;gt;(responseBody);&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Populate fields with product data&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;txtName.Text&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.Name;&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;txtDescription.Text&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.Description;&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;txtPrice.Text&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product.Price.ToString();&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ex)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Error: {ex.Message}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;3. Create Product (POST)&lt;/h4&gt;&lt;p&gt;This method sends a new product to the API.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;async&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;CreateProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;dynamic&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; 
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;txtName.Text,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;txtDescription.Text,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;decimal&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.Parse(txtPrice.Text)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;};&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.SerializeObject(product);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;content&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StringContent(json,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Encoding.UTF8,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client.PostAsync(apiUrl,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;content);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response.EnsureSuccessStatusCode();&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseBody&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response.Content.ReadAsStringAsync();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;apiResponse&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.DeserializeObject&amp;lt;ApiResponse&amp;gt;(responseBody);&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Display the message from the API response&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(apiResponse.Message&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;??&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product created successfully"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ex)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Error: {ex.Message}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;4. Update Product (PUT)&lt;/h4&gt;&lt;p&gt;This method updates an existing product.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;async&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;UpdateProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;dynamic&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;product&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; 
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;txtName.Text,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;txtDescription.Text,&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;decimal&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.Parse(txtPrice.Text)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;};&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.SerializeObject(product);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;content&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StringContent(json,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Encoding.UTF8,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"application/json"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client.PutAsync(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{apiUrl}?id={id}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;content);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response.EnsureSuccessStatusCode();&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseBody&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response.Content.ReadAsStringAsync();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;apiResponse&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.DeserializeObject&amp;lt;ApiResponse&amp;gt;(responseBody);&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Display the message from the API response&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(apiResponse.Message&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;??&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product updated successfully"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ex)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Error: {ex.Message}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;5. Delete Product (DELETE)&lt;/h4&gt;&lt;p&gt;This method deletes a product by ID.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;async&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;DeleteProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;id)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client.DeleteAsync(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"{apiUrl}?id={id}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;response.EnsureSuccessStatusCode();&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;responseBody&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;response.Content.ReadAsStringAsync();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;var&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;apiResponse&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;JsonConvert.DeserializeObject&amp;lt;ApiResponse&amp;gt;(responseBody);&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Display the message from the API response&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(apiResponse.Message&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;??&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product deleted successfully"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(Exception&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ex)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MessageBox.Show(&lt;/span&gt;&lt;span style="background-color: #1e0010; color: #960050;"&gt;$&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Error: {ex.Message}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Testing the Application&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Run the Windows Forms App&lt;/strong&gt; in Visual Studio.&lt;/li&gt;&lt;li&gt;Use the &lt;strong&gt;Get&lt;/strong&gt; button to list all products or retrieve a specific product by ID.&lt;/li&gt;&lt;li&gt;Use the &lt;strong&gt;Create&lt;/strong&gt;, &lt;strong&gt;Update&lt;/strong&gt;, and &lt;strong&gt;Delete&lt;/strong&gt; buttons to interact with the API.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This setup provides a basic client interface for the products API. You can expand this application to manage other objects or add additional features like input validation and error handling.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Final Thoughts&lt;/h3&gt;&lt;p&gt;Creating a client for your API in C# Windows Forms is a fantastic way to learn about HTTP communication and RESTful APIs. By using &lt;span style="color: #e69138;"&gt;&lt;code&gt;HttpClient&lt;/code&gt; &lt;/span&gt;and JSON serialization with &lt;code&gt;&lt;span style="color: #e69138;"&gt;Newtonsoft.Json&lt;/span&gt;&lt;/code&gt;, you can quickly set up a functional application to interact with any RESTful service.&lt;/p&gt;&lt;p&gt;This example demonstrates only the basics, but you can extend the client with additional features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pagination and Filtering&lt;/strong&gt;: If your API supports it, implement controls for navigating through pages of data.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Advanced Error Handling&lt;/strong&gt;: Customize error messages for various HTTP status codes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;UI Improvements&lt;/strong&gt;: Use DataGridView for more complex data display and editing.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Experiment with these concepts to build a full-featured client for your REST API.&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/677401063732512179/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/677401063732512179" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/677401063732512179" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/creating-c-windows-forms-client-for.html" rel="alternate" title="Building a REST API Client in C# with Windows Form" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitk93rJ3LAOSmwnv4d1wvQKuVFbO6GkDpM3Lum3Uu3-hIhbI4U1wQDMhEHplurimTHJRUqWbU6xYxMEXO9H1arx8OWhx-0Ln6f7lYXeqy0s4GnPxJFBS7lUSiDukjG5lbq7l_Qq-cbYPFAvrgcCRk6sOhJVQzf0n_tEnltW-2ZYHweYXPTv5bjxzENVsx-/s72-w640-h320-c/client-api.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-998640993667840596</id><published>2024-11-09T20:14:00.019+08:00</published><updated>2024-12-12T21:07:08.144+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSharp"/><category scheme="http://www.blogger.com/atom/ns#" term="Gist"/><title type="text">Calling OS Button Functions in C#: Log Off, Shut Down, and Restart</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrl8_pMyMblqMrY2B8RKPaxjb77Kk9hZYQZBeSPDHWgK4de-BfmyQjBQMBRUvRN8mvM_OplZ9ndK2rH9fqwYeuXCDTRR7oJ_O5zdV1nUBAUyFURL8js4W38SNnRYBHb6vUF0mAD5h4PGlVVwfwfoYegfytGpQVlF4WBwuJclquvo5xhbXPtRISBzosDv8/s1680/Shutdown-reboot-and-logout-buttons.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="840" data-original-width="1680" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrl8_pMyMblqMrY2B8RKPaxjb77Kk9hZYQZBeSPDHWgK4de-BfmyQjBQMBRUvRN8mvM_OplZ9ndK2rH9fqwYeuXCDTRR7oJ_O5zdV1nUBAUyFURL8js4W38SNnRYBHb6vUF0mAD5h4PGlVVwfwfoYegfytGpQVlF4WBwuJclquvo5xhbXPtRISBzosDv8/w640-h320/Shutdown-reboot-and-logout-buttons.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When working on applications that require direct interaction with the operating system, such as shutting down, logging off, or restarting the system, you can leverage the &lt;span style="color: #e69138;"&gt;&lt;code&gt;ExitWindowsEx&lt;/code&gt; &lt;/span&gt;function from the Windows API. This blog post will demonstrate how to use this functionality in C# with a simple implementation.&lt;p&gt;&lt;/p&gt;&lt;p&gt;The &lt;span style="color: #e69138;"&gt;&lt;code&gt;ExitWindowsEx&lt;/code&gt; &lt;/span&gt;function allows you to &lt;b&gt;log off, shut down&lt;/b&gt;, or &lt;b&gt;restart &lt;/b&gt;the system. This function is part of the &lt;code&gt;&lt;span style="color: #e69138;"&gt;user32.dll&lt;/span&gt;&lt;/code&gt; library, which can be accessed in C# using the &lt;span style="color: #e69138;"&gt;&lt;code&gt;DllImport&lt;/code&gt; &lt;/span&gt;attribute from the &lt;code&gt;&lt;span style="color: #e69138;"&gt;System.Runtime.InteropServices&lt;/span&gt;&lt;/code&gt; namespace.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Before implementing the solution, make sure you include the following namespaces:&lt;/p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Runtime.InteropServices;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Diagnostics;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;The Code Implementation&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Here’s a simple example of how you can define and use the &lt;span style="color: #e69138;"&gt;&lt;code&gt;ExitWindowsEx&lt;/code&gt; &lt;/span&gt;function:&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Step 1: Import the Windows API Function&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Add the following declaration in your C# class to access the &lt;span style="color: #e69138;"&gt;&lt;code&gt;ExitWindowsEx&lt;/code&gt; &lt;/span&gt;function:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #a6e22e;"&gt;[DllImport("user32.dll")]&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ExitWindowsEx&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;operationFlag,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;operationReason);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h4&gt;&lt;strong&gt;Step 2: Call OS Button Functions&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;You can call this function with different parameters depending on the action you want to perform:&lt;/p&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Log Off the System&lt;/strong&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;ExitWindowsEx(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Shut Down the System&lt;/b&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;ExitWindowsEx(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;3.&amp;nbsp;&lt;/b&gt;&lt;b&gt;Restart the System&lt;/b&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;ExitWindowsEx(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;Full Code Example&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Below is the full implementation:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Runtime.InteropServices;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Program&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #75715e;"&gt;// Importing the Windows API function&lt;/span&gt;
&lt;span style="color: #a6e22e;"&gt;    [DllImport("user32.dll")]&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extern&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ExitWindowsEx&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;operationFlag,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;operationReason);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Main&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;[]&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;args)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Choose an option:"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"1. Log Off"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"2. Shut Down"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"3. Restart"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;choice&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Console.ReadLine();&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;switch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(choice)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"1"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
                &lt;span style="color: #75715e;"&gt;// Log off the system&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;ExitWindowsEx(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"2"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
                &lt;span style="color: #75715e;"&gt;// Shut down the system&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;ExitWindowsEx(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"3"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
                &lt;span style="color: #75715e;"&gt;// Restart the system&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;ExitWindowsEx(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;default&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Invalid choice!"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;/h3&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;operationFlag&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;: Specifies the operation to perform.&lt;/p&gt;&lt;/li&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;0&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;: Log off.&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/code&gt;: Shut down.&lt;/li&gt;&lt;li&gt;&lt;code&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;2&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;: Restart.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;operationReason&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;: Specifies the reason for the operation. Usually set to&lt;b&gt;&lt;span style="color: #e69138;"&gt; &lt;code&gt;0&lt;/code&gt;&lt;/span&gt;&lt;/b&gt; for no specific reason.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The &lt;span style="color: #e69138;"&gt;&lt;b&gt;&lt;code&gt;ExitWindowsEx&lt;/code&gt; &lt;/b&gt;&lt;/span&gt;function interacts directly with the operating system, making it a powerful yet risky tool. Always ensure proper permissions are in place when deploying such functionality.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Things to Note&lt;/strong&gt;&lt;/h3&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;1.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Administrator Privileges&lt;/span&gt;&lt;/strong&gt;: To shut down or restart the system, your application must have administrator privileges. Without them, the function call will fail.&lt;br /&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;2.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Usage in Applications&lt;/span&gt;&lt;/strong&gt;: Use this functionality sparingly and with caution, as it directly impacts the user’s system.&lt;br /&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #e69138;"&gt;3.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #e69138;"&gt;Platform-Specific Code&lt;/span&gt;&lt;/strong&gt;: Since &lt;code&gt;ExitWindowsEx&lt;/code&gt; is a Windows API function, this code is specific to Windows systems and won't work on other operating systems.&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/998640993667840596/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/calling-os-button-functions-in-c-log.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/998640993667840596" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/998640993667840596" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/calling-os-button-functions-in-c-log.html" rel="alternate" title="Calling OS Button Functions in C#: Log Off, Shut Down, and Restart" type="text/html"/><author><name>Mar</name><uri>http://www.blogger.com/profile/13191156366773651504</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//1.bp.blogspot.com/-kTOceCWfl48/Z1riVgNK7uI/AAAAAAAAApY/Hvvyd7vktTsWkQXir5xVPyccjikIc8yGQCK4BGAYYCw/s1600/ACg8ocLO63CIO9zSJgUOxboEI3UczkxXdsoNAnn0Ui_REUghAPfGiuQZ%253Ds83-c-mo" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrl8_pMyMblqMrY2B8RKPaxjb77Kk9hZYQZBeSPDHWgK4de-BfmyQjBQMBRUvRN8mvM_OplZ9ndK2rH9fqwYeuXCDTRR7oJ_O5zdV1nUBAUyFURL8js4W38SNnRYBHb6vUF0mAD5h4PGlVVwfwfoYegfytGpQVlF4WBwuJclquvo5xhbXPtRISBzosDv8/s72-w640-h320-c/Shutdown-reboot-and-logout-buttons.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-3584680713463100470</id><published>2024-11-09T19:58:00.007+08:00</published><updated>2024-12-05T15:05:13.218+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="POSTMAN"/><category scheme="http://www.blogger.com/atom/ns#" term="REST API"/><title type="text">Building a Simple REST API in Native PHP</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZTDTeI32NRmIc086HS092FABeRVOCb1gSA1_w8TgoCjMdPYfjQp0DSZ5VPsns_W8-nac7C0PKBMN1ZTFeZDcQ07NTDNjxK5tFTEPCyffUIbbpaBaxFYtEqUNI-einuhHqmbJ22ZpEm_o3EPhXDHjcUDJmjMx02azItVoqHpzOwjRBNAG2ZRrmM-teUe4N/s1550/5054_080159859PM_1731153719_Postman.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="705" data-original-width="1550" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZTDTeI32NRmIc086HS092FABeRVOCb1gSA1_w8TgoCjMdPYfjQp0DSZ5VPsns_W8-nac7C0PKBMN1ZTFeZDcQ07NTDNjxK5tFTEPCyffUIbbpaBaxFYtEqUNI-einuhHqmbJ22ZpEm_o3EPhXDHjcUDJmjMx02azItVoqHpzOwjRBNAG2ZRrmM-teUe4N/w640-h292/5054_080159859PM_1731153719_Postman.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: normal;"&gt;Creating a REST API in PHP is straightforward, even without frameworks like &lt;/span&gt;&lt;b&gt;Laravel &lt;/b&gt;&lt;span style="font-weight: normal;"&gt;or &lt;/span&gt;&lt;b&gt;Symfony&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;. In this tutorial, we’ll go over the basics of setting up a simple REST API using only native PHP. This is perfect for beginners and small projects that don’t require a complex framework.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;What is a REST API?&lt;/h3&gt;&lt;p&gt;&lt;span style="color: #b45f06;"&gt;REST (Representational State Transfer) APIs&lt;/span&gt; allow applications to communicate over HTTP by sending requests to access or manipulate data. A RESTful API typically includes HTTP methods like &lt;b&gt;GET&lt;/b&gt;, &lt;b&gt;POST, PUT&lt;/b&gt;, and &lt;b&gt;DELETE&lt;/b&gt;, which correspond to &lt;b&gt;CRUD &lt;/b&gt;(&lt;i&gt;Create, Read, Update, Delete&lt;/i&gt;) operations.&lt;/p&gt;&lt;h3&gt;Prerequisites&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;PHP installed on your system.&lt;/li&gt;&lt;li&gt;A basic understanding of PHP and HTTP methods.&lt;/li&gt;&lt;li&gt;A simple database (we’ll use MySQL in this example).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Project Structure&lt;/h3&gt;&lt;p&gt;For this example, our project will have the following structure:&lt;/p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;project-folder/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;api/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;config.php&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;database.php&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;categories.php&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;└──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products.php&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;└──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;index.php&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;├──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;categories/&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;│&lt;/span&gt;   &lt;span style="background-color: #1e0010; color: #960050;"&gt;└──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;index.php&lt;/span&gt;
&lt;span style="background-color: #1e0010; color: #960050;"&gt;└──&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;index.php&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;h3&gt;Note&lt;/h3&gt;&lt;p&gt;&lt;i&gt;&lt;span style="color: #666666;"&gt;For simplicity, this tutorial focuses on a single entity&lt;/span&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;products&lt;/span&gt;&lt;/code&gt;. &lt;span style="color: #666666;"&gt;However, you can apply&lt;/span&gt; &lt;span style="color: #666666;"&gt;similar logic to create additional APIs for other entities, such as&lt;/span&gt; &lt;code&gt;&lt;span style="color: #e69138;"&gt;categories&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #e69138;"&gt;orders&lt;/span&gt;&lt;/code&gt;, &lt;span style="color: #666666;"&gt;or &lt;/span&gt;&lt;code&gt;&lt;span style="color: #e69138;"&gt;customers&lt;/span&gt;&lt;/code&gt;. &lt;span style="color: #666666;"&gt;Once you're comfortable with these basic steps, try expanding this API by adding endpoints for related data or new functionality.&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Step 1: Setting Up the Database&lt;/h3&gt;&lt;p&gt;Create a MySQL database and a table for the example. This example uses a &lt;span style="color: #f6b26b;"&gt;&lt;code&gt;products&lt;/code&gt; &lt;/span&gt;table with some sample fields.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;SQL to create the &lt;span style="color: #e69138;"&gt;&lt;code&gt;products&lt;/code&gt; &lt;/span&gt;table:&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;CREATE&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;DATABASE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;test_api;&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;USE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;test_api;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;CREATE&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;products&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;id&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;INT&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;KEY&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;name&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;VARCHAR(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;100&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;NOT&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;NULL&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;description&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;TEXT,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;price&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DECIMAL(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;NOT&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;NULL&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 2: Database Configuration (&lt;code&gt;config.php&lt;/code&gt;)&lt;/h3&gt;&lt;p&gt;In the &lt;code&gt;api&lt;/code&gt; folder, create a &lt;code&gt;&lt;span style="color: #e69138;"&gt;config.php&lt;/span&gt;&lt;/code&gt; file to store the database connection details.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;// api/config.php&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;define(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'DB_HOST'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'localhost'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;define(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'DB_NAME'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'test_api'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;define(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'DB_USER'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'root'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;define(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'DB_PASS'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;''&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 3: Database Connection Class (&lt;code&gt;database.php&lt;/code&gt;)&lt;/h3&gt;&lt;p&gt;Create a &lt;code&gt;&lt;span style="color: #e69138;"&gt;database.php&lt;/span&gt;&lt;/code&gt; file in the &lt;code&gt;api&lt;/code&gt; folder to handle the database connection.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;// api/database.php&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Database&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$host&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;DB_HOST&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db_name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;DB_NAME&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$username&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;DB_USER&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;private&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$password&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;DB_PASS&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$conn;&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;getConnection&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;try&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;conn&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;PDO&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"mysql:host="&lt;/span&gt; &lt;span style="color: #f92672;"&gt;.&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;host&lt;/span&gt; &lt;span style="color: #f92672;"&gt;.&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;";dbname="&lt;/span&gt; &lt;span style="color: #f92672;"&gt;.&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;db_name&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;username&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;password&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;conn&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;setAttribute&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;PDO&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;ATTR_ERRMODE&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;PDO&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;ERRMODE_EXCEPTION&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;catch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;PDOException&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$exception)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Connection error: "&lt;/span&gt; &lt;span style="color: #f92672;"&gt;.&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$exception&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getMessage&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;conn&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 4: Creating the API Endpoints (&lt;code&gt;products.php&lt;/code&gt;)&lt;/h3&gt;&lt;p&gt;This file will handle the main API logic. It will listen for different HTTP methods and respond accordingly.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;// api/products.php&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;include_once&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'config.php'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;include_once&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'database.php'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #a6e22e;"&gt;header&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Content-Type: application/json; charset=UTF-8"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;$database&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Database&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;$db&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$database&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getConnection&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;$requestMethod&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$_SERVER[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"REQUEST_METHOD"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;];&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;$request&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;explode(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"/"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;trim&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($_SERVER[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"REQUEST_URI"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"/"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;));&lt;/span&gt;

&lt;span style="color: #f8f8f2;"&gt;$resource&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$request[&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]&lt;/span&gt; &lt;span style="color: #f92672;"&gt;??&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($resource&lt;/span&gt; &lt;span style="color: #f92672;"&gt;!==&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'products'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Resource not found."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;exit&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;switch&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($requestMethod)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'GET'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(isset($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;])&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;is_numeric($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #a6e22e;"&gt;getProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #a6e22e;"&gt;getProducts&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'POST'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
        &lt;span style="color: #a6e22e;"&gt;createProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'PUT'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(isset($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;])&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;is_numeric($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #a6e22e;"&gt;updateProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Provide id to updates"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;case&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'DELETE'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(isset($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;])&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;is_numeric($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #a6e22e;"&gt;deleteProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($_GET[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Provide id to updates"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;default&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Method not allowed"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;break&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;getProducts&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;global&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$query&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"SELECT * FROM products"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;prepare&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($query);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;execute&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;();&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$products&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;fetchAll&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;PDO&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;FETCH_ASSOC&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode($products);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;getProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($id)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;global&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$query&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"SELECT * FROM products WHERE id = ?"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;prepare&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($query);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;execute&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([$id]);&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$product&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;fetch&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;PDO&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;FETCH_ASSOC&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($product)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode($product);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product not found"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;createProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;global&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_decode(file_get_contents(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"php://input"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$query&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"INSERT INTO products (name, description, price) VALUES (?, ?, ?)"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;prepare&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($query);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;execute&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'description'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'price'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]]))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product created"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to create product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;updateProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($id)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;global&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_decode(file_get_contents(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"php://input"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$query&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"UPDATE products SET name = ?, description = ?, price = ? WHERE id = ?"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;prepare&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($query);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;execute&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'description'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'price'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$id]))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product updated"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to update product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;deleteProduct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($id)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;global&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$query&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"DELETE FROM products WHERE id = ?"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$stmt&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$db&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;prepare&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($query);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($stmt&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;execute&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([$id]))&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Product deleted"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;else&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;echo&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_encode([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Failed to delete product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;?&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 5: Routing Requests to &lt;code&gt;products.php&lt;/code&gt;&lt;/h3&gt;&lt;p&gt;In the &lt;b&gt;products &lt;/b&gt;folder, create an &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.php&lt;/span&gt;&lt;/code&gt; file to handle incoming requests and redirect them to &lt;code&gt;&lt;span style="color: #e69138;"&gt;products.php&lt;/span&gt;&lt;/code&gt;&amp;nbsp;inside &lt;span style="color: #e69138; font-family: courier;"&gt;&lt;b&gt;api &lt;/b&gt;&lt;/span&gt;folder.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #75715e;"&gt;// index.php&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;require&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'../api/products.php'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 6: Testing the API&lt;/h3&gt;&lt;p&gt;With the API set up, you can test it using a tool like &lt;span style="color: #e69138;"&gt;&lt;strong&gt;Postman&lt;/strong&gt; &lt;/span&gt;or &lt;strong&gt;&lt;span style="color: #e69138;"&gt;cURL&lt;/span&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;h4&gt;Example Requests&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;GET All Products&lt;/strong&gt;: &lt;code&gt;GET &lt;span style="color: #b45f06;"&gt;https://domain-name.com/project-folder/products/&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GET Product by ID&lt;/strong&gt;: &lt;code&gt;GET &lt;span style="color: #b45f06;"&gt;https://domain-name.com/project-folder/products?id=1&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;POST Create Product&lt;/strong&gt;: &lt;code&gt;POST&amp;nbsp;&lt;/code&gt;&lt;span style="color: #b45f06; font-family: monospace;"&gt;https://domain-name.com/project-folder/products/&lt;/span&gt;&amp;nbsp;with JSON body:&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"New Product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"This is a test product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;9.99&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;PUT Update Product&lt;/strong&gt;: &lt;code&gt;PUT&amp;nbsp;&lt;/code&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #b45f06;"&gt;https://domain-name.com/project-folder/products?id=1&lt;/span&gt;&lt;/span&gt;&amp;nbsp;with JSON body&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;"name"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Updated Product"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;"description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"This is an updated description"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f92672;"&gt;"price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;19.99&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;DELETE Product&lt;/strong&gt;: &lt;code&gt;DELETE&amp;nbsp;&lt;/code&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #b45f06;"&gt;https://domain-name.com/project-folder/products?id=1&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Download the Postman Collection&lt;/h3&gt;&lt;p&gt;To make testing even easier, you can download a Postman collection pre-configured with all the API endpoints used in this tutorial. Simply import the collection into Postman and start sending requests.&lt;/p&gt;
  &lt;!--Download Button--&gt;
&lt;a href="https://bcssti.com/api-sample/postman/API%20Native%20PHP-Sample.postman_collection.json" onmouseout="this.style.backgroundColor='#EF5F2D'" onmouseover="this.style.backgroundColor='#333'" style="align-items: center; background-color: #ff6c37; border-radius: 5px; color: white; display: inline-flex; font-family: Arial, sans-serif; font-size: 16px; padding: 10px 15px; text-decoration: none; transition: background-color 0.3s;" target="_blank"&gt;
    &lt;img alt="Postman Logo" src="https://voyager.postman.com/logo/postman-logo-icon-orange.svg" style="height: 20px; margin-right: 8px; width: 20px;" /&gt;
    Download Postman Collection for Products API
&lt;/a&gt;

  
  &lt;p&gt;To import the collection you can check this link on &lt;a href="https://learning.postman.com/docs/getting-started/importing-and-exporting/importing-data/" target="_blank"&gt;How to Import data into Postman&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;In this article, we built a simple REST API using native PHP, which handles CRUD operations for a &lt;code&gt;products&lt;/code&gt; table in MySQL. This approach is ideal for small applications or for developers who want to learn the fundamentals of REST APIs in PHP. With this setup, you can expand the API by adding authentication, validation, and additional resources.&lt;/p&gt;&lt;h4&gt;&lt;span style="font-weight: normal;"&gt;Creating a REST API using native PHP is a great way to understand the basics of web development and data handling. Once you have mastered this, you can enhance your API with other features, such as:&lt;/span&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #cc0000;"&gt;Authentication and Authorization&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #cc0000;"&gt;Error Handling and Validation&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #cc0000;"&gt;Pagination and Sorting&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Experiment with different objects to build a full-fledged backend API for a web or mobile application.&lt;/p&gt;&lt;/div&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/3584680713463100470/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/3584680713463100470" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/3584680713463100470" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/building-simple-rest-api-in-native-php.html" rel="alternate" title="Building a Simple REST API in Native PHP" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZTDTeI32NRmIc086HS092FABeRVOCb1gSA1_w8TgoCjMdPYfjQp0DSZ5VPsns_W8-nac7C0PKBMN1ZTFeZDcQ07NTDNjxK5tFTEPCyffUIbbpaBaxFYtEqUNI-einuhHqmbJ22ZpEm_o3EPhXDHjcUDJmjMx02azItVoqHpzOwjRBNAG2ZRrmM-teUe4N/s72-w640-h292-c/5054_080159859PM_1731153719_Postman.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-8463219275354908974</id><published>2024-11-09T17:29:00.005+08:00</published><updated>2024-11-09T17:50:02.817+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSharp"/><category scheme="http://www.blogger.com/atom/ns#" term="DevExpress"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="XtraReport"/><title type="text">Creating Reports with DevExpress XtraReport from a MySQL Database</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcr_eqI7whHog4bvoL0VtPzCyJdjrGGkuB8C3uLnOXgRl0PFY1MqOp4-rKlSHYIqpmlZfOcWiNGzK1CJBTB5WvxUxNvJ3hy9xlyAmqN479vOVQynSGniJT6Tbjw5LkwJDOhizRSp3v4hIQcrf5S3EGORqpGAsyPdeIwdrkDXU11irV6olIDszEqxdXhMUR/s847/printing-preview-xtrareport0121155.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="654" data-original-width="847" height="494" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcr_eqI7whHog4bvoL0VtPzCyJdjrGGkuB8C3uLnOXgRl0PFY1MqOp4-rKlSHYIqpmlZfOcWiNGzK1CJBTB5WvxUxNvJ3hy9xlyAmqN479vOVQynSGniJT6Tbjw5LkwJDOhizRSp3v4hIQcrf5S3EGORqpGAsyPdeIwdrkDXU11irV6olIDszEqxdXhMUR/w640-h494/printing-preview-xtrareport0121155.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;When working with applications that need to display structured data in a report format, DevExpress XtraReport is a powerful tool. In this tutorial, we’ll walk through creating a simple report from a MySQL database using XtraReport in C#.&lt;/p&gt;&lt;h3&gt;Prerequisites&lt;/h3&gt;&lt;p&gt;To follow along with this tutorial, you’ll need:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;DevExpress&lt;/strong&gt;: Installed in your Visual Studio project (includes XtraReport).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MySQL Database&lt;/strong&gt;: A database with sample data (for example, a &lt;span style="color: #e69138;"&gt;&lt;code&gt;products&lt;/code&gt; &lt;/span&gt;table with columns like &lt;span style="color: #e69138;"&gt;&lt;code&gt;ProductID&lt;/code&gt;, &lt;code&gt;ProductName&lt;/code&gt;, and &lt;code&gt;Price&lt;/code&gt;&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MySQL.Data Connector&lt;/strong&gt;: The MySQL ADO.NET connector to connect C# to the MySQL database.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 1: Set Up the MySQL Database Connection&lt;/h3&gt;&lt;p&gt;First, set up a connection to your MySQL database.&lt;/p&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Install the MySQL.Data NuGet package&lt;/strong&gt; in Visual Studio.&lt;br /&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;Install-Package&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MySql.Data&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp; 2.&amp;nbsp;&lt;/b&gt;&lt;b&gt;Add your connection details (server, database name, user, and password) in your code.&lt;/b&gt;&lt;br /&gt;&lt;p&gt;Here’s an example of how to set up the connection in C#:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MySql.Data.MySqlClient;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Data;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;connectionString&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Server=localhost;Database=your_database;User ID=root;Password=your_password;"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;MySqlConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;connection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MySqlConnection(connectionString);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 2: Retrieve Data from MySQL&lt;/h3&gt;&lt;p&gt;Once the connection is set up, query the database to get data for the report.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DataTable&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GetProductData&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;string&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;query&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"SELECT ProductID, ProductName, Price FROM products"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;DataTable&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dataTable&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DataTable();&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(MySqlConnection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;connection&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MySqlConnection(connectionString))&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MySqlCommand&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;command&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MySqlCommand(query,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;connection);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;connection.Open();&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;MySqlDataAdapter&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;adapter&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MySqlDataAdapter(command);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;adapter.Fill(dataTable);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dataTable;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 3: Create an XtraReport&lt;/h3&gt;&lt;p&gt;Now, create a report in Visual Studio using DevExpress's XtraReport Designer.&lt;/p&gt;&lt;p style="display: inline !important; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Add a new XtraReport&lt;/strong&gt; to your project:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Right-click on your project in Solution Explorer.&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Add &amp;gt; New Item&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Choose &lt;strong&gt;DevExpress Report&lt;/strong&gt; and name it &lt;code&gt;&lt;span style="color: #e69138;"&gt;ProductReport&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="display: inline !important; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Bind the Data&lt;/strong&gt;:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Open &lt;code&gt;&lt;span style="color: #e69138;"&gt;ProductReport.cs&lt;/span&gt;&lt;/code&gt; in the XtraReport Designer.&lt;/li&gt;&lt;li&gt;Go to &lt;strong&gt;Data Source&lt;/strong&gt; and bind the data from &lt;code&gt;&lt;span style="color: #e69138;"&gt;GetProductData()&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p style="display: inline !important; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Design the Report&lt;/strong&gt;:&lt;/p&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Drag a &lt;strong&gt;Detail Band&lt;/strong&gt; onto the design surface.&lt;/li&gt;&lt;li&gt;Add text labels or fields for each column (e.g.,&lt;span style="color: #e69138;"&gt; &lt;code&gt;ProductID&lt;/code&gt;, &lt;code&gt;ProductName&lt;/code&gt;, &lt;code&gt;Price&lt;/code&gt;&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;Drag data fields from the data source onto the Detail Band to display them in the report.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;Here’s an example of the &lt;span style="color: #e69138;"&gt;&lt;code&gt;ProductReport&lt;/code&gt; &lt;/span&gt;code:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DevExpress.XtraReports.UI;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Data;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;partial&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ProductReport&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;XtraReport&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ProductReport&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(DataTable&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dataTable)&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;InitializeComponent();&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.DataSource&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dataTable;&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;this&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.DataMember&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;dataTable.TableName;&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Bind fields to report labels or cells&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;xrLabelProductID.DataBindings.Add(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Text"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"ProductID"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;xrLabelProductName.DataBindings.Add(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Text"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"ProductName"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;xrLabelPrice.DataBindings.Add(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Text"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Price"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step 4: Display the Report&lt;/h3&gt;&lt;p&gt;Now, let’s display the report in your application.&lt;/p&gt;&lt;p&gt;In your form, use the following code to generate the report from the data retrieved from MySQL:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DevExpress.XtraReports.UI;&lt;/span&gt;

&lt;span style="color: #75715e;"&gt;// Inside a form or a method&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;DataTable&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;productData&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;GetProductData();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;ProductReport&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;report&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ProductReport(productData);&lt;/span&gt;

&lt;span style="color: #75715e;"&gt;// Show the report in the XtraReport viewer&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;ReportPrintTool&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;printTool&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ReportPrintTool(report);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;printTool.ShowPreview();&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Running the Application&lt;/h3&gt;&lt;p&gt;Now, run your application. When you execute the code, the &lt;code&gt;ProductReport&lt;/code&gt; will fetch data from the MySQL database and display it in a report format using DevExpress XtraReport.&lt;/p&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;p&gt;In this article, we demonstrated how to create a simple report from MySQL data using DevExpress XtraReport. We:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Set up a MySQL connection.&lt;/li&gt;&lt;li&gt;Queried data from the &lt;code&gt;products&lt;/code&gt; table.&lt;/li&gt;&lt;li&gt;Designed the report using XtraReport Designer.&lt;/li&gt;&lt;li&gt;Displayed the report using the &lt;code&gt;&lt;span style="color: #e69138;"&gt;ReportPrintTool&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Using XtraReport with MySQL enables you to generate flexible and visually appealing reports in your applications quickly. With more advanced customization, you can make your reports even more powerful by adding parameters, grouping, and styling options.&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/8463219275354908974/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/creating-reports-with-devexpress.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/8463219275354908974" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/8463219275354908974" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/creating-reports-with-devexpress.html" rel="alternate" title="Creating Reports with DevExpress XtraReport from a MySQL Database" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcr_eqI7whHog4bvoL0VtPzCyJdjrGGkuB8C3uLnOXgRl0PFY1MqOp4-rKlSHYIqpmlZfOcWiNGzK1CJBTB5WvxUxNvJ3hy9xlyAmqN479vOVQynSGniJT6Tbjw5LkwJDOhizRSp3v4hIQcrf5S3EGORqpGAsyPdeIwdrkDXU11irV6olIDszEqxdXhMUR/s72-w640-h494-c/printing-preview-xtrareport0121155.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-5893326562005001681</id><published>2024-11-09T14:35:00.004+08:00</published><updated>2024-11-09T14:52:11.292+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Errors &amp; Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><category scheme="http://www.blogger.com/atom/ns#" term="Source Tree"/><category scheme="http://www.blogger.com/atom/ns#" term="Troubleshooting"/><title type="text">Troubleshooting "index.lock" Error in SourceTree</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEJdNajrSCN41qoeZCy5WOsSXFtNtsw-zjSOA_H5Eh3_9POiHF1vno9NlpoBm24rxsGujcqBpjANIWNp50vODf1qjkvBUGcI7y67OVeKbdpHQ0nGe5kiqCnNr_2l3zOgLefrHoni2rzJw1YqRCn1mYf2zcG7Z5nW03vXQLYgHBmXp2wmd1h4tzxLQVB7S8/s1021/source-tree-bug.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="753" data-original-width="1021" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEJdNajrSCN41qoeZCy5WOsSXFtNtsw-zjSOA_H5Eh3_9POiHF1vno9NlpoBm24rxsGujcqBpjANIWNp50vODf1qjkvBUGcI7y67OVeKbdpHQ0nGe5kiqCnNr_2l3zOgLefrHoni2rzJw1YqRCn1mYf2zcG7Z5nW03vXQLYgHBmXp2wmd1h4tzxLQVB7S8/w640-h472/source-tree-bug.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;If you work with Git and use SourceTree, you may occasionally run into an error that prevents you from committing changes. This issue often appears with a message similar to:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;"&lt;span style="color: #e69138;"&gt;fatal: Unable to create 'path-to-repo/.git/index.lock': File exists. Another git process seems to be running in this repository...&lt;/span&gt;"&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This article will explain why this happens and provide solutions to resolve it.&lt;/p&gt;&lt;h3&gt;What Causes the &lt;code&gt;index.lock&lt;/code&gt; Error?&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt; file is used by Git to prevent multiple processes from making changes to the same repository simultaneously. This lock file is created when a Git command starts and should be removed automatically when the command completes. However, if a Git process is interrupted (e.g., due to a crash or forced closure), the lock file may be left behind, blocking further operations until it is removed.&lt;/p&gt;&lt;h3&gt;How to Resolve the &lt;code&gt;index.lock&lt;/code&gt; Error in SourceTree&lt;/h3&gt;&lt;h4&gt;Solution 1: Manually Delete the &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt; File&lt;/h4&gt;&lt;p&gt;The most straightforward way to resolve this issue is to delete the &lt;code&gt;index.lock&lt;/code&gt; file manually. Here’s how:&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Locate Your Repository Folder&lt;/strong&gt;: Find the folder where your repository is located. In the example from your screenshot, it’s under &lt;code&gt;&lt;span style="color: #e69138;"&gt;C:/www/poject-name/.git/&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Navigate to the &lt;code&gt;&lt;span style="color: #e69138;"&gt;.git&lt;/span&gt;&lt;/code&gt; Directory&lt;/strong&gt;: Open the &lt;code&gt;&lt;span style="color: #e69138;"&gt;.git&lt;/span&gt;&lt;/code&gt; folder inside your repository. This is where Git stores all internal configuration and metadata for the repo.&lt;div&gt;&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Delete the &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt; File&lt;/strong&gt;: Look for a file named &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt; and delete it. Ensure you only delete this lock file, as other files are essential to your repository.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4.&amp;nbsp;&lt;/span&gt;Retry Your Git Operation&lt;/strong&gt;: Return to SourceTree and try committing again. The error should be resolved.&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Make sure no other Git processes are running before deleting &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt;, as this could cause conflicts.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h4&gt;Solution 2: Restart SourceTree and Check for Background Git Processes&lt;/h4&gt;&lt;p&gt;If deleting the &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt; file doesn’t solve the issue, restart SourceTree and check if there are any Git processes running in the background:&lt;/p&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Close SourceTree&lt;/strong&gt;: Ensure&amp;nbsp;that SourceTree is completely closed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;p style="display: inline; text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2.&amp;nbsp;&lt;/span&gt;Check for Git Processes&lt;/strong&gt;:&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;On &lt;strong&gt;Windows&lt;/strong&gt;, open the Task Manager &lt;span style="color: #e69138;"&gt;(&lt;code&gt;Ctrl + Shift + Esc&lt;/code&gt;)&lt;/span&gt;, look for any processes named &lt;code&gt;&lt;span style="color: #e69138;"&gt;git.exe&lt;/span&gt;&lt;/code&gt;, and end them.&lt;/li&gt;&lt;li&gt;On &lt;strong&gt;Mac/Linux&lt;/strong&gt;, use the terminal command &lt;code&gt;&lt;span style="color: #e69138;"&gt;ps aux | grep git&lt;/span&gt;&lt;/code&gt; to find and terminate any running Git processes.&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Reopen SourceTree&lt;/strong&gt;: After ensuring no background Git processes are running, reopen SourceTree and try committing again.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h4&gt;Solution 3: Use the Command Line to Complete or Cancel Any Incomplete Operations&lt;/h4&gt;&lt;p&gt;Sometimes, Git operations may hang or not complete correctly, especially if SourceTree crashed during a commit or merge. In such cases, running the following command from the command line can help:&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1.&amp;nbsp;&lt;/span&gt;Open Command Prompt (Windows) or Terminal (Mac/Linux)&lt;/strong&gt;.&lt;/p&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2&lt;/span&gt;. Navigate to Your Repository&lt;/strong&gt;:&lt;br /&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;cd&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;path&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;to&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;your&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;repo&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3.&amp;nbsp;&lt;/span&gt;Finish or Cancel the Operation&lt;/strong&gt;: Run &lt;code&gt;&lt;span style="color: #e69138;"&gt;git status&lt;/span&gt;&lt;/code&gt; to check the state of the repository. If there’s an incomplete operation, Git will inform you and may prompt you to complete or abort it.&lt;br /&gt;&lt;strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4.&amp;nbsp;&lt;/span&gt;Clear the Lock&lt;/strong&gt;: If no operation needs completion, you can safely remove the lock file manually using the command:&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;rm&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;f&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;.git&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;index.lock&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;After this, retry the commit in SourceTree.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;How to Avoid the &lt;code&gt;index.lock&lt;/code&gt; Error in the Future&lt;/h3&gt;&lt;p&gt;Here are a few tips to help you avoid encountering this issue:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Allow Git Processes to Complete&lt;/strong&gt;: Avoid interrupting Git commands once they start, as this can create partial changes and leave lock files.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Close SourceTree Properly&lt;/strong&gt;: Avoid force-quitting SourceTree. Let it close all Git operations correctly before exiting.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Avoid Running Multiple Git Tools Simultaneously&lt;/strong&gt;: If you’re working with multiple Git tools (e.g., SourceTree, command-line Git), avoid running commands on the same repository at the same time.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Summary&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;index.lock&lt;/code&gt; error in SourceTree is a common issue that occurs when a Git process is interrupted or doesn’t complete as expected. By following these solutions, you should be able to resolve the error quickly and continue working without issues.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Solution 1&lt;/strong&gt;: Delete the &lt;code&gt;&lt;span style="color: #e69138;"&gt;index.lock&lt;/span&gt;&lt;/code&gt; file manually.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Solution 2&lt;/strong&gt;: Restart SourceTree and check for background Git processes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Solution 3&lt;/strong&gt;: Use the command line to finish or cancel incomplete Git operations.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By understanding how Git lock files work and following these troubleshooting steps, you can avoid future disruptions and work smoothly with SourceTree and Git.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/5893326562005001681/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/troubleshooting-indexlock-error-in.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5893326562005001681" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5893326562005001681" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/troubleshooting-indexlock-error-in.html" rel="alternate" title="Troubleshooting &quot;index.lock&quot; Error in SourceTree" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEJdNajrSCN41qoeZCy5WOsSXFtNtsw-zjSOA_H5Eh3_9POiHF1vno9NlpoBm24rxsGujcqBpjANIWNp50vODf1qjkvBUGcI7y67OVeKbdpHQ0nGe5kiqCnNr_2l3zOgLefrHoni2rzJw1YqRCn1mYf2zcG7Z5nW03vXQLYgHBmXp2wmd1h4tzxLQVB7S8/s72-w640-h472-c/source-tree-bug.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-7870452670361394448</id><published>2024-11-07T11:23:00.002+08:00</published><updated>2024-11-07T13:22:06.228+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="SQL"/><title type="text">How to Update Columns of One Table with Data from Another Table in MySQL</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFqxxHxTQ2LIh4X-94H6t1YiTmEASgzvBWhffcufcZbTdzk-XLUGK7Esm1YFskXOP4cyxRNn861aPnpEwQOzRDiWp5n18QJ3P3h8EonDYXxT64usdB99Zmei6xNNDofce7fzWzsRl2839lueSFam6bTq7SJpM-3B0Ebg4231ZjlvYxHkmfotVcatOGw7jp/s4059/mysql-cover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1864" data-original-width="4059" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFqxxHxTQ2LIh4X-94H6t1YiTmEASgzvBWhffcufcZbTdzk-XLUGK7Esm1YFskXOP4cyxRNn861aPnpEwQOzRDiWp5n18QJ3P3h8EonDYXxT64usdB99Zmei6xNNDofce7fzWzsRl2839lueSFam6bTq7SJpM-3B0Ebg4231ZjlvYxHkmfotVcatOGw7jp/w640-h294/mysql-cover.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;In MySQL, there are times when we need to update one table with data that resides in another table. This can be particularly useful for synchronizing information, applying calculated values from a related table, or updating records based on specific criteria. This tutorial walks through different approaches to updating columns in one table with values from another table in MySQL.&lt;p&gt;&lt;/p&gt;&lt;h2&gt;Scenario: Understanding the Use Case&lt;/h2&gt;&lt;p&gt;Suppose we have two tables in a database:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;&lt;span style="color: #3d85c6;"&gt;employees&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;: Contains the details of each employee, such as &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;employee_id&lt;/span&gt;&lt;/code&gt;, &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;name&lt;/span&gt;&lt;/code&gt;, and &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;department_id&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;&lt;span style="color: #3d85c6;"&gt;departments&lt;/span&gt;&lt;/code&gt;&lt;/strong&gt;: Stores information about departments, including &lt;span style="color: #6fa8dc;"&gt;&lt;code&gt;department_id&lt;/code&gt; &lt;/span&gt;and &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;department_name&lt;/span&gt;&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Let’s say we want to update the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;employees&lt;/code&gt; &lt;/span&gt;table to include the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;from the &lt;code&gt;departments&lt;/code&gt; table based on the &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;department_id&lt;/span&gt;&lt;/code&gt;. This approach is common in situations where you need to sync data between related tables or populate fields for reporting purposes.&lt;/p&gt;&lt;h2&gt;Example Table Structures&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;employees&lt;/strong&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;employee_id&lt;/th&gt;&lt;th&gt;name&lt;/th&gt;&lt;th&gt;department_id&lt;/th&gt;&lt;th&gt;department_name&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Alice&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Bob&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Carol&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;departments&lt;/strong&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;department_id&lt;/th&gt;&lt;th&gt;department_name&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;HR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;IT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Marketing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;In this example, we want to update the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;column in the &lt;code&gt;employees&lt;/code&gt; table to match the corresponding name in the &lt;code&gt;departments&lt;/code&gt; table based on &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;department_id&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;Basic Syntax: UPDATE with JOIN&lt;/h2&gt;&lt;p&gt;In MySQL, you can use an &lt;code&gt;UPDATE JOIN&lt;/code&gt; statement to update values in one table with data from another. This approach is efficient and straightforward for joining and updating related tables.&lt;/p&gt;&lt;h3&gt;Basic Syntax for UPDATE JOIN&lt;/h3&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;UPDATE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;table1&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;table2&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;ON&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;table1.common_column&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;table2.common_column&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;SET&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;table1.column_to_update&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;table2.column_with_value&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;conditions&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Step-by-Step Solution&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Identify the Common Key&lt;/strong&gt;: Make sure both tables share a common column (&lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_id&lt;/code&gt; &lt;/span&gt;in this case) to match records.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use UPDATE JOIN&lt;/strong&gt;: Use &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;UPDATE JOIN&lt;/span&gt;&lt;/code&gt; to set the desired column in the target table.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Set the Condition (Optional)&lt;/strong&gt;: Add conditions to limit the records being updated, if necessary.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Implementing the Query&lt;/h3&gt;&lt;p&gt;In our scenario, we want to update the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;employees&lt;/code&gt; &lt;/span&gt;table with the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;from the &lt;code&gt;departments&lt;/code&gt; table:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;UPDATE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;departments&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;ON&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees.department_id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;departments.department_id&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;SET&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees.department_name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;departments.department_name;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;Explanation&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;UPDATE employees&lt;/strong&gt;: Specifies the target table to be updated.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;JOIN departments&lt;/strong&gt;: Joins the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;employees&lt;/code&gt; &lt;/span&gt;table to the &lt;code&gt;departments&lt;/code&gt; table on the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_id&lt;/code&gt; &lt;/span&gt;column.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SET employees.department_name&lt;/strong&gt;: Sets the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;column in the &lt;code&gt;employees&lt;/code&gt; table to the corresponding value in the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;departments&lt;/code&gt; &lt;/span&gt;table.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Adding Conditions to the Update&lt;/h2&gt;&lt;p&gt;Sometimes, you might want to add conditions to limit which rows get updated. For example, if we only want to update employees who don’t have a &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;assigned yet, we can add a &lt;code&gt;WHERE&lt;/code&gt; clause.&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;UPDATE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;JOIN&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;departments&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;ON&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees.department_id&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;departments.department_id&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;SET&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees.department_name&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;departments.department_name&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;WHERE&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;employees.department_name&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;IS&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;NULL&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;This will only update rows where the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;is currently &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;NULL&lt;/span&gt;&lt;/code&gt;, leaving existing names unchanged.&lt;/p&gt;&lt;h2&gt;Example Execution and Results&lt;/h2&gt;&lt;p&gt;Running the above queries will update the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;employees&lt;/code&gt; &lt;/span&gt;table as follows:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Before Update:&lt;/strong&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;employee_id&lt;/th&gt;&lt;th&gt;name&lt;/th&gt;&lt;th&gt;department_id&lt;/th&gt;&lt;th&gt;department_name&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Alice&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Bob&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Carol&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;NULL&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;After Update:&lt;/strong&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;employee_id&lt;/th&gt;&lt;th&gt;name&lt;/th&gt;&lt;th&gt;department_id&lt;/th&gt;&lt;th&gt;department_name&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Alice&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;IT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Bob&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;HR&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Carol&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Marketing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Now, the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;department_name&lt;/code&gt; &lt;/span&gt;column in &lt;code&gt;employees&lt;/code&gt; has been populated with the values from the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;departments&lt;/code&gt; &lt;/span&gt;table based on each employee's &lt;code&gt;&lt;span style="color: #3d85c6;"&gt;department_id&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;Additional Considerations&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Indexing&lt;/strong&gt;: Ensure that the columns used in the &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;JOIN&lt;/code&gt; &lt;/span&gt;condition are indexed, especially in large tables, to improve performance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Backup&lt;/strong&gt;: Always back up data before running mass &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;UPDATE&lt;/code&gt; &lt;/span&gt;queries, especially if the changes are complex or involve many rows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Testing&lt;/strong&gt;: Try testing queries in smaller datasets or use a &lt;span style="color: #3d85c6;"&gt;&lt;code&gt;SELECT&lt;/code&gt; &lt;/span&gt;statement with the &lt;code&gt;JOIN&lt;/code&gt; first to ensure the data matches the expected result before committing to an update.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Updating one table with data from another table in MySQL can be achieved easily using &lt;code&gt;UPDATE JOIN&lt;/code&gt;. This technique helps synchronize data between related tables and can be customized with conditions to refine the update scope. Understanding how to leverage &lt;code&gt;UPDATE JOIN&lt;/code&gt; with conditions will enhance your ability to manage and update data across relational tables effectively.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/7870452670361394448/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2018/04/mysql-query-updating-columns-of-table.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7870452670361394448" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7870452670361394448" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2018/04/mysql-query-updating-columns-of-table.html" rel="alternate" title="How to Update Columns of One Table with Data from Another Table in MySQL" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFqxxHxTQ2LIh4X-94H6t1YiTmEASgzvBWhffcufcZbTdzk-XLUGK7Esm1YFskXOP4cyxRNn861aPnpEwQOzRDiWp5n18QJ3P3h8EonDYXxT64usdB99Zmei6xNNDofce7fzWzsRl2839lueSFam6bTq7SJpM-3B0Ebg4231ZjlvYxHkmfotVcatOGw7jp/s72-w640-h294-c/mysql-cover.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-4484834822375726710</id><published>2024-11-04T19:55:00.010+08:00</published><updated>2024-11-22T14:46:03.357+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Errors &amp; Solutions"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="POSTMAN"/><category scheme="http://www.blogger.com/atom/ns#" term="Troubleshooting"/><title type="text">Troubleshooting "Personal Access Client Not Found" Error on API Login Requests</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPIoIzEMCxL1NE6InnWrtY3IBtr1IgwN-3hNkIL722kUUjK0ufIFOHTfywRBNIyLgmLvHVernWTewkcQ9farWl6zz6-wj1Yr2rU2L41pHSYrWrjGLUJ4mHPkEHd5EGncmZRBc4sYGETVyLN7JfD7dQ5qdQemyqNUpY-96w8xOmqPvKWlxicN-rEUQiFKRk/s955/bugs.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="563" data-original-width="955" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPIoIzEMCxL1NE6InnWrtY3IBtr1IgwN-3hNkIL722kUUjK0ufIFOHTfywRBNIyLgmLvHVernWTewkcQ9farWl6zz6-wj1Yr2rU2L41pHSYrWrjGLUJ4mHPkEHd5EGncmZRBc4sYGETVyLN7JfD7dQ5qdQemyqNUpY-96w8xOmqPvKWlxicN-rEUQiFKRk/w640-h378/bugs.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;When building or testing API authentication in Postman, you may encounter an error message stating:&lt;/p&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #e6db74;"&gt;"Personal access client not found. Please create one."&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This can be frustrating, especially if you’re unsure how to troubleshoot. This article will guide you through the steps to resolve this error by setting up a personal access client for Laravel Passport authentication.&lt;/p&gt;&lt;hr /&gt;&lt;h3&gt;&lt;strong&gt;Error Details&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;When sending a &lt;code&gt;POST&lt;/code&gt; request to the login API endpoint, you might receive the following error response:&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"success"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"data"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[],&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"message"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Request failed."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"errors"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"Personal access client not found. Please create one."&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"tokenResponseCode"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h3&gt;&lt;strong&gt;Typical Causes of the Error&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;This error is a common issue in Laravel applications that use Passport for API authentication. It indicates that there isn’t a valid personal access client configured, which is necessary for handling password grant tokens.&lt;/p&gt;&lt;h3&gt;&lt;strong&gt;Request Configuration and Endpoint&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Let’s assume you’re using the following details in Postman:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Request Parameter:&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"username"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"{{USERNAME}}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"password"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"{{PASSWORD}}"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
	&lt;span style="color: #f92672;"&gt;"app_id"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"{{APP_ID}}"&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Endpoint URL:&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;{{STAGING_HOST}}&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;api&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;cdis&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;v1&lt;/span&gt;&lt;span style="color: #f92672;"&gt;/&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;login&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If the personal access client is missing, Laravel cannot generate the required access token, resulting in the error.&lt;/p&gt;&lt;hr /&gt;&lt;h3&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h2 style="text-align: left;"&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Solution&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;&lt;p&gt;To resolve this issue, we need to create a personal access client using the Laravel Artisan command.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Step 1: Open the Command Line Interface (CLI) on the Server&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;If you’re working on a local environment, open your terminal. For a production server, access the CLI via SSH.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Step 2: Run the Laravel Passport Install Command&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Run the following command to create a new personal access client and password grant client:&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;php&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;artisan&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;passport:install&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This command will output the client details required for token generation, similar to the following:&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;Personal&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;access&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;created&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;successfully.&lt;/span&gt; 
&lt;span style="color: #f8f8f2;"&gt;Client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ID:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt; 
&lt;span style="color: #f8f8f2;"&gt;Client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;secret:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;hEGVjR9RtB6xHxDJ4wq8K2XQuL8nzA&lt;/span&gt; 

&lt;span style="color: #f8f8f2;"&gt;Password&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;grant&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;created&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;successfully.&lt;/span&gt; 
&lt;span style="color: #f8f8f2;"&gt;Client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ID:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;2&lt;/span&gt; 
&lt;span style="color: #f8f8f2;"&gt;Client&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;secret:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;4&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;xW4PFqqKjWFudjaJGidHJY2XZcQWy&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Take note of the generated Client ID and Client Secret values, as they are essential for configuring your application and API requests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4 style="text-align: left;"&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Step 3: Clear Cache and Config&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;div&gt;&lt;p&gt;To ensure Laravel picks up the new configuration, clear any cached configurations by running the following commands:&lt;/p&gt;&lt;pre class="!overflow-visible"&gt;&lt;div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary dark:bg-gray-950"&gt;&lt;div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between rounded-t-md h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary"&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;php&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;artisan&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;config:cache&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;php&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;artisan&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;config:clear&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;h4 style="text-align: left;"&gt;&lt;strong&gt;&lt;span style="color: #e69138;"&gt;Step 4: Test the API Endpoint&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Return to Postman and try the login request again. If everything is set up correctly, you should receive a successful response with an access token instead of the original error.&lt;/p&gt;&lt;hr /&gt;&lt;h3&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h3&gt;&lt;strong&gt;Additional Troubleshooting&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;If you still encounter issues, consider the following:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #38761d;"&gt;Ensure Passport is Properly Set Up&lt;/span&gt;&lt;/strong&gt;: Confirm that you’ve set up Passport by running the necessary migration (&lt;code&gt;php artisan migrate&lt;/code&gt;) to create the required tables.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="color: #38761d;"&gt;Database Check&lt;/span&gt;&lt;/strong&gt;: Verify that the &lt;span style="color: #e69138;"&gt;&lt;code&gt;oauth_clients&lt;/code&gt; &lt;/span&gt;table includes the newly created clients. If not, rerun the Passport install command.&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h3&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h3&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The "&lt;span style="color: red;"&gt;&lt;b&gt;Personal access client not found&lt;/b&gt;&lt;/span&gt;" error can often catch developers off guard, especially when setting up Laravel Passport for the first time. Following these steps should help you configure the necessary client and get your authentication system up and running.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;By properly setting up a personal access client with Laravel Passport, you can ensure smooth, secure authentication flows for your API.&lt;/p&gt;&lt;/div&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/4484834822375726710/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/troubleshooting-personal-access-client.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/4484834822375726710" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/4484834822375726710" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/troubleshooting-personal-access-client.html" rel="alternate" title="Troubleshooting &quot;Personal Access Client Not Found&quot; Error on API Login Requests" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPIoIzEMCxL1NE6InnWrtY3IBtr1IgwN-3hNkIL722kUUjK0ufIFOHTfywRBNIyLgmLvHVernWTewkcQ9farWl6zz6-wj1Yr2rU2L41pHSYrWrjGLUJ4mHPkEHd5EGncmZRBc4sYGETVyLN7JfD7dQ5qdQemyqNUpY-96w8xOmqPvKWlxicN-rEUQiFKRk/s72-w640-h378-c/bugs.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-5370964385304341653</id><published>2024-11-04T17:48:00.007+08:00</published><updated>2024-11-06T11:26:21.573+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Console"/><category scheme="http://www.blogger.com/atom/ns#" term="CSharp"/><category scheme="http://www.blogger.com/atom/ns#" term="Desktop"/><category scheme="http://www.blogger.com/atom/ns#" term="Gist"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><title type="text">How to Retrieve Machine Chassis Information in C#</title><content type="html">&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYCkmN1w8gnHqi59CFfBzYppVOMUh_L_1IBrJ0Yf4BMKSqr1Hx34owxDKnH2ii4lq9aly0vXatoI0-IdtL31Fpglwzglt0AGYbZybx98enLUFxQGEjma99swxUkNXwWMBYzogjhfVJBXVQvk-2eKQCkopQefh4KZyszCb0j_5kKdw3DMyf2Z2glN4g7ipo/s3827/output-onlinetexttools.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;img border="0" data-original-height="2400" data-original-width="3827" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYCkmN1w8gnHqi59CFfBzYppVOMUh_L_1IBrJ0Yf4BMKSqr1Hx34owxDKnH2ii4lq9aly0vXatoI0-IdtL31Fpglwzglt0AGYbZybx98enLUFxQGEjma99swxUkNXwWMBYzogjhfVJBXVQvk-2eKQCkopQefh4KZyszCb0j_5kKdw3DMyf2Z2glN4g7ipo/s16000/output-onlinetexttools.png" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;When developing Windows applications, you may sometimes need to know what type of chassis (like desktop, laptop, or server) your application is running on. This information can be particularly useful when configuring hardware-specific settings or optimizing application performance for different device types. In this blog post, we’ll explore how to retrieve machine chassis information in C# using Windows Management Instrumentation (WMI).&lt;p&gt;&lt;/p&gt;&lt;p&gt;Let’s walk through a code snippet that identifies the chassis type of the machine your application is running on.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Understanding Chassis Types&lt;/h3&gt;&lt;p&gt;Chassis types refer to the physical configuration of a computer, such as a desktop, laptop, or rack-mounted server. In C#, we can define an enumeration (&lt;code&gt;enum&lt;/code&gt;) to represent these types. Here’s a list of common chassis types:&lt;/p&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;enum&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ChassisTypes&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Other&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Unknown,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Desktop,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;LowProfileDesktop,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;PizzaBox,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;MiniTower,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Tower,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Portable,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Laptop,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Notebook,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;Handheld,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;DockingStation,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;AllInOne,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;SubNotebook,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;SpaceSaving,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;LunchBox,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;MainSystemChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;ExpansionChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;SubChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;BusExpansionChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;PeripheralChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;StorageChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;RackMountChassis,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;SealedCasePC&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;p&gt;Each chassis type is assigned an integer value. This allows us to map numerical identifiers retrieved from the system to specific chassis descriptions.&lt;/p&gt;&lt;h3&gt;Retrieving the Current Chassis Type&lt;/h3&gt;&lt;p&gt;To access the chassis type, we use WMI (Windows Management Instrumentation) to query the &lt;code&gt;Win32_SystemEnclosure&lt;/code&gt; class, which contains information about the computer chassis. The &lt;code&gt;ChassisTypes&lt;/code&gt; property in this class returns an array of integers representing possible chassis types.&lt;/p&gt;&lt;p&gt;Here’s the full code to retrieve the current chassis type:&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;using&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;System.Management;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;ChassisInfo&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ChassisTypes&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;GetCurrentChassisType&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;ManagementClass&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;systemEnclosures&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ManagementClass(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Win32_SystemEnclosure"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
        
        &lt;span style="color: #66d9ef;"&gt;foreach&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(ManagementObject&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;obj&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;in&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;systemEnclosures.GetInstances())&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #66d9ef;"&gt;foreach&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;int&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;i&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;in&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(UInt16[])(obj[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"ChassisTypes"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]))&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(i&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;0&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;i&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;25&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(ChassisTypes)i;&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ChassisTypes.Unknown;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Let’s break down the code step-by-step:&lt;/p&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;ManagementClass Initialization&lt;/strong&gt;: We start by initializing a &lt;span style="color: #2b00fe;"&gt;&lt;code&gt;ManagementClass&lt;/code&gt; &lt;/span&gt;object for the &lt;span style="color: #2b00fe;"&gt;&lt;code&gt;Win32_SystemEnclosure&lt;/code&gt; &lt;/span&gt;WMI class.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Query Instances&lt;/strong&gt;: We retrieve all instances of &lt;code&gt;&lt;span style="color: #2b00fe;"&gt;Win32_SystemEnclosure&lt;/span&gt;&lt;/code&gt;. Although there’s typically only one instance per machine, this approach handles multiple instances if necessary.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Retrieve Chassis Types&lt;/strong&gt;: For each instance, we read the &lt;span style="color: #2b00fe;"&gt;&lt;code&gt;ChassisTypes&lt;/code&gt; &lt;/span&gt;property, which is an array of integers (of type &lt;code&gt;&lt;span style="color: #2b00fe;"&gt;UInt16[]&lt;/span&gt;&lt;/code&gt;). Each integer corresponds to a chassis type.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Map Integer to Enum&lt;/strong&gt;: We check if the integer is within the range of defined values in our &lt;span style="color: #2b00fe;"&gt;&lt;code&gt;ChassisTypes&lt;/code&gt; &lt;/span&gt;enum (1 to 24). If valid, we cast the integer to a &lt;span style="color: #2b00fe;"&gt;&lt;code&gt;ChassisTypes&lt;/code&gt; &lt;/span&gt;value and return it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Default to Unknown&lt;/strong&gt;: If no valid chassis type is found, we return &lt;code&gt;&lt;span style="color: #2b00fe;"&gt;ChassisTypes&lt;/span&gt;.Unknown&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Example Usage&lt;/h3&gt;&lt;p&gt;To get the chassis type and display it in your application, call &lt;code&gt;GetCurrentChassisType()&lt;/code&gt; like so:&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Program&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;static&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Main&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;ChassisTypes&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;chassisType&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;ChassisInfo.GetCurrentChassisType();&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;Console.WriteLine(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Current Chassis Type: "&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;+&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;chassisType);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When run, this code will output the chassis type of the machine, for example:&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;Current&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Chassis&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Type:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Laptop&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Why Use WMI for Chassis Information?&lt;/h3&gt;&lt;p&gt;WMI provides a standardized way to retrieve system information across Windows devices. By leveraging WMI, we can query detailed hardware information without requiring direct access to device-specific APIs, making the code more portable and easier to maintain.&lt;/p&gt;&lt;h3&gt;Use Cases for Chassis Information&lt;/h3&gt;&lt;p&gt;Retrieving chassis type information can be useful in various scenarios, such as:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Tailoring Software for Different Devices&lt;/strong&gt;: You might have specific configurations for desktops, laptops, and servers to optimize performance and usability.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security and Compliance&lt;/strong&gt;: Knowing the device type can help enforce different security policies, such as stricter protocols on portable devices like laptops.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Device-Specific UI Adjustments&lt;/strong&gt;: On handheld or laptop devices, your application may need a more compact UI, while desktops and servers can afford more screen space.&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;With the code shown above, you can easily retrieve the chassis type of a machine in C#. This can be a powerful tool in applications that need to adapt to different hardware types. By using WMI and enums in C#, your application can gain insights into the device it’s running on, leading to more adaptable and efficient solutions.&lt;/p&gt;&lt;/div&gt;&lt;span style="font-size: medium;"&gt;You can get the complete on &lt;a href="https://gist.github.com/marianz-bonfire/7feedcd0d302e613f2d4bf0b9b29661d" target="_blank"&gt;Github&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/5370964385304341653/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/how-to-retrieve-machine-chassis.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5370964385304341653" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/5370964385304341653" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/how-to-retrieve-machine-chassis.html" rel="alternate" title="How to Retrieve Machine Chassis Information in C#" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYCkmN1w8gnHqi59CFfBzYppVOMUh_L_1IBrJ0Yf4BMKSqr1Hx34owxDKnH2ii4lq9aly0vXatoI0-IdtL31Fpglwzglt0AGYbZybx98enLUFxQGEjma99swxUkNXwWMBYzogjhfVJBXVQvk-2eKQCkopQefh4KZyszCb0j_5kKdw3DMyf2Z2glN4g7ipo/s72-c/output-onlinetexttools.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-1497744614162427991</id><published>2024-11-04T16:25:00.008+08:00</published><updated>2024-11-30T05:45:48.974+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Gist"/><category scheme="http://www.blogger.com/atom/ns#" term="Laravel"/><category scheme="http://www.blogger.com/atom/ns#" term="Mock"/><category scheme="http://www.blogger.com/atom/ns#" term="PHP"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Tutorials"/><title type="text">How to Create a Mock Controller with User Data in Laravel</title><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc9LH7H9RS9hevd12hATOdzx5cK9eUnjXn7BZpWyLgxdmhvNf83GGjPsABsui6F5CleeSgd1OK2ARrNQ6NAkOFsZL4nmi_SDrfRNThoNBDVaTp9oT8sOloRYIwFN722rL0s9coZEv-vX-ZFAIcta-jQpPm9mXCqXJcxoh7mdWxIcm-oPaYWKAygxRcfNJe/s1200/codeimg-facebook-shared-image.jpeg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="778" data-original-width="1200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc9LH7H9RS9hevd12hATOdzx5cK9eUnjXn7BZpWyLgxdmhvNf83GGjPsABsui6F5CleeSgd1OK2ARrNQ6NAkOFsZL4nmi_SDrfRNThoNBDVaTp9oT8sOloRYIwFN722rL0s9coZEv-vX-ZFAIcta-jQpPm9mXCqXJcxoh7mdWxIcm-oPaYWKAygxRcfNJe/s16000/codeimg-facebook-shared-image.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Working on a Laravel project and need sample user data for testing purposes? Setting up a mock controller with some realistic user data can be a great approach, especially if you're prototyping or want to focus on front-end features without setting up a database. In this article, we’ll walk through creating a &lt;code&gt;UsersController&lt;/code&gt; in Laravel that provides mock user data and implements CRUD operations for demonstration and testing.&lt;/p&gt;&lt;h4&gt;1. Setting Up the Controller&lt;/h4&gt;&lt;p&gt;To begin, create a new controller in Laravel named &lt;code&gt;UsersController&lt;/code&gt;. This will serve as our mock API endpoint for managing user data. We’ll store our user data in an array, simulating a database table.&lt;/p&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;namespace&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;App\Http\Controllers&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;use&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Illuminate\Http\Request&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;use&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Illuminate\Support\Facades\Validator&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;use&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Illuminate\Pagination\LengthAwarePaginator&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;use&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Illuminate\Support\Collection&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;UsersController&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Controller&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$users;&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;__construct&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #75715e;"&gt;// Sample users data&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Emma Smith'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'email'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'smith@kpmg.com'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'position'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Art Director'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'role'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Administrator'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'last_login'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Yesterday'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'two_steps'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'joined_day'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"10 Nov 2022, 9:23 pm"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
                &lt;span style="color: #e6db74;"&gt;'online'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
            &lt;span style="color: #75715e;"&gt;// Additional sample users here&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;];&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;This constructor method initializes an array of user data. Each user has attributes like &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt;, and &lt;code&gt;last_login&lt;/code&gt;. You can customize these attributes to fit your needs.&lt;/p&gt;&lt;h4&gt;2. Fetching Users List with Pagination and Filters&lt;/h4&gt;&lt;p&gt;Our next step is to create a method to fetch all users, including pagination and filtering functionality. This helps us simulate a real database where we can retrieve, sort, and filter data.&lt;/p&gt;&lt;/div&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;getUsers&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Request&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$request)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$usersCollection&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;collect&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$page&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$request&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;input&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'page'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$perPage&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$request&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;input&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"items_per_page"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #75715e;"&gt;// Search and filter logic here&lt;/span&gt;
    &lt;span style="color: #75715e;"&gt;// Paginate users&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$paginatedUsers&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;paginate&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($usersCollection,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$perPage,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$page);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"data"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$paginatedUsers&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;toArray&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #f8f8f2;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div&gt;&lt;p&gt;This method retrieves users as a collection and paginates the results. We also implement a helper function &lt;code&gt;paginate()&lt;/code&gt; to manually paginate the data.&lt;/p&gt;&lt;h4&gt;3. Adding a User&lt;/h4&gt;&lt;p&gt;Adding a new user in this mock setup requires validating the input and appending it to our users array. Here’s how:&lt;/p&gt;&lt;/div&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;addUser&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Request&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$request)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_decode($request&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getContent&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(),&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$validator&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Validator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;make&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($data,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'required|string|max:255'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'email'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'required|string|email|max:255'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'role'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'required|string|max:255'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($validator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;fails&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;())&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"errors"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$validator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;errors&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;422&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"id"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;count($this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;+&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;[]&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data;&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"data"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;201&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div&gt;&lt;p&gt;This function adds a new user only if the data is valid, simulating the behavior of a real database-backed &lt;code&gt;POST&lt;/code&gt; request.&lt;/p&gt;&lt;h4&gt;4. Updating User Data&lt;/h4&gt;&lt;p&gt;Updating a user’s information is similar to adding a new user, but here we first locate the user by ID, then update the existing array entry:&lt;/p&gt;&lt;/div&gt;&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;updateUser&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Request&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$request,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$id)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;json_decode($request&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;getContent&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(),&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$validator&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Validator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;make&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($data,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'name'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'required|string|max:255'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'email'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'required|string|email|max:255'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
        &lt;span style="color: #e6db74;"&gt;'role'&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'required|string|max:255'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($validator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;fails&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;())&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"errors"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$validator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;errors&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;422&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$user&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;collect&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;firstWhere&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$id);&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;$user)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"User not found"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;404&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;$user&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;array_merge($user,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$data);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"data"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$user],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;200&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4&gt;5. Deleting a User&lt;/h4&gt;&lt;p&gt;Deleting a user is as straightforward as removing the user by ID from the array. Here’s a simple &lt;code&gt;deleteUser&lt;/code&gt; function:&lt;/p&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;deleteUser&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($id)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$key&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;array_search($id,&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;array_column&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'id'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;));&lt;/span&gt;

    &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;($key&lt;/span&gt; &lt;span style="color: #f92672;"&gt;===&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;([&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"message"&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;"User not found"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;404&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

    &lt;span style="color: #f8f8f2;"&gt;unset($this&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;users&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;[$key]);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;response&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;204&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;h4&gt;&lt;br /&gt;&lt;/h4&gt;&lt;h4&gt;6. Creating the Paginate Function&lt;/h4&gt;&lt;p&gt;Since we’re working with an array instead of a database, we need a custom paginator. Here’s a function to handle manual pagination:&lt;/p&gt;
&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #75715e;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;public&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;function&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;paginate&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($items,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$perPage&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;10&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$page&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$page&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$page&lt;/span&gt; &lt;span style="color: #f92672;"&gt;?:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;Paginator&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;resolveCurrentPage&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;?:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;1&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;$items&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$items&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;instanceof&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Collection&lt;/span&gt; &lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$items&lt;/span&gt; &lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;Collection&lt;/span&gt;&lt;span style="color: #f92672;"&gt;::&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;make&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($items);&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;new&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;LengthAwarePaginator&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($items&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;forPage&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;($page,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$perPage)&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;values&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$items&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;count&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;(),&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$perPage,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;$page);&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The &lt;code&gt;paginate&lt;/code&gt; function lets us handle pagination just like we would with Eloquent collections.&lt;/p&gt;&lt;h4&gt;Wrapping Up&lt;/h4&gt;&lt;p&gt;With this setup, you now have a fully functional mock user controller in Laravel! This mock controller can be extended with additional endpoints or adapted to handle more complex mock data requirements. Whether you’re building a front-end prototype or testing Laravel API responses, this approach can save you time and simplify your development process.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size: medium;"&gt;You can get the complete code here on &lt;a href="https://gist.github.com/marianz-bonfire/3319216c29457d0ff397953d60a47a76" target="_blank"&gt;Github&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;script src="https://gist.github.com/marianz-bonfire/3319216c29457d0ff397953d60a47a76.js"&gt;&lt;/script&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/1497744614162427991/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/how-to-create-mock-controller-with-user.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1497744614162427991" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/1497744614162427991" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/11/how-to-create-mock-controller-with-user.html" rel="alternate" title="How to Create a Mock Controller with User Data in Laravel" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhc9LH7H9RS9hevd12hATOdzx5cK9eUnjXn7BZpWyLgxdmhvNf83GGjPsABsui6F5CleeSgd1OK2ARrNQ6NAkOFsZL4nmi_SDrfRNThoNBDVaTp9oT8sOloRYIwFN722rL0s9coZEv-vX-ZFAIcta-jQpPm9mXCqXJcxoh7mdWxIcm-oPaYWKAygxRcfNJe/s72-c/codeimg-facebook-shared-image.jpeg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4112172627431459458.post-7587280841658083856</id><published>2024-09-12T22:01:00.012+08:00</published><updated>2024-11-06T11:25:18.239+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Dart"/><category scheme="http://www.blogger.com/atom/ns#" term="Flutter"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Maps"/><category scheme="http://www.blogger.com/atom/ns#" term="Location"/><category scheme="http://www.blogger.com/atom/ns#" term="Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Supabase"/><title type="text">Flutter Live Location Tracking using Supabase</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh5UktmWXtLpMaBDRASOEd4XtPQapBJj_Yw3kuLjCRwVHtSO4TXyxFR9ybh5_5AjXIfVKzKlWuZ7NHXjWf-tp_3VwpnLCjvwpeekaivWX3EN_1RsNWv_YYwsCpKzwhp9wz0NGDd2V_f-GgO8eXNoS_E3ba2kDvMZqAr2rQLYFFdMyL7GWsKYYJzo2U1SQm/s2560/flutter-fotor-20241104185111.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1440" data-original-width="2560" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh5UktmWXtLpMaBDRASOEd4XtPQapBJj_Yw3kuLjCRwVHtSO4TXyxFR9ybh5_5AjXIfVKzKlWuZ7NHXjWf-tp_3VwpnLCjvwpeekaivWX3EN_1RsNWv_YYwsCpKzwhp9wz0NGDd2V_f-GgO8eXNoS_E3ba2kDvMZqAr2rQLYFFdMyL7GWsKYYJzo2U1SQm/w640-h360/flutter-fotor-20241104185111.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To implement live location tracking with polylines from the start coordinates to destination coordinates, and to use Supabase for real-time updates, you can follow this approach.&lt;/p&gt;&lt;h3&gt;Steps:&lt;/h3&gt;&lt;p style="text-align: left;"&gt;&lt;/p&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;strong&gt;Set Up Supabase&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;Sign up on Supabase.&lt;/li&gt;&lt;li&gt;Create a project and a table to store location updates (with columns like latitude, longitude, timestamp, user_id).&lt;/li&gt;&lt;li&gt;Use Supabase’s real-time features to broadcast location changes.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Add Supabase and Necessary Packages&lt;/strong&gt;:
In your &lt;code&gt;pubspec.yaml&lt;/code&gt;, include the following dependencies:
  
  &lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #ae81ff;"&gt;dependencies&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;flutter&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt;
    &lt;span style="color: #ae81ff;"&gt;sdk&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;flutter&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;google_maps_flutter&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;^2.1.7&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;location&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;^4.3.0&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;supabase_flutter&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;^1.0.0&lt;/span&gt;
  &lt;span style="color: #ae81ff;"&gt;polyline_do&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;^1.0.0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
  
  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Supabase Setup&lt;/strong&gt;: Add Supabase's API Key and URL in your project.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Flutter Code Implementation with Polylines and Real-time Updates&lt;/strong&gt;:&lt;/li&gt;&lt;/ol&gt;


&lt;!--HTML generated using hilite.me--&gt;&lt;div style="background: rgb(39, 40, 34); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:flutter/material.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:google_maps_flutter/google_maps_flutter.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:location/location.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #66d9ef;"&gt;import&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'package:supabase_flutter/supabase_flutter.dart'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;main()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;WidgetsFlutterBinding.ensureInitialized();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Supabase.initialize(&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;url:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'your-supabase-url'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;anonKey:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'your-supabase-anon-key'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;runApp(MyApp());&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;MyApp&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatelessWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MaterialApp(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'Live Location with Supabase'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;home:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;LiveLocationWithPolyline(),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;debugShowCheckedModeBanner:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;false&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;LiveLocationWithPolyline&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;StatefulWidget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;_LiveLocationWithPolylineState&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;createState()&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;_LiveLocationWithPolylineState();&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #66d9ef;"&gt;class&lt;/span&gt; &lt;span style="color: #a6e22e;"&gt;_LiveLocationWithPolylineState&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;extends&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;State&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;LiveLocationWithPolyline&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;late&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;GoogleMapController&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_mapController;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Location&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_location&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Location();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;LatLng&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_initialPosition&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;LatLng(&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;37.42796133580664&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #ae81ff;"&gt;122.085749655962&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;LatLng&lt;/span&gt;&lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_destination;&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Set&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;Polyline&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_polylines&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{};&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;List&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;LatLng&lt;/span&gt;&lt;span style="color: #f92672;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;polylineCoordinates&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[];&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;bool&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_liveUpdate&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;SupabaseClient&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;supabase&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Supabase.instance.client;&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_onMapCreated(GoogleMapController&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;controller)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_mapController&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;controller;&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_location.onLocationChanged.listen((LocationData&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;locationData)&lt;/span&gt; &lt;span style="color: #f92672;"&gt;as&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;ync&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(_liveUpdate)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;LatLng&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;currentPosition&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;LatLng(locationData.latitude&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;locationData.longitude&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

        &lt;span style="color: #f8f8f2;"&gt;_mapController.animateCamera(&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;CameraUpdate.newCameraPosition(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;CameraPosition(target:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;currentPosition,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;zoom:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;

        &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(_destination&lt;/span&gt; &lt;span style="color: #f92672;"&gt;!=&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;polylineCoordinates.add(currentPosition);&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;setState(()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;_polylines.add(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;Polyline(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;polylineId:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;PolylineId(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'route'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;points:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;polylineCoordinates,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;color:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.blue,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;width:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;5&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

        &lt;span style="color: #75715e;"&gt;// Update current location to Supabase&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;await&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;supabase.from(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'locations'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;).insert({&lt;/span&gt;
          &lt;span style="color: #e6db74;"&gt;'latitude'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;locationData.latitude&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
          &lt;span style="color: #e6db74;"&gt;'longitude'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;locationData.longitude&lt;/span&gt;&lt;span style="color: #f92672;"&gt;!&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
          &lt;span style="color: #e6db74;"&gt;'timestamp'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;DateTime.now().toIso8601String(),&lt;/span&gt;
          &lt;span style="color: #e6db74;"&gt;'user_id'&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #e6db74;"&gt;'user_1'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt; &lt;span style="color: #75715e;"&gt;// Add your user identification logic&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_trackSupabaseUpdates()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;supabase&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;.from(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'locations'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;.on(SupabaseEventTypes.insert,&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(payload)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
          &lt;span style="color: #66d9ef;"&gt;final&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;data&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;payload.newRecord;&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;LatLng&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;newLocation&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;LatLng(data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'latitude'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;data[&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;'longitude'&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;]);&lt;/span&gt;

          &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(_destination&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;_destination&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;newLocation;&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;setState(()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;polylineCoordinates.add(_initialPosition);&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;polylineCoordinates.add(newLocation);&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;})&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;.subscribe();&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;void&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;initState()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;super&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;.initState();&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;_location.requestPermission().then((granted)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
      &lt;span style="color: #66d9ef;"&gt;if&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(granted&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;PermissionStatus.granted)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;_trackSupabaseUpdates();&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

  &lt;span style="background-color: #1e0010; color: #960050;"&gt;@&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;override&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;Widget&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;build(BuildContext&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;context)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
    &lt;span style="color: #66d9ef;"&gt;return&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Scaffold(&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;appBar:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;AppBar(&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;title:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Text(&lt;/span&gt;&lt;span style="color: #e6db74;"&gt;"Live Location with Supabase"&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;actions:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;[&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;Switch(&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;value:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_liveUpdate,&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;onChanged:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;(value)&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;setState(()&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;_liveUpdate&lt;/span&gt; &lt;span style="color: #f92672;"&gt;=&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;value;&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;});&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;},&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;activeColor:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.green,&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;inactiveThumbColor:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Colors.red,&lt;/span&gt;
          &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
        &lt;span style="color: #f8f8f2;"&gt;],&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
      &lt;span style="color: #f8f8f2;"&gt;body:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_initialPosition&lt;/span&gt; &lt;span style="color: #f92672;"&gt;==&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;null&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;?&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;Center(child:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;CircularProgressIndicator())&lt;/span&gt;
          &lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;GoogleMap(&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;initialCameraPosition:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;CameraPosition(&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;target:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_initialPosition,&lt;/span&gt;
                &lt;span style="color: #f8f8f2;"&gt;zoom:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;16.0&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;onMapCreated:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_onMapCreated,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;myLocationEnabled:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;myLocationButtonEnabled:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;true&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;mapType:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;MapType.normal,&lt;/span&gt;
              &lt;span style="color: #f8f8f2;"&gt;polylines:&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;_polylines,&lt;/span&gt;
            &lt;span style="color: #f8f8f2;"&gt;),&lt;/span&gt;
    &lt;span style="color: #f8f8f2;"&gt;);&lt;/span&gt;
  &lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Key Features:&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Live Location Tracking with Polylines&lt;/strong&gt;: The code listens for real-time location updates using the &lt;code&gt;Location&lt;/code&gt; package and draws polylines on the map to show the path from the start to the destination.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Supabase Realtime&lt;/strong&gt;: Every time the location changes, it is stored in the Supabase database. Other clients can receive real-time updates via Supabase’s real-time subscriptions. In this case, the new destination is tracked from Supabase updates.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Polyline Display&lt;/strong&gt;: As the user's location updates, a polyline (blue line) is drawn on the map showing the route to the destination.&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Notes:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Ensure that you have set up your Supabase instance with a &lt;code&gt;locations&lt;/code&gt; table containing columns like &lt;code&gt;latitude&lt;/code&gt;, &lt;code&gt;longitude&lt;/code&gt;, &lt;code&gt;timestamp&lt;/code&gt;, and &lt;code&gt;user_id&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;You can refine how real-time updates are handled to manage multiple users and optimize location updates for performance.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</content><link href="https://tarsier-marianz.blogspot.com/feeds/7587280841658083856/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/09/flutter-live-location-tracking-using.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7587280841658083856" rel="edit" type="application/atom+xml"/><link href="https://www.blogger.com/feeds/4112172627431459458/posts/default/7587280841658083856" rel="self" type="application/atom+xml"/><link href="https://tarsier-marianz.blogspot.com/2024/09/flutter-live-location-tracking-using.html" rel="alternate" title="Flutter Live Location Tracking using Supabase" type="text/html"/><author><name>Marianz</name><uri>http://www.blogger.com/profile/05461067044966825538</uri><email>noreply@blogger.com</email><gd:image height="32" rel="http://schemas.google.com/g/2005#thumbnail" src="//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Theai0ZHFn8XdIdVc4TRBkBVqTfXTUEAPVNsDqQHRg3t2dIGJ2ovvAdnR0lZ8F8vOfvfqSGeK6_Vcc-bGS4WU2PANGSQ2uU9JB_ZZpvY_UdcFL-pKjyoYtuqVbHEyQ/s113/36526792.png" width="32"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh5UktmWXtLpMaBDRASOEd4XtPQapBJj_Yw3kuLjCRwVHtSO4TXyxFR9ybh5_5AjXIfVKzKlWuZ7NHXjWf-tp_3VwpnLCjvwpeekaivWX3EN_1RsNWv_YYwsCpKzwhp9wz0NGDd2V_f-GgO8eXNoS_E3ba2kDvMZqAr2rQLYFFdMyL7GWsKYYJzo2U1SQm/s72-w640-h360-c/flutter-fotor-20241104185111.jpg" width="72"/><thr:total>0</thr:total></entry></feed>