{"id":169,"date":"2025-10-22T02:12:22","date_gmt":"2025-10-22T02:12:22","guid":{"rendered":"https:\/\/nia.infokand23.my.id\/blog\/?p=169"},"modified":"2025-10-22T02:17:55","modified_gmt":"2025-10-22T02:17:55","slug":"pratikum-4","status":"publish","type":"post","link":"https:\/\/nia.infokand23.my.id\/blog\/pratikum-4\/","title":{"rendered":"Pratikum 4"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>Pendahuluan<\/strong><\/h2>\n\n\n\n<p>Perkembangan teknologi mobile saat ini sangat pesat, terutama dengan adanya framework <strong>Flutter<\/strong> yang memungkinkan pengembangan aplikasi lintas platform dengan efisiensi tinggi. Dalam pembuatan aplikasi, salah satu aspek penting yang harus diperhatikan adalah <strong>navigasi antar halaman (screen)<\/strong> dan <strong>pengelolaan data antar halaman<\/strong>. Navigasi yang baik memberikan pengalaman pengguna (<em>user experience<\/em>) yang lebih interaktif dan mudah dipahami.<\/p>\n\n\n\n<p>Praktikum ini bertujuan untuk mempelajari konsep <strong>Navigation dan Routing<\/strong> pada Flutter, yaitu cara berpindah dari satu halaman ke halaman lain serta cara mengirim dan menerima data antar halaman. Melalui kegiatan ini, mahasiswa diharapkan mampu memahami penggunaan <strong>Navigator<\/strong>, <strong>Named Routes<\/strong>, serta implementasi berbagai jenis routing yang sering digunakan dalam pengembangan aplikasi Flutter modern. Selain itu, praktikum juga mencakup pembuatan halaman <strong>Login<\/strong> dan <strong>Home<\/strong>, yang menjadi dasar dari hampir semua aplikasi mobile.<\/p>\n\n\n\n<p>Dengan memahami konsep ini, pengembang aplikasi dapat membangun struktur aplikasi yang terorganisir, mudah dikelola, dan memiliki alur navigasi yang jelas antara berbagai fitur di dalam aplikasi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Langkah Pengerjaan<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1.Multiple Screen<\/strong><\/h4>\n\n\n\n<p>import &#8216;package:flutter\/material.dart&#8217;;<\/p>\n\n\n\n<p>void main() =&gt; runApp(const MyNav());<\/p>\n\n\n\n<p>class MyNav extends StatelessWidget {<br>const MyNav({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return MaterialApp(<br>initialRoute: &#8216;\/&#8217;,<br>routes: {<br>&#8216;\/&#8217;: (context) =&gt; const Product(),<br>&#8216;\/product_detail&#8217;: (context) =&gt; const ProductDetail(),<br>},<br>);<br>}<br>}<\/p>\n\n\n\n<p>class Product extends StatelessWidget {<br>const Product({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return Scaffold(<br>appBar: AppBar(title: const Text(&#8216;Product&#8217;)),<br>body: Center(<br>child: ElevatedButton(<br>onPressed: () {<br>Navigator.pushNamed(context, &#8216;\/product_detail&#8217;);<br>},<br>child: const Text(&#8216;Go to Product Detail&#8217;),<br>),<br>),<br>);<br>}<br>}<\/p>\n\n\n\n<p>class ProductDetail extends StatelessWidget {<br>const ProductDetail({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return Scaffold(<br>appBar: AppBar(title: const Text(&#8216;Product Detail&#8217;)),<br>body: Center(<br>child: ElevatedButton(<br>onPressed: () {<br>Navigator.pop(context);<br>},<br>child: const Text(&#8216;Back to Product&#8217;),<br>),<br>),<br>);<br>}<br>}<\/p>\n\n\n\n<p>2.Mengirim dan Menerima Data antar Halaman<\/p>\n\n\n\n<p>import &#8216;package:flutter\/material.dart&#8217;;<\/p>\n\n\n\n<p>void main() =&gt; runApp(MyNav());<\/p>\n\n\n\n<p>class MyNav extends StatelessWidget {<br>const MyNav({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return MaterialApp(<br>initialRoute: &#8216;\/&#8217;,<br>routes: {<br>&#8216;\/&#8217;: (context) =&gt; const HomePage(),<br>&#8216;\/product&#8217;: (context) =&gt; const MyProduct(),<br>},<br>);<br>}<br>}<\/p>\n\n\n\n<p>class HomePage extends StatelessWidget {<br>const HomePage({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return Scaffold(<br>appBar: AppBar(title: const Text(&#8216;Home Page&#8217;)),<br>body: Center(<br>child: Row(<br>children: [<br>ElevatedButton(<br>onPressed: () {<br>Navigator.push(<br>context,<br>MaterialPageRoute(<br>builder: (context) =&gt; const MyProfile(id: 01, name: &#8216;Kaela&#8217;),<br>),<br>);<br>},<br>child: const Text(&#8216;Profile&#8217;),<br>),<br>ElevatedButton(<br>onPressed: () {<br>Navigator.pushNamed(<br>context,<br>&#8216;\/product&#8217;,<br>arguments: {&#8216;id&#8217;: 1, &#8216;name&#8217;: &#8216;Hp&#8217;},<br>);<br>},<br>child: const Text(&#8216;Product&#8217;),<br>),<br>],<br>),<br>),<br>);<br>}<br>}<\/p>\n\n\n\n<p>class MyProfile extends StatelessWidget {<br>final int id;<br>final String name;<br>const MyProfile({super.key, required this.id, required this.name});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return Scaffold(<br>appBar: AppBar(title: const Text(&#8216;Profile&#8217;)),<br>body: Center(<br>child: Column(<br>mainAxisAlignment: MainAxisAlignment.center,<br>children: [<br>Text(&#8216;ID: $id&#8217;),<br>Text(&#8216;Name: $name&#8217;),<br>],<br>),<br>),<br>);<br>}<br>}<\/p>\n\n\n\n<p>class MyProduct extends StatelessWidget {<br>const MyProduct({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>final args = ModalRoute.of(context)!.settings.arguments as Map?;<br>final int id = args?[&#8216;id&#8217;] ?? 0;<br>final String name = args?[&#8216;name&#8217;] ?? &#8216;Unknown&#8217;;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>return Scaffold(\n  appBar: AppBar(title: const Text('Product')),\n  body: Center(\n    child: Column(\n      mainAxisAlignment: MainAxisAlignment.center,\n      children: &#91;\n        Text('Product ID: $id'),\n        Text('Product Name: $name'),\n      ],\n    ),\n  ),\n);<\/code><\/pre>\n\n\n\n<p>}<br>}<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Tugas:<\/strong><\/h3>\n\n\n\n<p><strong>Buat halaman login dan halaman utama.<\/strong><br>Ketika login diklik, halaman berpindah ke <strong>HomePage<\/strong> dengan mengirimkan <strong>username<\/strong> dan <strong>password<\/strong>, lalu ditampilkan di halaman utama.<\/p>\n\n\n\n<p>import &#8216;package:flutter\/material.dart&#8217;;<\/p>\n\n\n\n<p>void main() {<br>runApp(const MyApp());<br>}<\/p>\n\n\n\n<p>class MyApp extends StatelessWidget {<br>const MyApp({super.key});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return MaterialApp(<br>debugShowCheckedModeBanner: false,<br>title: &#8216;Navigation Demo&#8217;,<br>home: const LoginPage(),<br>);<br>}<br>}<\/p>\n\n\n\n<p>class LoginPage extends StatefulWidget {<br>const LoginPage({super.key});<\/p>\n\n\n\n<p>@override<br>State createState() =&gt; _LoginPageState();<br>}<\/p>\n\n\n\n<p>class _LoginPageState extends State {<br>final TextEditingController usernameController = TextEditingController();<br>final TextEditingController passwordController = TextEditingController();<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return Scaffold(<br>appBar: AppBar(title: const Text(&#8220;Login Page&#8221;)),<br>body: Padding(<br>padding: const EdgeInsets.all(20),<br>child: Column(<br>mainAxisAlignment: MainAxisAlignment.center,<br>children: [<br>TextField(<br>controller: usernameController,<br>decoration: const InputDecoration(labelText: &#8220;Username&#8221;),<br>),<br>TextField(<br>controller: passwordController,<br>obscureText: true,<br>decoration: const InputDecoration(labelText: &#8220;Password&#8221;),<br>),<br>const SizedBox(height: 20),<br>ElevatedButton(<br>onPressed: () {<br>String username = usernameController.text;<br>String password = passwordController.text;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>            Navigator.push(\n              context,\n              MaterialPageRoute(\n                builder: (context) =&gt;\n                    HomePage(username: username, password: password),\n              ),\n            );\n          },\n          child: const Text(\"Login\"),\n        )\n      ],\n    ),\n  ),\n);<\/code><\/pre>\n\n\n\n<p>}<br>}<\/p>\n\n\n\n<p>class HomePage extends StatelessWidget {<br>final String username;<br>final String password;<\/p>\n\n\n\n<p>const HomePage({super.key, required this.username, required this.password});<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return DefaultTabController(<br>length: 3,<br>child: Scaffold(<br>appBar: AppBar(<br>title: const Text(&#8220;Home Page&#8221;),<br>bottom: const TabBar(<br>tabs: [<br>Tab(icon: Icon(Icons.home), text: &#8220;Tab 1&#8221;),<br>Tab(icon: Icon(Icons.star), text: &#8220;Tab 2&#8221;),<br>Tab(icon: Icon(Icons.person), text: &#8220;Tab 3&#8221;),<br>],<br>),<br>),<br>drawer: Drawer(<br>child: ListView(<br>children: [<br>DrawerHeader(<br>decoration: const BoxDecoration(color: Colors.blue),<br>child: Text(&#8220;Hello, $username&#8221;,<br>style: const TextStyle(color: Colors.white, fontSize: 20)),<br>),<br>ListTile(<br>leading: const Icon(Icons.info),<br>title: const Text(&#8220;User Info&#8221;),<br>onTap: () {<br>Navigator.pop(context);<br>ScaffoldMessenger.of(context).showSnackBar(<br>SnackBar(content: Text(&#8220;Password: $password&#8221;)),<br>);<br>},<br>),<br>ListTile(<br>leading: const Icon(Icons.exit_to_app),<br>title: const Text(&#8220;Logout&#8221;),<br>onTap: () {<br>Navigator.pop(context);<br>Navigator.pop(context);<br>},<br>),<br>],<br>),<br>),<br>body: TabBarView(<br>children: [<br>Center(<br>child: Column(<br>mainAxisAlignment: MainAxisAlignment.center,<br>children: [<br>Text(&#8220;Welcome, $username!&#8221;,<br>style: const TextStyle(fontSize: 22)),<br>const SizedBox(height: 10),<br>Text(&#8220;Password: $password&#8221;,<br>style: const TextStyle(fontSize: 18)),<br>],<br>),<br>),<br>const Center(child: Text(&#8220;This is Tab 2&#8221;)),<br>const Center(child: Text(&#8220;This is Tab 3&#8221;)),<br>],<br>),<br>bottomNavigationBar: const MyBottomNav(),<br>),<br>);<br>}<br>}<\/p>\n\n\n\n<p>class MyBottomNav extends StatefulWidget {<br>const MyBottomNav({super.key});<\/p>\n\n\n\n<p>@override<br>State createState() =&gt; _MyBottomNavState();<br>}<\/p>\n\n\n\n<p>class _MyBottomNavState extends State {<br>int _selectedIndex = 0;<\/p>\n\n\n\n<p>final List _pages = [&#8220;\ud83c\udfe0 Home&#8221;, &#8220;\u2b50 Favorite&#8221;, &#8220;\u2699\ufe0f Settings&#8221;];<\/p>\n\n\n\n<p>@override<br>Widget build(BuildContext context) {<br>return BottomNavigationBar(<br>currentIndex: _selectedIndex,<br>onTap: (index) {<br>setState(() {<br>_selectedIndex = index;<br>ScaffoldMessenger.of(context).showSnackBar(<br>SnackBar(content: Text(&#8220;You selected: ${_pages[index]}&#8221;)),<br>);<br>});<br>},<br>items: const [<br>BottomNavigationBarItem(icon: Icon(Icons.home), label: &#8220;Home&#8221;),<br>BottomNavigationBarItem(icon: Icon(Icons.star), label: &#8220;Favorite&#8221;),<br>BottomNavigationBarItem(icon: Icon(Icons.settings), label: &#8220;Settings&#8221;),<br>],<br>);<br>}<br>}<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kesimpulan<\/strong><\/h2>\n\n\n\n<p>Berdasarkan hasil praktikum yang telah dilakukan, dapat disimpulkan bahwa <strong>Navigation dan Routing<\/strong> merupakan komponen fundamental dalam pengembangan aplikasi Flutter. Melalui penerapan <em>multiple screen<\/em>, aplikasi dapat berpindah antar halaman dengan lancar, baik menggunakan metode <strong>Navigator push\/pop<\/strong> maupun <strong>Named Routes<\/strong>.<\/p>\n\n\n\n<p>Selain itu, proses <strong>pengiriman dan penerimaan data antar halaman<\/strong> berhasil diimplementasikan menggunakan konstruktor dan argumen pada named routes. Tugas tambahan berupa pembuatan <strong>halaman Login dan Home<\/strong> juga memperlihatkan bagaimana data dari pengguna dapat ditransfer dan ditampilkan kembali di halaman lain menggunakan <em>stateful widget<\/em> dan <em>navigator<\/em>.<\/p>\n\n\n\n<p>Dengan demikian, praktikum ini memberikan pemahaman menyeluruh tentang bagaimana sistem navigasi bekerja dalam Flutter serta bagaimana mengatur alur perpindahan data antar halaman, yang menjadi dasar penting dalam pengembangan aplikasi mobile berskala besar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pendahuluan Perkembangan teknologi mobile saat ini sangat pesat, terutama dengan adanya framework Flutter yang memungkinkan pengembangan aplikasi lintas platform dengan efisiensi tinggi. Dalam pembuatan aplikasi, salah satu aspek penting yang harus diperhatikan adalah navigasi antar halaman (screen) dan pengelolaan data antar halaman. Navigasi yang baik memberikan pengalaman pengguna (user experience) yang lebih interaktif dan mudah [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-169","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/posts\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":2,"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":172,"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/posts\/169\/revisions\/172"}],"wp:attachment":[{"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nia.infokand23.my.id\/blog\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}