Tugas 9 PPB - B
Nama : Tsabita Putri Ramadhany
NRP : 5025211130
Kelas : PPB - B
Tugas 9
Framework Flutter
Tugas : Menerapkan Framework Flutter
Petunjuk Tugas : https://kuliahppb.blogspot.com/2024/06/framework-flutter-1.html
Flutter adalah SDK aplikasi Mobile dari Google yang digunakan untuk membangun aplikasi native iOS, Android, Desktop (Windows, Linux, macOS), dan Web dari satu source code. Saat membangun aplikasi dengan Flutter, semuanya berkaitan dengan Widgets, yaitu sebuah blok yang digunakan untuk membangun aplikasi Flutter. Widget merupakan elemen struktural yang dilengkapi dengan banyak fungsi khusus untuk material design, dan widget baru dapat digunakan dengan cara menyusun widget yang sudah ada. Proses menggabungkan widget disebut komposisi. Antarmuka pengguna aplikasi terdiri dari banyak widget sederhana yang memiliki tugasnya masing-masing. Itulah sebabnya mengapa pengembang Flutter cenderung memandang aplikasi Flutter mereka sebagai pohon widget.
Flutter adalah framework open source untuk membuat aplikasi mobile berkualitas tinggi dan performa tinggi pada sistem operasi mobile seperti Android dan iOS. Framework ini menyediakan SDK yang sederhana, efisien, dan mudah dipahami untuk membuat aplikasi mobile menggunakan bahasa pemrograman Dart milik Google. Tutorial ini membahas dasar-dasar framework Flutter, proses instalasi SDK Flutter, cara menyiapkan Android Studio untuk mengembangkan aplikasi berbasis Flutter, desain struktur Flutter, serta cara mengembangkan berbagai jenis aplikasi seluler menggunakan framework Flutter.
Karakteristik Flutter
- Dirilis pertama kali pada tahun 2017
- Berdasarkan bahasa pemrograman Dart
- Mengontrol setiap piksel di layar
- Cross-Platform ( Mobile, Web, Desktop )
- Developed by Google
- Kinerja aplikasi lebih tinggi. Flutter dapat menghasilkan animasi dengan kecepatan 60 fps atau 120 fps. Flutter sendiri dapat menggambar dan mengontrol setiap piksel di layar.
- Flutter adalah kerangka kerja yang paling cepat berkembang untuk pengembangan lintas platform. Dukungan komunitas untuk flutter sangat luar biasa, dengan lebih dari 11100 bintang di Github, 15000 fork, dan lebih dari 41000 masalah yang diselesaikan, Flutter memimpin industri ini
Deskripsi Aplikasi
Aplikasi Flutter ini memungkinkan pengguna untuk menghasilkan nama-nama unik secara acak, seperti "newstay", "lightstream", "mainbrake", atau "graypine". Pengguna dapat dengan mudah meminta nama baru, menyimpan nama yang mereka sukai ke dalam daftar favorit, dan meninjau daftar nama favorit mereka dalam tampilan yang responsif yang mendukung berbagai ukuran layar, mulai dari perangkat seluler hingga desktop. Aplikasi ini dirancang dengan navigasi intuitif, sehingga pengguna dapat menikmati pengalaman yang mulus dan interaktif dalam menciptakan dan mengelola nama-nama yang menarik.
Implementasi Aplikasi
Persiapan Proyek Flutter
Membuat Proyek Baru Flutter:
- Saat memulai proyek Flutter baru, gunakan perintah
flutter create nama_proyek
di terminal untuk membuat struktur dasar proyek. Ini akan menciptakan direktori proyek dengan file-file dasar sepertipubspec.yaml
,android/
(atauios/
), danlib/
.
- Saat memulai proyek Flutter baru, gunakan perintah
Mengubah
pubspec.yaml
:- File
pubspec.yaml
adalah file konfigurasi proyek Flutter yang mendefinisikan metadata proyek, dependensi, serta sumber daya seperti font dan gambar. Tambahkan dependensi yang diperlukan sepertienglish_words
danprovider
dengan versi yang sesuai. Setelah menambahkan dependensi, jalankanflutter pub get
di terminal untuk mengunduh dan menginstal paket-paket tersebut ke dalam proyek.
- File
Struktur Proyek dan File Utama
Struktur Proyek:
- Pastikan struktur proyek terorganisir dengan baik. File utama yang perlu ada antara lain
pubspec.yaml
untuk konfigurasi,lib/main.dart
sebagai titik masuk aplikasi, dan folderlib/
untuk menyimpan file-file Dart lainnya.
- Pastikan struktur proyek terorganisir dengan baik. File utama yang perlu ada antara lain
File
lib/main.dart
:- Import Statements: Di dalam file
lib/main.dart
, impor dependensi yang diperlukan sepertienglish_words
,flutter/material.dart
, danprovider
. Ini memungkinkan penggunaan kelas-kelas dan fungsi-fungsi yang didefinisikan dalam paket-paket tersebut di dalam kode aplikasi. - Main Function (
void main()
): Fungsimain()
merupakan titik masuk utama aplikasi Flutter. Di dalamnya, panggilrunApp()
dengan menginstansiasi kelasMyApp
. Ini memulai proses penggambaran UI dan manajemen state aplikasi. - MyApp Class: Kelas
MyApp
adalah widget utama yang menggunakanChangeNotifierProvider
dari paketprovider
untuk manajemen state global. Di sini, tentukan tema aplikasi dan sediakan titik masuk halaman utama (MyHomePage
). - MyAppState Class: Kelas
MyAppState
adalah model state aplikasi yang mengelola data seperti kata acak saat ini dan daftar favorit. GunakanChangeNotifier
dariprovider
untuk memberi tahu perubahan state ke widget-widget yang bergantung pada data ini. - MyHomePage Class: Widget
MyHomePage
adalah halaman utama yang menampilkanNavigationRail
untuk navigasi antara halaman Generator (GeneratorPage
) dan Favorites (FavoritesPage
). Ini memberi pengguna cara untuk beralih di antara fungsi aplikasi dengan mudah.
- Import Statements: Di dalam file
Implementasi Widget Tambahan
GeneratorPage Class:
- Kelas ini mengatur UI untuk menampilkan kata acak dan mengelola interaksi pengguna seperti menandai nama sebagai favorit atau meminta kata berikutnya. Gunakan state dari
MyAppState
untuk mengubah tampilan berdasarkan perubahan data.
- Kelas ini mengatur UI untuk menampilkan kata acak dan mengelola interaksi pengguna seperti menandai nama sebagai favorit atau meminta kata berikutnya. Gunakan state dari
BigCard Class:
- Widget
BigCard
adalah bagian dariGeneratorPage
yang menampilkan kata acak dalam kartu besar dengan gaya yang ditentukan oleh tema aplikasi. Ini membantu menciptakan antarmuka yang menarik dan responsif untuk pengguna.
- Widget
FavoritesPage Class:
- Halaman
FavoritesPage
menampilkan daftar nama yang telah ditandai sebagai favorit dalamListView
. Ini memungkinkan pengguna untuk melihat dan mengelola nama-nama yang disimpan dengan mudah.
- Halaman
Menjalankan Aplikasi
Setup Lingkungan Flutter:
- Pastikan lingkungan pengembangan terinstal dengan Flutter SDK dan terhubung ke emulator atau perangkat fisik yang mendukung pengembangan Flutter.
Menginstal Dependensi:
- Jalankan
flutter pub get
di terminal untuk memastikan semua dependensi yang dibutuhkan telah diunduh dan diinstal dengan benar dalam proyek.
- Jalankan
Menjalankan Aplikasi:
- Gunakan perintah
flutter run
di terminal untuk memulai aplikasi. Ini akan membangun aplikasi Anda dan memulai prosesnya di emulator atau perangkat yang terhubung.
- Gunakan perintah
Uji Aplikasi
Uji Fungsionalitas:
- Setelah aplikasi berjalan, uji fungsionalitasnya dengan menghasilkan nama acak, menandai nama sebagai favorit, dan memverifikasi bahwa daftar favorit berfungsi dengan baik.
Responsivitas UI:
- Pastikan aplikasi responsif terhadap berbagai ukuran layar. Uji pada mode landscape dan portrait untuk memastikan tata letak UI tetap konsisten dan nyaman digunakan.
Pengembangan Lebih Lanjut
Modifikasi dan Peningkatan:
- Sesuaikan aplikasi sesuai kebutuhan dengan menambahkan fitur tambahan atau merancang ulang UI untuk meningkatkan pengalaman pengguna.
Optimasi Kode:
- Selalu periksa dan optimalkan kode untuk meningkatkan performa dan memelihara keterbacaan. Gunakan prinsip-prinsip terbaik dalam pengelolaan state dan pembuatan UI di Flutter untuk menjaga kode tetap bersih dan mudah dikelola.
Dengan mengikuti setiap langkah ini secara teliti, dapat diimplementasikan aplikasi Flutter yang menghasilkan nama acak, memungkinkan pengguna untuk mengelola nama favorit, dan memberikan antarmuka pengguna yang responsif dan interaktif.
Contoh Implementasi
pubspec.yaml
name: namer_app
description: A new Flutter project.
publish_to: 'none'
version: 0.0.1+1
environment:
sdk: '>=2.19.4 <4.0.0'
dependencies:
flutter:
sdk: flutter
english_words: ^4.0.0
provider: ^6.0.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
analysis_option.yaml
include: package:flutter_lints/flutter.yaml
linter:
rules:
prefer_const_constructors: false
prefer_final_fields: false
use_key_in_widget_constructors: false
prefer_const_literals_to_create_immutables: false
prefer_const_constructors_in_immutables: false
avoid_print: false
lib/main.dart
import 'package:english_words/english_words.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (context) => MyAppState(), child: MaterialApp( title: 'Namer App', theme: ThemeData( useMaterial3: true, colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange), ), home: MyHomePage(), ), ); } } class MyAppState extends ChangeNotifier { var current = WordPair.random(); void getNext() { current = WordPair.random(); notifyListeners(); } var favorites = <WordPair>[]; void toggleFavorite() { if (favorites.contains(current)) { favorites.remove(current); } else { favorites.add(current); } notifyListeners(); } } class MyHomePage extends StatefulWidget { @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { var selectedIndex = 0; @override Widget build(BuildContext context) { Widget page; switch (selectedIndex) { case 0: page = GeneratorPage(); break; case 1: page = FavoritesPage(); break; default: throw UnimplementedError('no widget for $selectedIndex'); } return LayoutBuilder( builder: (context, constraints) { return Scaffold( body: Row( children: [ SafeArea( child: NavigationRail( extended: constraints.maxWidth >= 600, destinations: [ NavigationRailDestination( icon: Icon(Icons.home), label: Text('Home'), ), NavigationRailDestination( icon: Icon(Icons.favorite), label: Text('Favorites'), ), ], selectedIndex: selectedIndex, onDestinationSelected: (value) { setState(() { selectedIndex = value; }); }, ), ), Expanded( child: Container( color: Theme.of(context).colorScheme.primaryContainer, child: page, ), ), ], ), ); } ); } } class GeneratorPage extends StatelessWidget { @override Widget build(BuildContext context) { var appState = context.watch<MyAppState>(); var pair = appState.current; IconData icon; if (appState.favorites.contains(pair)) { icon = Icons.favorite; } else { icon = Icons.favorite_border; } return Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ BigCard(pair: pair), SizedBox(height: 10), Row( mainAxisSize: MainAxisSize.min, children: [ ElevatedButton.icon( onPressed: () { appState.toggleFavorite(); }, icon: Icon(icon), label: Text('Like'), ), SizedBox(width: 10), ElevatedButton( onPressed: () { appState.getNext(); }, child: Text('Next'), ), ], ), ], ), ); } } class BigCard extends StatelessWidget { const BigCard({ super.key, required this.pair, }); final WordPair pair; @override Widget build(BuildContext context) { final theme = Theme.of(context); final style = theme.textTheme.displayMedium!.copyWith( color: theme.colorScheme.onPrimary, ); return Card( color: theme.colorScheme.primary, child: Padding( padding: const EdgeInsets.all(20.0), child: Text( pair.asLowerCase, style: style, semanticsLabel: "${pair.first} ${pair.second}", ), ), ); } } class FavoritesPage extends StatelessWidget { @override Widget build(BuildContext context) { var appState = context.watch<MyAppState>(); if (appState.favorites.isEmpty) { return Center( child: Text('No favorites yet.'), ); } return ListView( children: [ Padding( padding: const EdgeInsets.all(20), child: Text('You have ' '${appState.favorites.length} favorites:'), ), for (var pair in appState.favorites) ListTile( leading: Icon(Icons.favorite), title: Text(pair.asLowerCase), ), ], ); } }
Hasil Implementasi
Setelah semua langkah diikuti dan kode diimplementasikan dengan benar, hasil akhirnya adalah sebuah aplikasi Flutter yang memungkinkan pengguna untuk menghasilkan nama acak, menyimpan nama favorit, dan meninjau daftar favorit mereka dengan antarmuka yang responsif dan intuitif. Aplikasi ini dapat dijalankan di berbagai perangkat dengan berbagai ukuran layar, memastikan pengalaman pengguna yang konsisten dan menyenangkan.
Komentar
Posting Komentar