void main() { print(convertRomawiToNumber("III")); } String convertRomawiToNumber(String? romawi) { Map<String, int> romawiToNumber = { "I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000 }; int total = 0; List<int> listRomawiToNumber = []; //cek invalid INPUT if (romawi == null || romawi.length < 1) { return "INVALID INPUT"; } //cek invalid ROMAWI for (int i = 0; i < romawi.length; i++) { if (!(romawiToNumber.keys.toList().contains(romawi.split("")[i]))) { return "INVALID ROMAWI"; } } //Convert ROMAWI TO NUMBER for (int i = 0; i < romawi.length; i++) { listRomawiToNumber.add(romawiToNumber[romawi.split("")[i]]!); } //SET DEFAULT TOTAL WITH LAST VALUE LIST RESULT ROMAWI TO NUMBER total += listRomawiToNumber[listRomawiToNumber.length - 1]; //LOGIC CHECK ROMAWI for (int i = listRomawiToNumber.length - 1; i >= 0; i--) { if (i >= 1) { if (listRomawiToNumber[i] <= listRomawiToNumber[i - 1]) { total += listRomawiToNumber[i - 1]; } else { total -= listRomawiToNumber[i - 1]; } } } //RETURN TOTAL return total.toString(); }
Tutorial menambahkan 3D models ke dalam aplikasi projek Flutter dengan vectary
Selamat malam semuanya....
import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; class VectaryScreen extends StatefulWidget { const VectaryScreen({Key? key}) : super(key: key); @override State<VectaryScreen> createState() => _VectaryScreenState(); } class _VectaryScreenState extends State<VectaryScreen> { @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( title: const Text('Vectary'), elevation: 0, actions: const [ Icon(Icons.shopping_cart), SizedBox( width: 20, ), Icon(Icons.share), SizedBox( width: 20, ), ], ), bottomNavigationBar: _buildBottomBarActions(), body: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ const Expanded( child: WebView( initialUrl: 'https://app.vectary.com/p/4lepw7bb8QnDkTRO8uRiB7', javascriptMode: JavascriptMode.unrestricted, ), ), const SizedBox( height: 20, ), _buildProductTitle(), ], ), ); } Widget _buildBottomBarActions() { return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ Row( children: [ Expanded( child: Container( height: 50, decoration: BoxDecoration( border: Border.all(color: Colors.black), borderRadius: BorderRadius.circular(4), ), child: const Center( child: Text( 'Buy Now', style: TextStyle( color: Colors.black, fontSize: 16, ), ), ), )), const SizedBox( width: 8, ), Expanded( child: Container( height: 50, width: 200, decoration: BoxDecoration( color: Colors.black, border: Border.all(color: Colors.black), borderRadius: BorderRadius.circular(4), ), child: const Center( child: Text( 'Add to bag', style: TextStyle( color: Colors.white, fontSize: 16, ), ), ), ), ) ], ), const SizedBox( height: 20, ) ], ), ); } Widget _buildProductTitle() { return Column( children: const [ Text( 'Sneaker', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 20, ), ), SizedBox( height: 8, ), Text( 'Sneaker X', style: TextStyle( fontSize: 16, ), ), SizedBox( height: 8, ), ], ); } }
import 'package:flutter/material.dart'; import 'package:tutorials_vectary/vectary_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: 'Tutorial Vactary', theme: ThemeData( primarySwatch: Colors.blue, ), home: const VectaryScreen(), ); } }
Cara menampilkan Progress indicator dengan Image.Network() pada Flutter
Code penggunaan Widget Image.Network() sebelum menggunakan progress ketika gambar di load dari internet serta hasilnya:
Cara menampilkan emulator di dalam jendela Android Studio pada project Flutter
Sesuai judul artikel,Hari ini saya akan menulis artikel bagaimana cara mengatasi emulator tidak bisa berjalan didalam jendela Android Studio pada project flutter...
Pada versi terbaru Android Studio terdapat fitur untuk menjalankan emulator didalam jendela Android Studio tetapi pada kasus project Flutter default/bawaan fitur tersebut tidak berfungsi meski fitur sudah diaktifkan. Dari permasalahan diatas setelah melakukan riset dan pencarian akhirnya saya menemukan cara mengatasi masalah diatas...
Adapun caranya:
Pertama pastikan fitur enable to lunch windows emulator diaktifkan dengan cara pilih menu setting->pilih tools->emulator->centang menu Launch in a tool window..
Selanjutnya agar fitur aktif pada project flutter kita pastikan untuk mengimpor modul android ke dalam project flutter, dengan cara pilih menu project structure->pilih modules->klik tombol tambah/plus->lalu pilih android (pastikan project di select dulu)->klik OK ....
Membuat aplikasi sederhana tebak jenis kelamin dengan flutter
Siang semuanya, hari ini saya ingin membagi tutorial sederhana Membuat aplikasi sederhana tebak jenis kelamin dengan Flutter dengan memanfaatkan API dari website genderize.io .Jadi cara kerja aplikasi ini nantinya dengan hanya memasukkan nama,aplikasi akan menampilkan tebakan atau prediksi jenis kelamin dari nama tersebut...
OK pertama tama kita tambahkan package http ke file pubspec.yaml selanjutnya jangan lupa untuk melakukan perintah flutter pub get agar package di load ke project kita...
Selanjutnya buat kan Directory baru dengan nama screen dan didalam directory tersebut kita buat file dart baru dengan nama home_screen ...maka tampilan struktur project nya seperti ini
Lalu masuk ke file main.dart dan ubah code nya seperti dibawah
import 'package:flutter/material.dart'; import 'package:tebak_jenis_kelamin/screen/home_screen.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: HomeScreen(), ); } }
import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; class HomeScreen extends StatefulWidget { HomeScreen({Key? key}) : super(key: key); @override State<HomeScreen> createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { final TextEditingController _namaController = TextEditingController(); final String faseLoading = "faseLoading"; final String faseDone = "faseDone"; String fase = ""; String? nama; String? jenisKelamin; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return SafeArea( child: Scaffold( appBar: AppBar( elevation: 0, title: const Text( "Tebak Jenis Kelamin", style: TextStyle(fontSize: 20), ), ), body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ _search(context), fase == "" ? Container() : fase == faseLoading ? Container( margin: const EdgeInsets.only(top: 20), child: const CircularProgressIndicator()) : _jenisKelamin() ], ), ), ), ); } Widget _search(BuildContext context) { return Container( padding: const EdgeInsets.symmetric(horizontal: 1), color: const Color(0xFFEEEEEE), child: Card( shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(3))), clipBehavior: Clip.antiAliasWithSaveLayer, child: Row( children: <Widget>[ Expanded( child: Container( padding: const EdgeInsets.only(left: 10, right: 5), decoration: const BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(5), bottomLeft: Radius.circular(5)), ), child: TextFormField( controller: _namaController, focusNode: FocusNode(canRequestFocus: false), onSaved: (val) {}, cursorColor: Theme.of(context).colorScheme.primary, decoration: const InputDecoration( hintText: 'Masukkan nama', hintStyle: TextStyle(fontSize: 16.0, color: Color(0xFFcccccc)), errorStyle: TextStyle(height: 0), enabledBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.transparent), ), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.transparent), ), border: UnderlineInputBorder( borderSide: BorderSide(color: Colors.transparent), ), ), style: const TextStyle(color: Colors.black, fontSize: 16.0)), ), ), GestureDetector( onTap: () { if (_namaController.text != "") { tebakJenisKelamin(); FocusScope.of(context).requestFocus(FocusNode()); } else { setFase(""); ScaffoldMessenger.of(context).showSnackBar(const SnackBar( content: Text("Nama belum diisi"), )); } }, child: Wrap( children: [ Container( padding: const EdgeInsets.symmetric( vertical: 12, horizontal: 10), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primary, borderRadius: const BorderRadius.only( bottomRight: Radius.circular(3), topRight: Radius.circular(3))), child: const Icon( Icons.search, color: Colors.white, ), ), ], ), ) ], ), ), ); } Widget _jenisKelamin() { if (jenisKelamin != null) { return Container( margin: const EdgeInsets.only(top: 20), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( jenisKelamin == "male" ? "Laki-laki" : "Perempuan", style: const TextStyle(fontSize: 25, fontWeight: FontWeight.bold), ), Icon( jenisKelamin == "male" ? Icons.male : Icons.female, color: jenisKelamin == "male" ? Colors.blue : Colors.pink, size: 100, ), ], ), ); } return Container(); } tebakJenisKelamin() async { setFase(faseLoading); var url = Uri.parse('https://api.genderize.io/?name=${_namaController.text}'); var response = await http.get(url); var body = json.decode(response.body); setState(() { jenisKelamin = '${body['gender']}'; setFase(faseDone); }); } setFase(String fase) { setState(() { this.fase = fase; }); } }
Demikian tutorial kali ini..semoga tulisan ini bermanfaat untuk yang membaca tulisan ini serta untuk penulis pribadi....
Tutorial Ambil Gambar dari Galeri dan Kamera di Flutter
Tutorial kali ini kita akan membahas bagaimana implementasi package image_picker pada project flutter kita agar bisa mengambil gambar dari galeri atau kamera,disini saya menggunakan package image_picker dengan versi ^0.8.4+4, untuk melihat versi terbaru silahkan kunjungi link disini. Project ini sudah mendukung null safety sehingga jika teman-teman ingin ikuti tutorial ini saya sarankan agar upgrade versi flutter anda agar mendukung null safety...
Berikutnya jika langkah di atas sudah dilakukan kita akan memulai membuat design halaman awal dengan tampilan gambar seperti di bawah
untuk code nya seperti ini:
return Scaffold( appBar: AppBar( elevation: 0, leadingWidth: 35, iconTheme: const IconThemeData(color: Colors.white), title: Container( padding: const EdgeInsets.only(top: 10, bottom: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const <Widget>[ Text( "Image Picker", style: TextStyle(color: Colors.white, fontSize: 18), ), ], ), ), actions: [ GestureDetector( onTap: () { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: ((builder) => _ambilGambar()), ); }, child: Container( padding: const EdgeInsets.only(right: 8), child: const Icon(Icons.image_search))) ], ), body: Container( color: const Color(0xFFf2f2f2), child: _image == null ? const Center( child: Icon( Icons.image_aspect_ratio, color: Color(0xFFE0E0E0), size: 100, )) : Image( width: double.infinity, height: double.infinity, image: FileImage(File(_image!.path))), ));
Selanjutnya kita akan membuat tampilan bottom sheet dialog beserta aksi tombol dimana design nya akan menampilkan dua pilihan untuk memilih mengambil gambar dari camera atau galeri
source code untuk Widget tampilan bottom sheet dialog beserta logicnya :
Widget _ambilGambar() { return Container( width: MediaQuery.of(context).size.width, decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(10), topRight: Radius.circular(10)), ), child: Wrap( children: <Widget>[ Container( width: double.infinity, padding: const EdgeInsets.only(top: 10, bottom: 20), child: const Text( "Ambil Gambar", textAlign: TextAlign.center, style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold), ), ), Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( flex: 1, child: GestureDetector( onTap: () { Navigator.pop(context); getImage(ImageSource.camera); }, child: Column( children: [ const Icon( Icons.camera, size: 40, ), Container( margin: const EdgeInsets.only(top: 5), child: const Text("Ambil dari Kamera")) ], ), ), ), Expanded( flex: 1, child: GestureDetector( onTap: () { Navigator.pop(context); getImage(ImageSource.gallery); }, child: Column( children: [ const Icon( Icons.image, size: 40, ), Container( margin: const EdgeInsets.only(top: 5), child: const Text("Ambil dari Galeri")) ], ), ), ), ]), Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 10), margin: const EdgeInsets.only(top: 20), color: Theme.of(context).colorScheme.primary, child: const Text( 'TUTUP', textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold), )) ], ), ); } Future getImage(ImageSource src) async { var image = await _picker.pickImage(source: src); setState(() { _image = image; }); }
import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Image Picker', debugShowCheckedModeBanner: false, theme: ThemeData( primarySwatch: Colors.teal, ), home: const ImagePickerPage(), ); } } class ImagePickerPage extends StatefulWidget { const ImagePickerPage({Key? key}) : super(key: key); @override State<ImagePickerPage> createState() => _ImagePickerPageState(); } class _ImagePickerPageState extends State<ImagePickerPage> { XFile? _image; final ImagePicker _picker = ImagePicker(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0, leadingWidth: 35, iconTheme: const IconThemeData(color: Colors.white), title: Container( padding: const EdgeInsets.only(top: 10, bottom: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const <Widget>[ Text( "Image Picker", style: TextStyle(color: Colors.white, fontSize: 18), ), ], ), ), actions: [ GestureDetector( onTap: () { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: ((builder) => _ambilGambar()), ); }, child: Container( padding: const EdgeInsets.only(right: 8), child: const Icon(Icons.image_search))) ], ), body: Container( color: const Color(0xFFf2f2f2), child: _image == null ? const Center( child: Icon( Icons.image_aspect_ratio, color: Color(0xFFE0E0E0), size: 100, )) : Image( width: double.infinity, height: double.infinity, image: FileImage(File(_image!.path))), )); } Widget _ambilGambar() { return Container( width: MediaQuery.of(context).size.width, decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(10), topRight: Radius.circular(10)), ), child: Wrap( children: <Widget>[ Container( width: double.infinity, padding: const EdgeInsets.only(top: 10, bottom: 20), child: const Text( "Ambil Gambar", textAlign: TextAlign.center, style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold), ), ), Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Expanded( flex: 1, child: GestureDetector( onTap: () { Navigator.pop(context); getImage(ImageSource.camera); }, child: Column( children: [ const Icon( Icons.camera, size: 40, ), Container( margin: const EdgeInsets.only(top: 5), child: const Text("Ambil dari Kamera")) ], ), ), ), Expanded( flex: 1, child: GestureDetector( onTap: () { Navigator.pop(context); getImage(ImageSource.gallery); }, child: Column( children: [ const Icon( Icons.image, size: 40, ), Container( margin: const EdgeInsets.only(top: 5), child: const Text("Ambil dari Galeri")) ], ), ), ), ]), Container( width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 10), margin: const EdgeInsets.only(top: 20), color: Theme.of(context).colorScheme.primary, child: const Text( 'TUTUP', textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold), )) ], ), ); } Future getImage(ImageSource src) async { var image = await _picker.pickImage(source: src); setState(() { _image = image; }); } }
Demo aplikasi silahkan klik disini
Terima kasih!!!!
Source Code Aplikasi Resep masakan menggunakan Flutter
Aplikasi ini memiliki fitur:
1. Daftar resep terbaru
2. Daftar resep per kategori
3. Daftar kategori
4. Pencarian resep
Beberapa tampilan dari aplikasi ini
Demo aplikasi silahkan klik disini
Menampilkan Tombol Flutter Hot Restart di Navigation Bar Toolbar pada Android Studio
Default tampilan actions flutter pada bagian Navigation Bar Toolbar yang ada pada Android Studio tidak ada tombol Flutter Hot Restart namun berada pada bagian bawah di menu Debug seperti gambar dibawah. Dan setelah otak atik Android Studio, saya menemukan cara mengatasi masalah yang saya sebutkan diatas...
Membuat Bottom Navigation Bar dengan Flutter
Selamat siang teman teman hari ini saya akan membagikan tutorial cara membuat Bottom Navigation Bar dengan menggunakan Flutter....
Contoh Bottom Navigation Bar yang akan kita buat seperti gambar di bawah:
- home.dart
- bottom_navigation.dart
Adapun code untuk File home.dart sebagai berikut:
import 'package:bottom_navigation_bar/bottom_navigation.dart'; import 'package:flutter/material.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: const BottomNavigation(title: 'Bottom Navigation Bar'), ); } }
Selanjutnya untuk file bottom_navigation.dart masukkan code dibawah:
import 'package:flutter/material.dart'; class BottomNavigation extends StatefulWidget { const BottomNavigation({Key? key, required this.title}) : super(key: key); final String title; @override State<BottomNavigation> createState() => _BottomNavigationState(); } class _BottomNavigationState extends State<BottomNavigation> { int currentPage = 0; String text = "Home Page"; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Text(text), ), floatingActionButton: FloatingActionButton( onPressed: () => setPage(4, "Add Items"), child: const Icon( Icons.add, color: Colors.white, size: 30, ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, bottomNavigationBar: BottomAppBar( color: Colors.blue, shape: const CircularNotchedRectangle(), child: Container( padding: const EdgeInsets.symmetric(vertical: 5), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconButton( onPressed: () => setPage(0, "Home Page"), icon: Icon( Icons.home, color: currentPage == 0 ? Colors.white : Colors.grey, size: 30, )), IconButton( onPressed: () => setPage(1, "Search Page"), icon: Icon( Icons.search, color: currentPage == 1 ? Colors.white : Colors.grey, size: 30, )), const SizedBox(), IconButton( onPressed: () => setPage(2, "Notifications Page"), icon: Icon( Icons.notifications, color: currentPage == 2 ? Colors.white : Colors.grey, size: 30, )), IconButton( onPressed: () => setPage(3, "History Page"), icon: Icon( Icons.history, color: currentPage == 3 ? Colors.white : Colors.grey, size: 30, )), ], ), ), ), ); } void setPage(int index, String text) { setState(() { currentPage = index; this.text = text; }); } }
Jika cara diatas sudah dilakukan maka selanjutnya jalankan aplikasi, jika tampilan aplikasi sama dengan contoh diatas....SELAMAT anda sudah bisa membuat Bottom Navigation Bar dengan Flutter
Link Youtube