<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Blog Muflikhan]]></title><description><![CDATA[Blog Muflikhan]]></description><link>https://blog.muflikhan.my.id</link><generator>RSS for Node</generator><lastBuildDate>Fri, 05 Jun 2026 21:30:18 GMT</lastBuildDate><atom:link href="https://blog.muflikhan.my.id/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Tutorial LAravel API]]></title><description><![CDATA[INi kode Client Dart nya:
import 'package:app/widgets/custom_rounded_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import '../bloc/rfid_shared_bloc.dart';

abstract class RfidSharedWidget {
  ...]]></description><link>https://blog.muflikhan.my.id/tutorial-laravel-api</link><guid isPermaLink="true">https://blog.muflikhan.my.id/tutorial-laravel-api</guid><dc:creator><![CDATA[Muflikhan Dimas Dwiprayogi]]></dc:creator><pubDate>Tue, 03 Feb 2026 10:02:31 GMT</pubDate><content:encoded><![CDATA[<p>INi kode Client Dart nya:</p>
<pre><code class="lang-dart"><span class="hljs-keyword">import</span> <span class="hljs-string">'package:app/widgets/custom_rounded_button.dart'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter/material.dart'</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter_bloc/flutter_bloc.dart'</span>;

<span class="hljs-keyword">import</span> <span class="hljs-string">'../bloc/rfid_shared_bloc.dart'</span>;

<span class="hljs-keyword">abstract</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RfidSharedWidget</span> </span>{
  <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> showConfig({
    <span class="hljs-keyword">required</span> BuildContext context,
    <span class="hljs-keyword">required</span> <span class="hljs-built_in">String</span> keyConfig,
    RfidSharedBloc? bloc
  }) {
    showModalBottomSheet(
      context: context,
      isScrollControlled: <span class="hljs-keyword">true</span>,
      backgroundColor: Colors.transparent,
      builder: (_) {
        <span class="hljs-keyword">if</span> (bloc != <span class="hljs-keyword">null</span>) {
          <span class="hljs-keyword">return</span> BlocProvider.value(
            value: bloc..add(OnCheckSupport(keyConfig: keyConfig)),
            child: _RfidConfigView(),
          );
        }
        <span class="hljs-keyword">return</span> BlocProvider(
          create: (_) =&gt; RfidSharedBloc()
            ..add(OnCheckSupport(keyConfig: keyConfig, )),
          child:  _RfidConfigView(),
        );
      },
    );
  }
}

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">_RfidConfigView</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatelessWidget</span> </span>{
  <span class="hljs-keyword">const</span> _RfidConfigView();


  <span class="hljs-meta">@override</span>
  Widget build(BuildContext context) {
    <span class="hljs-keyword">final</span> theme = Theme.of(context);

    <span class="hljs-keyword">return</span> Container(
      padding: EdgeInsets.only(
        left: <span class="hljs-number">16</span>,
        right: <span class="hljs-number">16</span>,
        top: <span class="hljs-number">12</span>,
        bottom: MediaQuery.of(context).viewInsets.bottom + <span class="hljs-number">16</span>,
      ),
      decoration: BoxDecoration(
        color: theme.colorScheme.surface,
        borderRadius: <span class="hljs-keyword">const</span> BorderRadius.vertical(
          top: Radius.circular(<span class="hljs-number">20</span>),
        ),
      ),
      child: BlocBuilder&lt;RfidSharedBloc, RfidSharedState&gt;(
        builder: (context, state) {
          <span class="hljs-keyword">if</span> (state.isLoadingCheck) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">const</span> SizedBox(
              height: <span class="hljs-number">220</span>,
              child: Center(child: CircularProgressIndicator()),
            );
          }

          <span class="hljs-keyword">if</span> (!state.isRfidSupported) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">const</span> Padding(
              padding: EdgeInsets.all(<span class="hljs-number">24</span>),
              child: Center(
                child: Text(
                  <span class="hljs-string">'RFID tidak didukung di device ini'</span>,
                  style: TextStyle(fontSize: <span class="hljs-number">16</span>),
                ),
              ),
            );
          }

          <span class="hljs-keyword">final</span> isDirty =
              state.draftWorkArea != state.currentWorkArea ||
                  state.draftPower != state.currentPower;

          <span class="hljs-keyword">return</span> Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              <span class="hljs-comment">// Drag handle</span>
              Center(
                child: Container(
                  width: <span class="hljs-number">40</span>,
                  height: <span class="hljs-number">4</span>,
                  margin: <span class="hljs-keyword">const</span> EdgeInsets.only(bottom: <span class="hljs-number">12</span>),
                  decoration: BoxDecoration(
                    color: Colors.grey.shade400,
                    borderRadius: BorderRadius.circular(<span class="hljs-number">4</span>),
                  ),
                ),
              ),

              <span class="hljs-keyword">const</span> Center(
                child: Text(
                  <span class="hljs-string">'RFID Configuration'</span>,
                  style: TextStyle(
                    fontSize: <span class="hljs-number">18</span>,
                    fontWeight: FontWeight.w600,
                  ),
                ),
              ),

              <span class="hljs-keyword">const</span> SizedBox(height: <span class="hljs-number">12</span>),
              <span class="hljs-keyword">const</span> Divider(),

              _section(
                title: <span class="hljs-string">'Work Area'</span>,
                child: _buildDropdown(
                  value: state.draftWorkArea,
                  items: state.workAreas,
                  onChanged: (v) {
                    context.read&lt;RfidSharedBloc&gt;().add(
                      OnUpdateDraft(area: v),
                    );
                  },
                ),
              ),
              _section(
                title: <span class="hljs-string">'Power'</span>,
                child: _buildPowerDropdown(
                  context,
                  value: state.draftPower,
                  powers: state.powers,
                ),
              ),

              <span class="hljs-keyword">const</span> SizedBox(height: <span class="hljs-number">16</span>),
              _buildActionButtons(context, isDirty, ),
            ],
          );
        },
      ),
    );
  }

  <span class="hljs-comment">// ================= UI Helpers =================</span>

  <span class="hljs-keyword">static</span> Widget _section({
    <span class="hljs-keyword">required</span> <span class="hljs-built_in">String</span> title,
    <span class="hljs-keyword">required</span> Widget child,
  }) {
    <span class="hljs-keyword">return</span> Padding(
      padding: <span class="hljs-keyword">const</span> EdgeInsets.symmetric(vertical: <span class="hljs-number">8</span>),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(
            title,
            style: <span class="hljs-keyword">const</span> TextStyle(
              fontWeight: FontWeight.w500,
              fontSize: <span class="hljs-number">14</span>,
            ),
          ),
          <span class="hljs-keyword">const</span> SizedBox(height: <span class="hljs-number">6</span>),
          child,
        ],
      ),
    );
  }

  <span class="hljs-keyword">static</span> Widget _buildDropdown({
    <span class="hljs-keyword">required</span> <span class="hljs-built_in">int</span> value,
    <span class="hljs-keyword">required</span> <span class="hljs-built_in">Map</span>&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">int</span>&gt; items,
    <span class="hljs-keyword">required</span> ValueChanged&lt;<span class="hljs-built_in">int?</span>&gt; onChanged,
  }) {
    <span class="hljs-keyword">return</span> DropdownButtonFormField&lt;<span class="hljs-built_in">int</span>&gt;(
      initialValue: value,
      isExpanded: <span class="hljs-keyword">true</span>,
      decoration: <span class="hljs-keyword">const</span> InputDecoration(
        border: OutlineInputBorder(),
        isDense: <span class="hljs-keyword">true</span>,
      ),
      items: items.entries
          .map(
            (e) =&gt; DropdownMenuItem(
          value: e.value,
          child: Text(e.key),
        ),
      )
          .toList(),
      onChanged: onChanged,
    );
  }

  <span class="hljs-keyword">static</span> Widget _buildPowerDropdown(
      BuildContext context, {
        <span class="hljs-keyword">required</span> <span class="hljs-built_in">int</span> value,
        <span class="hljs-keyword">required</span> <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; powers,
      }) {
    <span class="hljs-keyword">return</span> DropdownButtonFormField&lt;<span class="hljs-built_in">int</span>&gt;(
      initialValue: value,
      isExpanded: <span class="hljs-keyword">true</span>,
      decoration: <span class="hljs-keyword">const</span> InputDecoration(
        border: OutlineInputBorder(),
        isDense: <span class="hljs-keyword">true</span>,
      ),
      items: powers
          .map(
            (p) =&gt; DropdownMenuItem(
          value: p,
          child: Text(<span class="hljs-string">'<span class="hljs-subst">$p</span> dBm'</span>),
        ),
      )
          .toList(),
      onChanged: (v) {
        context.read&lt;RfidSharedBloc&gt;().add(
          OnUpdateDraft(power: v),
        );
      },
    );
  }

  <span class="hljs-comment">// ================= Action Buttons =================</span>

  <span class="hljs-keyword">static</span> Widget _buildActionButtons(
      BuildContext context,
      <span class="hljs-built_in">bool</span> isDirty,
      ) {
    <span class="hljs-keyword">return</span> Row(
      children: [
        Expanded(
          child: CustomRoundedButton(
            color: Colors.orange,
            onPressed: () {
              <span class="hljs-comment">// Cancel → rollback automatically</span>
              Navigator.of(context).pop();
            },
            label: <span class="hljs-string">'Cancel'</span>,
          ),
        ),
        <span class="hljs-keyword">const</span> SizedBox(width: <span class="hljs-number">12</span>),
        Expanded(
          child: CustomRoundedButton(
            onPressed: () {
              context.read&lt;RfidSharedBloc&gt;().add(
                <span class="hljs-keyword">const</span> OnResetDraft(),
              );
            },
            isSecondary: <span class="hljs-keyword">true</span>,
            label: <span class="hljs-string">'Reset'</span>,
          ),
        ),
        <span class="hljs-keyword">const</span> SizedBox(width: <span class="hljs-number">12</span>),
        Expanded(
          child: CustomRoundedButton(
            onPressed: isDirty
                ? () {
              context.read&lt;RfidSharedBloc&gt;().add(
                 OnApplyConfig(),
              );
              Navigator.of(context).pop();
            }
                : <span class="hljs-keyword">null</span>,
            label: <span class="hljs-string">'Save'</span>,
          ),
        ),
      ],
    );
  }
}
</code></pre>
<p>hz kan</p>
<p>aok</p>
<p>sip sip</p>
<h1 id="heading-hello">Hello</h1>
<div class="hn-table">
<table>
<thead>
<tr>
<td>test</td><td>hds</td><td>sd</td></tr>
</thead>
<tbody>
<tr>
<td>sj</td><td>hsd</td><td>shj</td></tr>
<tr>
<td>sjdh</td><td>hsjd</td><td>jhd</td></tr>
</tbody>
</table>
</div>]]></content:encoded></item></channel></rss>