hapidzfadli - Blog

Jumat, 06 Februari 2026

Download Excel Perhitungan Gizi Gratis Untuk Mengitung Gizi Pada Menu MBG

Download Excel Perhitungan Gizi Gratis Untuk Mengitung Gizi Pada Menu MBG

 

 


Halo rekan-rekan Dietisien dan Ahli Gizi!

Dalam mendukung program Makan Bergizi Gratis (MBG), ketepatan perhitungan zat gizi dan efisiensi waktu adalah kunci. Kita tahu bahwa menyusun siklus menu yang memenuhi standar kecukupan gizi sekaligus mempertimbangkan biaya bukanlah pekerjaan yang mudah jika dilakukan secara manual.

Untuk membantu sesama rekan sejawat, saya ingin membagikan Tool Excel Perhitungan Gizi yang telah saya kembangkan. Tool ini dirancang khusus untuk mempermudah operasional kita di lapangan.

Apa saja keunggulan Excel ini?

  • Database Bahan Makanan Lengkap: Mengacu pada Tabel Komposisi Pangan Indonesia.

  • Perhitungan Otomatis: Cukup input berat bahan, total kalori, protein, lemak, dan karbohidrat akan langsung muncul.

  • Monitoring Standar Porsi: Membantu memastikan porsi makan sudah sesuai dengan target kelompok usia.

  • User-Friendly: Ringan, mudah digunakan, dan bisa dimodifikasi sesuai kebutuhan instansi masing-masing.

Mengapa saya membagikannya secara gratis?

Saya percaya bahwa kolaborasi lebih kuat daripada kompetisi. Dengan alat yang tepat, kita bisa fokus pada kualitas asuhan gizi dan edukasi masyarakat, tanpa harus pusing dengan teknis perhitungan yang repetitif.

"Gizi yang baik adalah investasi terbaik untuk masa depan bangsa. Mari kita mulai dengan perhitungan yang presisi."


Cara Mendapatkan:

Rekan-rekan bisa mengunduh file Excel tersebut melalui tautan di bawah ini:https://docs.google.com/spreadsheets/d/15FKPO6FYY4s7Pe6nBsjXBRtD5l1vCgkp/export?format=xlsx

Semoga bermanfaat! Jika ada masukan atau pertanyaan terkait penggunaan tool ini, jangan ragu untuk berdiskusi di kolom komentar ya.

Selasa, 09 Agustus 2022

Menginstal WSL Ubuntu dan Configurasi GUI

Menginstal WSL Ubuntu dan Configurasi GUI

 https://p4.wallpaperbetter.com/wallpaper/547/745/272/black-grey-linux-simple-background-wallpaper-preview.jpg

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2

!Ubuntu GUI commands:
sudo apt update && sudo apt -y upgrade
sudo apt-get purge xrdp
sudo apt install -y xrdp
sudo apt install -y xfce4
sudo apt install -y xfce4-goodies

sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini
echo xfce4-session > ~/.xsession

sudo nano /etc/xrdp/startwm.sh
!comment these lines to:
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession

!add these lines:
# xfce
startxfce4

sudo /etc/init.d/xrdp start

!Now in Windows, use Remote Desktop Connection
localhost:3390

!Then login using your Ubuntu username and password

!Good links:
Microsoft GUI announcement: https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/
Ubuntu WSL2 GUI Install:
https://dev.to/darksmile92/linux-on-windows-wsl-with-desktop-environment-via-rdp-522g
WSL 2 install: https://docs.microsoft.com/en-us/windows/wsl/install-win10
Docker for WSL2: https://docs.docker.com/docker-for-windows/wsl/
What is WSL? https://docs.microsoft.com/en-us/windows/wsl/about
WSL documentation: https://docs.microsoft.com/en-us/windows/wsl/
WSL 2 Announcement: https://devblogs.microsoft.com/commandline/announcing-wsl-2/
!WSL commands:

Minggu, 07 Agustus 2022

Gunakan Framestorm untuk Menghasilkan Ide Baru

Gunakan Framestorm untuk Menghasilkan Ide Baru

 Jika brainstorming Anda tidak menghasilkan ide-ide inovatif yang Anda harapkan, cobalah pendekatan berbeda yang melibatkan pertanyaan tentang suatu masalah, bukan solusi.

Curah pendapat memiliki reputasi buruk—ini terkait dengan rencana setengah matang yang terlalu aman atau terlalu menggelikan, dan tidak pernah ke mana-mana. Sebagai gantinya, cobalah melakukan framestorming: mengajukan pertanyaan untuk membingkai tantangan yang ada. Istilah ini diciptakan oleh profesor Universitas Stanford Tina Seelig, dan digunakan oleh perusahaan seperti Microsoft, Kaiser Permanente, dan Pfizer. Jika Anda ingin melakukan framestorm, ikuti model ini dari Right Question Institute.



Gunakan Framestorm untuk Menghasilkan Ide Baru

  1. Nyatakan fokus.  Tentukan masalah mana yang menjadi fokus dan buat pernyataan yang provokatif, seperti, "Tiga puluh persen pelanggan kami tidak senang dengan layanan kami."
  2. Minta peserta untuk mengajukan pertanyaan.  Bagilah tim Anda menjadi kelompok-kelompok yang terdiri dari empat hingga enam orang, dengan satu anggota kelompok menuliskan setiap pertanyaan. Dorong semua orang untuk melanjutkan selama 10 menit penuh, tidak diperbolehkan mengedit atau berdebat.
  3. Mintalah kelompok untuk membersihkan pertanyaan. Setelah 10 menit, kelompok berkumpul untuk meninjau dan mengklarifikasi pertanyaan.
  4. Beritahu mereka untuk memilih pertanyaan terbaik. Setiap kelompok memilih dua atau tiga pertanyaan terbaik mereka untuk dibagikan dan memilih yang terbaik—yaitu, pertanyaan yang paling menarik minat ruangan dan membuka cara berpikir baru.
  5. Putuskan bagaimana untuk bergerak maju. Ini mungkin bagian yang paling menantang. Pilih pertanyaan yang paling dapat ditindaklanjuti dan garis besar rencana tindakan untuk bergerak maju.
  6. Tutup dengan refleksi. Minta peserta untuk membagikan apa yang telah mereka pelajari dengan menggunakan pertanyaan dengan cara baru ini. Rothstein mengatakan ini dapat menyebabkan "benjolan metakognitif" yang dapat membantu lebih lanjut mendorong framestorming.

Sabtu, 06 Agustus 2022

Apa yang dipelajari machine learning tentang DFT?

Apa yang dipelajari machine learning tentang DFT?

 Widget Container memiliki widget AspectRatio, yang memiliki Container turunan dalam warna yang berbeda.

Akibatnya, kita melihat berbagai jenis kombinasi warna.

Mari kita lihat kode lengkapnya sekarang.

Ingat, dalam setiap kasus, widget AspectRatio mencoba menemukan ukuran terbaik dan menyesuaikan turunannya.

Itu datang untuk membantu kami, ketika kami mencoba mengubah ukuran gambar dengan cepat.

pembelajaran mesin (ML) dan informatika material (MI).

Untuk memahami metode ML untuk MI, saya mencoba menggunakan tumpang tindih mulus posisi atom (SOAP) , yang merupakan deskriptor yang banyak digunakan untuk molekul. Menggunakan deskriptor SOAP sebagai input, saya menerapkan model jaringan saraf sederhana (NN) di PyTorch (lihat Gbr.1 (a)). Setelah melatih model NN dengan energi, akurasinya sangat baik, dan kemudian saya memindahkan model NN yang terlatih ke celah HOMO-LUMO. Saya memperoleh hasil sebagai Gambar.1 (b) dan (c).


Gbr.1: (a) Model NN berbasis input deskriptor SOAP. (b) Kurva pembelajaran untuk energi atomisasi (eV) yang disediakan oleh database QM9 , yang merupakan database benchmark terkenal di MI. Kesalahan uji energi sekitar 2,0 eV. (c) Transfer pembelajaran untuk kesenjangan HOMO-LUMO dengan model yang telah dilatih sebelumnya.

Saya menemukan bahwa hasil transfer sangat buruk (akurasi acak dan pra-terlatih (kesalahan) adalah sama, sekitar 1,2 eV seperti yang ditunjukkan pada Gambar.1 (c))... Untuk studi saya, saya mencoba menggunakan ML lain model (misalnya, jaringan saraf grafik dan potensi jaringan saraf ), tetapi hasilnya juga sangat buruk atau jauh lebih buruk ...

Di sini, saya punya pertanyaan; apakah ini berarti model NN di atas hanya pas untuk energi saja, tidak belajar fisika sama sekali? Selain itu, apakah sebagian besar model ML yang hanya memuat energi masuk akal dari sudut pandang DFT? Dalam DFT, sejauh yang saya pelajari, menyelesaikan persamaan Kohn-Sham menghasilkan energi dan kepadatan keadaan dasar dengan prinsip variasi, dan juga memberikan nilai eigen (yaitu, energi orbital), sehingga kita dapat mengetahui berbagai sifat fisik seperti HOMO dan LUMO.

Kesan saya adalah bahwa model ML hanya memprediksi "molekul serupa memiliki energi yang sama (lihat Gbr.2)", dan sangat mudah jika kita memiliki sejumlah besar molekul serupa dan energinya dalam database. Namun, bahkan dalam kasus ini, dapatkah kita mengatakan bahwa "ML dapat memperkirakan perhitungan DFT"? (Faktanya, sebagian besar makalah penelitian di ML dan MI mengklaim demikian, dan sejujurnya saya sangat bingung…)



Gbr.2: Energi molekul sisi kanan harus mendekati sekitar -86,7X eV (energi sebenarnya adalah -86,75 eV), tetapi ini sangat mudah diprediksi karena kita telah mengetahui energi molekul sisi kiri sebagai sampel data pelatihan, yang sangat mirip dengan molekul sisi kanan.


Postscript: sebenarnya, saya sekarang tertarik pada "model dasar" dalam penelitian AI/ML ( https://arxiv.org/pdf/2108.07258.pdf ). Saya ingin tahu apakah AI/ML dapat menyelesaikan berbagai tugas (misalnya, tidak hanya memprediksi energi total tetapi juga memberikan nilai eigen HOMO LUMO, kepadatan, dan sifat fisik lainnya) dengan satu model (pra-terlatih). Saya ingin bertanya tentang kemungkinan sebagai pertanyaan lain.


Jawaban: 


Energi total dan kesenjangan HOMO-LUMO adalah jumlah yang sangat berbeda, dan tentu saja memerlukan desain jaringan saraf yang sangat berbeda (termasuk pilihan deskriptor dan arsitektur) untuk menggambarkan secara efisien dan akurat. Sebagai contoh:


Energi total adalah properti ukuran-luas, sedangkan celah HOMO-LUMO adalah ukuran-intensif. Dua salinan molekul yang sama yang tidak berinteraksi memiliki persis dua kali energi sebagai molekul tunggal, dan celah HOMO-LUMO yang persis sama (bukan dua kali lebih besar) sebagai molekul tunggal. Banyak jaringan saraf yang dirancang untuk memprediksi energi total bekerja dengan mengekspresikan energi total sebagai jumlah energi atom, dan memprediksi energi atom; ini menjamin ukuran-ekstensivitas dengan konstruksi, tetapi yang juga berarti bahwa jaringan saraf yang sama sama sekali tidak cocok untuk memprediksi properti ukuran-intensif.

Energi total adalah properti yang relatif lokal, tetapi kesenjangan HOMO-LUMO sangat non-lokal. Bayangkan sebuah molekul besar di mana HOMO terlokalisasi di satu sisi sementara LUMO terlokalisasi di sisi lain. Jaringan saraf tidak dapat secara tepat memperkirakan celah HOMO-LUMO sistem dengan hanya melihat sebagian darinya, bahkan ketika ia menghitung perkiraan untuk banyak bagian kecil dari molekul dan kemudian mengumpulkan hasilnya. Pada beberapa titik prediksi jaringan saraf, harus ada pengurangan dua kuantitas yang dihitung dari dua bagian molekul yang jauh secara sembarang. Ini juga mengesampingkan banyak arsitektur jaringan saraf umum. Sebaliknya, semua interaksi melalui ruang yang terlibat dalam peluruhan energi total setidaknya sebagai1 / R, dan jauh lebih cepat dari itu jika sistem tidak mengandung ion.

Selain itu, ada beberapa masalah yang memengaruhi prediksi energi total dan kesenjangan HOMO-LUMO, tetapi jauh lebih parah untuk yang terakhir:


Celah HOMO-LUMO adalah fungsi tak terdiferensiasi dari geometri molekul. Pertimbangkan sistem yang keadaan dasarnya dan keadaan tereksitasi pertama membentuk persimpangan kerucut (misalnya sistem Jahn-Teller orde pertama), dan kami memvariasikan geometri secara terus menerus dari satu sisi persimpangan kerucut, sampai kami melewati titik persimpangan. Kesenjangan HOMO-LUMO akan berkurang kira-kira secara linier. Kemudian pada titik persimpangan, HOMO dan LUMO tiba-tiba bertukar, dan kesenjangan HOMO-LUMO meningkat kira-kira secara linier lagi. Tidak ada jaringan saraf yang dibangun dari fungsi aktivasi halus yang dapat mereproduksi perilaku ini. Sementara jaringan saraf yang menggunakan, misalnya fungsi aktivasi ReLU memang memiliki diskontinuitas turunan, itu adalah tugas yang sulit untuk memastikan bahwa diskontinuitas turunan hanya terjadi pada (atau setidaknya dekat) persimpangan kerucut.

Celah HOMO-LUMO terkadang bergantung pada apakah ada bilangan genap atau ganjil dari suatu gugus fungsi tertentu. Hal ini paling baik dicontohkan oleh aturan 4n+2 Hückel: cincin terkonjugasi dengan elektron 4n+2 bersifat aromatik dan memiliki celah HOMO-LUMO yang relatif besar, sedangkan cincin dengan elektron 4n bersifat antiaromatik dan memiliki celah HOMO-LUMO yang kecil. Sangat menantang untuk mempelajari fakta ini dengan jaringan saraf kecuali dengan mengkodekan aturan secara keras dan/atau dengan sengaja memasukkan sejumlah besar sistem aromatik dan antiaromatik yang berbeda dalam set pelatihan.

Ini mungkin menjelaskan mengapa sulit untuk memprediksi kesenjangan HOMO-LUMO dengan akurasi tinggi. Saya pribadi akan merekomendasikan memprediksi matriks Fock sebagai gantinya, dan kemudian mendapatkan celah HOMO-LUMO dengan mendiagonalisasi matriks Fock. Matriks Fock adalah objek yang berperilaku jauh lebih baik daripada celah HOMO-LUMO: elemen matriks sebagian besar ditentukan dari atom terdekat, tidak memiliki diskontinuitas turunan yang kuat, dan tidak memiliki pergantian genap ganjil seperti celah HOMO-LUMO memiliki untuk cincin terkonjugasi. Selain itu, saya percaya bahwa ada teknik mapan untuk memprediksi matriks Fock melalui pembelajaran mesin.


Cara menggunakan aspect ratio widget

Cara menggunakan aspect ratio widget

Widget AspectRatio mencoba menemukan ukuran terbaik untuk mempertahankan rasio aspek widget anak.

Widget AspectRatio mencoba mengukur turunan ke rasio aspek tertentu.

Misalkan kita memiliki widget Container dengan lebar 100, dan tinggi 100. Dalam hal ini rasio aspeknya adalah 100/100; yaitu 1.0.

Sekarang, setiap Widget memiliki batasannya sendiri . Akibatnya, Widget AspectRatio mencoba menemukan ukuran terbaik untuk mempertahankan rasio aspek. Namun, saat melakukannya, itu menghormati batasan tata letak.

Mari kita lihat tangkapan layar di mana kami telah menggunakan tiga jenis rasio aspek yang berbeda.

 

Widget Container memiliki widget AspectRatio, yang memiliki Container turunan dalam warna yang berbeda.

Akibatnya, kita melihat berbagai jenis kombinasi warna.

Mari kita lihat kode lengkapnya sekarang.

import 'package:flutter/material.dart';

class AspectRatioSample extends StatelessWidget {
  const AspectRatioSample({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'AspectRatio Sample',
      debugShowCheckedModeBanner: false,
      home: AspectRatioSampleHomme(),
    );
  }
}

class AspectRatioSampleHomme extends StatelessWidget {
  const AspectRatioSampleHomme({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('AspectRatio Sample'),
      ),
      body: Center(
        child: Column(
          children: [
            Container(
              color: Colors.red,
              alignment: Alignment.center,
              padding: const EdgeInsets.all(10),
              width: 100.0,
              height: 100.0,
              child: AspectRatio(
                aspectRatio: 2.0,
                child: Container(
                  width: 50.0,
                  height: 50.0,
                  color: Colors.yellow,
                ),
              ),
            ),
            const SizedBox(
              height: 10,
            ),
            Container(
              color: Colors.blue,
              alignment: Alignment.center,
              width: 100.0,
              height: 100.0,
              child: AspectRatio(
                aspectRatio: 2.0,
                child: Container(
                  width: 80.0,
                  height: 70.0,
                  color: Colors.white,
                ),
              ),
            ),
            const SizedBox(
              height: 10,
            ),
            Container(
              color: Colors.green,
              alignment: Alignment.center,
              width: 100.0,
              height: 100.0,
              child: AspectRatio(
                aspectRatio: 0.5,
                child: Container(
                  width: 100.0,
                  height: 50.0,
                  color: Colors.black26,
                ),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        child: const Icon(Icons.add_a_photo),
      ),
    );
  }
}

Ingat, dalam setiap kasus, widget AspectRatio mencoba menemukan ukuran terbaik dan menyesuaikan turunannya.

Itu datang untuk membantu kami, ketika kami mencoba mengubah ukuran gambar dengan cepat.

Mengapa Anda harus belajar Flutter pada tahun 2022?

Mengapa Anda harus belajar Flutter pada tahun 2022?

  • Dalam waktu singkat, Anda akan belajar bagaimana merancang aplikasi untuk berbagai platform.
  • Pelajari cara membuat iOS, Android, dan aplikasi platform lainnya.
  • Pelajari cara menggunakan basis kode tunggal untuk membuat aplikasi iOS dan Android.
  • Dapatkan pengetahuan menyeluruh tentang ide inti Google Flutter.
  • Pelajari tentang salah satu teknologi yang paling cepat berkembang dan bedakan diri Anda dari yang lain.
  • Anda akan menerima bantuan penempatan instan setelah menyelesaikan kursus.

Rabu, 03 Agustus 2022

Create Simple Mobile App YouTube Downloader MP3 & MP4 | Flutter

Create Simple Mobile App YouTube Downloader MP3 & MP4 | Flutter

Create Project Fluttter

Edit main.dart clean code not needed

main.dart

import 'package:flutter/material.dart';
import 'package:youtube_downloader/main_screen.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MainScreen(),
    );
  }
}

Add plugin in pubspec.yaml

http: ^0.13.4
google_fonts: ^3.0.1
path_provider: ^2.0.11
permission_handler:
dio: ^4.0.6
open_file: ^3.2.1

Create file result.dart & create Class Result 

result.dart

import 'dart:convert';
import 'package:http/http.dart' as http;

class Result {
  late String? title;
  late String? thumb;
  late String? filesize_audio;
  late String? filesize_video;
  late String? audio;
  late String? audio_asli;
  late String? video;
  late String? video_asli;

  Result({this.title, this.thumb, this.filesize_audio, this.filesize_video,
    this.audio, this.audio_asli, this.video, this.video_asli});

  factory Result.createPostResult(Map object){
    return Result(
      title: object['title'],
      thumb: object['thumb'],
      filesize_audio: object['filesize_audio'],
      filesize_video: object['filesize_video'],
      audio: object['audio'],
      audio_asli: object['audio_asli'],
      video: object['video'],
      video_asli: object['video_asli'],
    );
  }
  static Future connectToApi(String url) async{
    String apiUrl = 'https://api.akuari.my.id/downloader/youtube?link=' + url;
    final response = await http.get(Uri.parse(apiUrl));
    if(response.statusCode == 200) {
      return Result.createPostResult(jsonDecode(response.body));
    } else {
      throw Exception('Failed to load url');
    }
  }
}

Create file main_screen.dart

Create  Class MainScreen extends StatefulWidget

main_screen.dart

import 'dart:io';
import 'dart:isolate';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:youtube_downloader/result.dart';

class MainScreen extends StatefulWidget {
  const MainScreen({Key? key}) : super(key: key);

  @override
  State createState() => _MainScreenState();
}

class _MainScreenState extends State {
  late Result result;
  String url = "";
  String title = "";
  String thumb = "";
  String filesize_audio = "";
  String filesize_video = "";
  String audio = "";
  String audio_asli = "";
  String video = "";
  String video_asli = "";
  String progress = "";
  bool isLoading = false;
  String directory = "";

  final textController = TextEditingController();
  final padding = const EdgeInsets.all(8.0);
  var dio = Dio();

  Future getDownloadPath() async {
    Directory? directory;
    try {
      if (Platform.isIOS) {
        directory = await getApplicationDocumentsDirectory();
      } else {
        directory = Directory('/storage/emulated/0/Download');
        // Put file in global download folder, if for an unknown reason it didn't exist, we fallback
        // ignore: avoid_slow_async_io
        if (!await directory.exists()) directory = await getExternalStorageDirectory();
      }
    } catch (err) {
      print("Cannot get download folder path");
    }
    return directory!.path;
  }

  Future downloadVideo(String url, String name, String format) async {
    getDownloadPath().then((value){
      setState(() {
        isLoading = true;
        directory = value!;
      });
    });

    // final baseStorage = await getExternalStorageDirectory();
    await dio.download(url, directory + "/" + name + format, onReceiveProgress: (rec, total) {
      setState(() {
        isLoading = false;
        progress = "Downloading.. " + ((rec / total) * 100).toStringAsFixed(0) + "%";
      });
    });
    setState(() {
      if(progress.contains('100')){
        progress = "Download Successful";
      }
    });
  }


  @override
  Widget build(BuildContext context) {
    final padding = EdgeInsets.all(8.0);
    return Scaffold(
      appBar: AppBar(
        title: Text("Youtube Downloader"),
      ),
      body: Center(
        child: Padding(
          padding: padding,
          child: Column(
            children: [
              Padding(
                padding: padding,
                child: Column(
                  children: [
                    Image.network(
                      thumb != "" ? thumb : "https://i.ibb.co/qYTFsDx/placeholder.png",
                      height: 150,
                      width: 150,),
                    Text(title),
                    SizedBox(height: 20,),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        ElevatedButton(
                          onPressed: () {
                            downloadVideo(audio, title, ".mp3");
                          },
                          child: Row(
                            children: [
                              Text("MP3", style: TextStyle(fontSize: 16),),
                              SizedBox(width: 10,),
                              Text(filesize_audio, style: TextStyle(fontSize: 12),)
                            ],
                          ),
                        ),
                        SizedBox(width: 20,),
                        ElevatedButton(
                          onPressed: (){
                            downloadVideo(video, title, ".mp4");
                          },
                          child: Row(
                            children: [
                              Text("MP4", style: TextStyle(fontSize: 16),),
                              SizedBox(width: 10,),
                              Text(filesize_video, style: TextStyle(fontSize: 12),)
                            ],
                          ),
                        )
                      ],
                    )
                  ],
                ),
              ),
              Padding(
                padding: padding,
                child: TextField(
                  controller: textController,
                  decoration: InputDecoration(
                    contentPadding: EdgeInsets.all(8.0),
                    hintText: "Paste link youtubenya disini cantik",
                    suffixIcon: IconButton(
                      icon: Icon(Icons.search),
                      onPressed: () async {
                        setState(() {
                          url = textController.text;
                          isLoading = true;
                        });
                        await Result.connectToApi(url).then((value){
                          result = value;
                          setState(() {
                            title = result.title!;
                            thumb = result.thumb!;
                            filesize_audio = result.filesize_audio!;
                            filesize_video = result.filesize_video!;
                            audio = result.audio!;
                            audio_asli = result.audio_asli!;
                            video = result.video!;
                            video_asli = result.video_asli!;
                            isLoading = false;
                          });
                        });
                      },
                    )
                  ),
                  onSubmitted: (url) => Result.connectToApi(url).then((value){
                    setState(() {
                      title = result.title!;
                      thumb = result.thumb!;
                      filesize_audio = result.filesize_audio!;
                      filesize_video = result.filesize_video!;
                      audio = result.audio!;
                      audio_asli = result.audio_asli!;
                      video = result.video!;
                      video_asli = result.video_asli!;
                    });
                  }),
                ),
              ),
              SizedBox(height: 20,),
              isLoading ? Center(
                child: Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: CircularProgressIndicator(),
                ),
              ) : Text(progress),
            ],
          ),
        ),
      ),
    );
  }
}