Showing posts with label Flutter. Show all posts
Showing posts with label Flutter. Show all posts

Tuesday, February 1, 2022

Flutter Bottom Navigation Bar Cupertino APP





import 'package:flutter/cupertino.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return CupertinoApp(
      debugShowCheckedModeBanner: false,
      title: 'PPS IAI AL-QOLAM',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  void _show(BuildContext ctx, {String judul = "pilihan"}) {
    showCupertinoModalPopup(
        context: ctx,
        builder: (_) => CupertinoActionSheet(
              title: customText("Menu $judul"),
              message: Text('Silahkan pilih menu $judul dibawah ini!'),
              actions: [
                CupertinoActionSheetAction(
                    onPressed: () {
                      _close(ctx);
                      _showSub(ctx,judul: "sub pertama");
                    },
                    child: const Text('Pilihan 1')),
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Pilihan 2')),
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Pilihan 3')),
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Pilihan 4')),
              ],
              cancelButton: CupertinoActionSheetAction(
                onPressed: () => _close(ctx),
                child: const Text('Tutup'),
              ),
            ));
  }

  void _showSub(BuildContext ctx, {String judul = "pilihan"}) {
    showCupertinoModalPopup(
        context: ctx,
        builder: (_) => CupertinoActionSheet(
              title: customText("Menu $judul"),
              message: Text('Silahkan pilih menu $judul dibawah ini!'),
              actions: [
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Option #1')),
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Option #2')),
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Option #3')),
                CupertinoActionSheetAction(
                    onPressed: () {}, child: const Text('Option #4')),
              ],
              cancelButton: CupertinoActionSheetAction(
                onPressed: () => _close(ctx),
                child: const Text('Tutup'),
              ),
            ));
  }

  void _close(BuildContext ctx) {
    Navigator.of(ctx).pop();
  }

  @override
  Widget build(BuildContext context) {
    return CupertinoTabScaffold(
        tabBar: CupertinoTabBar(
          backgroundColor: CupertinoColors.darkBackgroundGray,
          activeColor: CupertinoColors.activeBlue,
          inactiveColor: CupertinoColors.activeBlue,
          items: [
            BottomNavigationBarItem(
              icon: CupertinoButton(
                  child: customText("Home", isbool: false, ukuran: 16),
                  onPressed: () {
                    print("home");
                  }),
            ),
            BottomNavigationBarItem(
              icon: CupertinoButton(
                child: customText("Dosen", isbool: false, ukuran: 16),
                onPressed: () => _show(context, judul: "dosen"),
              ),
            ),
          ],
        ),
        tabBuilder: (context, index) {
          return CupertinoPageScaffold(
              backgroundColor: CupertinoColors.lightBackgroundGray,
              navigationBar: const CupertinoNavigationBar(
                brightness: Brightness.light,
                middle: Text('PPS IAI AL-QOLAM'),
              ),
              child: Center(
                child: Column(
                  children: [
                    CupertinoButton(
                      child: const Text('Open Action Sheet'),
                      onPressed: () => _show(context),
                    ),
                  ],
                ),
              ));
        });
  }

  Widget customText(String kata,
      {bool isbool = true,
      double ukuran = 18,
      Color? warna = CupertinoColors.darkBackgroundGray}) {
    return Text(kata,
        style: TextStyle(
            color: warna != null ? CupertinoColors.lightBackgroundGray : warna,
            fontWeight: isbool ? FontWeight.bold : FontWeight.w100,
            fontSize: ukuran));
  }
}

Flutter Custom Bottom Navigation Bar With Popup

 





import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blueGrey,
      ),
      debugShowCheckedModeBanner: false,
      home: AplikasiNavBar(),
    );
  }
}

class AplikasiNavBar extends StatefulWidget {
  @override
  _AplikasiNavBarState createState() => _AplikasiNavBarState();
}

class _AplikasiNavBarState extends State<AplikasiNavBar> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text("Bottom Navigasi"),
        ),
        body: const Center(
          child: Text("Tab Index yang aktif", style: TextStyle(fontSize: 16)),
        ),
        bottomNavigationBar: BottomAppBar(
            child: Container(
          height: 50,
          margin: const EdgeInsets.only(left: 20.0, right: 20.0),
          child: Row(
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              TextButton(
                onPressed: () {
                  print("home");
                },
                child: customText("home"),
              ),
              PopupMenuButton(
                child:  customText("dosen"),
                onSelected: (value) {
                  print(value);
                },
                itemBuilder: (context) => [
                  const PopupMenuItem(
                    child: Text("youtube"),
                    value: "yutub",
                  ),
                  const PopupMenuItem(
                    child: Text("blogger"),
                    value: "blogger",
                  ),
                ],
              ),
              TextButton(
                onPressed: () {
                  print("mahasiswa");
                },
                child: customText("mahasiswa"),
              ),
              PopupMenuButton(
                child: customText("lain-lain"),
                onSelected: (value) {
                  print(value);
                },
                itemBuilder: (context) => [
                  const PopupMenuItem(
                    child: ListTile(title:Text("bing"), leading: Icon(Icons.vibration )),
                    value: "bing",
                  ),
                  PopupMenuItem(
                    child: PopupMenuButton(
                      child:  const ListTile(title:Text("lainnya"), leading: Icon(Icons.account_box_outlined)),
                      onSelected: (value) {
                        print(value);
                      },
                      itemBuilder: (context) => [
                        const PopupMenuItem(
                          child:  ListTile(title:Text("yutub"), leading: Icon(Icons.video_library_outlined)),
                          value: "yutub",
                        ),
                        const PopupMenuItem(
                          child: Text("blogger"),
                          value: "blogger",
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ],
          ),
        )));
  }

  Widget customText(String kata,{bool isbool=true,double ukuran=18,Color? warna=Colors.teal}) {
    return Text(kata,
        style: TextStyle(
            color: warna!=null? Theme.of(context).primaryColor:warna,
            fontWeight: isbool? FontWeight.bold : FontWeight.normal,
            fontSize: ukuran));
  }
}

Thursday, July 15, 2021

FLUTTER APP DRAWER THEME | DYNAMIC & STATIC LISTTILE

kali ini abang akan membagikan skrip membuat thema warna app drawer otomatis, berikut ini penampakannya


cara ganti warnanya seperti gambar berikut ini;


berikut ini skripnya:

import 'package:flutter/material.dart';

class ItemDrawer {
  String title;
  IconData icon;
  bool enable;
  Widget tampilan;
  ItemDrawer(this.title, this.icon, this.enable, this.tampilan);
}

void main() {
  runApp(MaterialApp(
    title: "Navigation Drawer",
    debugShowCheckedModeBanner: false,
    theme: new ThemeData(
      primarySwatch: Colors.red,
    ),
    home: Dashboard(),
  ));
}

class Dashboard extends StatefulWidget {
  final drawerItems = [
    new ItemDrawer("Dashboard"Icons.rss_feed, trueText('hallow')),
    new ItemDrawer("Pesan"Icons.add, trueText('tambah')),
    new ItemDrawer("Contoh"Icons.list, falseText('daftar')),
    new ItemDrawer("Datanya"Icons.list, trueText('daftar')),
  ];

  @override
  DashboardState createState() {
    return DashboardState();
  }
}

class DashboardState extends State<Dashboard> {
  int _selectedDrawerIndex = 0;
  _getDrawerItemWidget(int pos) {
    return Center(child: widget.drawerItems[pos].tampilan);
  }

  _onSelectItem(int index) {
    setState(() => _selectedDrawerIndex = index);
    Navigator.of(context).pop();
  }

  @override
  Widget build(BuildContext context) {
    var drawerOptions = <Widget>[];
    for (var i = 0; i < widget.drawerItems.length; i++) {
      var d = widget.drawerItems[i];
      drawerOptions.add(customListile(
          judul: d.title,
          ikon: d.icon,
          indexMenu: i,
          aktif: d.enable,
          aksi: () => _onSelectItem(i)));
    }

    drawerOptions.add(customListile(
        judul: 'Tutup',
        ikon: Icons.close,
        aktif: true,
        aksi: () {
          Navigator.of(context).pop();
        }));

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.drawerItems[_selectedDrawerIndex].title),
      ),
      drawer: new Drawer(
        child: new Column(
          children: <Widget>[
            Container(
                alignment: Alignment.centerLeft,
                height: 100,
                color: Theme.of(context).primaryColor,
                child: ListTile(
                  leading: SizedBox(
                      height: 50.0,
                      width: 50.0,
                      child: CircleAvatar(
                        radius: 40,
                        backgroundColor: Theme.of(context).primaryColorLight,
                        child: const CircleAvatar(
                          radius: 20,
                          child: FlutterLogo(), //gambar app
                        ),
                      )),
                  title: Text(
                    'Aplikasi keren',
                    style: TextStyle(
                        color: Theme.of(context).cardColor,
                        fontSize: 20,
                        fontWeight: FontWeight.w900),
                  ),
                  subtitle: Text('Buatan indonesia',
                      style: const TextStyle(
                          color: Colors.white,
                          fontSize: 12,
                          fontWeight: FontWeight.w100)),
                )),
            new Padding(
              padding: EdgeInsets.fromLTRB(102000),
              child: Column(children: drawerOptions),
            )
          ],
        ),
      ),
      body: _getDrawerItemWidget(_selectedDrawerIndex),
    );
  }

  Widget customListile(
      {String? judul,
      IconData? ikon,
      bool aktif = true,
      int? indexMenu,
      GestureTapCallback? aksi}) {
    return ListTile(
        visualDensity: VisualDensity(horizontal: -1, vertical: -1),
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.only(
                topLeft: Radius.circular(32), bottomLeft: Radius.circular(32))),
        contentPadding: EdgeInsets.fromLTRB(5000),
        selectedTileColor: Theme.of(context).primaryColorLight,
        leading: CircleAvatar(
          backgroundColor: Theme.of(context).primaryColor,
          child: CircleAvatar(
            backgroundColor: Colors.white,
            radius: 30,
            child: Icon(
              ikon!,
              color: Theme.of(context).primaryColorDark,
            ),
          ),
        ),
        title: new Text(judul!),
        enabled: aktif,
        selected: indexMenu != null ? indexMenu == _selectedDrawerIndex : false,
        onTap: aksi);
  }
}









Wednesday, July 14, 2021

MEMBUAT WIDGET SEARCHBLE LISTVIEW | FLUTTER

kali ini abang akan memberikan script membuat widget listview yang langsung bisa di filter menggunakan fitur ValueListenableBuilder, berikut ini penampakannya:




berikut ini scriptnya:

Widget searchableUsersWidget() {
  List<Mapusers = [
    {'name''James''tel''9010'},
    {'name''Michael''tel''9011'},
    {'name''Jane''tel''9013'},
  ];
  ValueNotifier<List<Map>> filtered = ValueNotifier<List<Map>>([]);
  TextEditingController searchController = TextEditingController();
  FocusNode searchFocus = FocusNode();
  bool searching = false;
  return ValueListenableBuilder<List>(
      valueListenablefiltered,
      builder: (contextvalue_) {
        return Container(
          marginconst EdgeInsets.only(top10),
          decorationBoxDecoration(
            borderRadiusconst BorderRadius.only(
                topLeftRadius.circular(20), topRightRadius.circular(20)),
            boxShadow: [
              BoxShadow(
                colorColors.white.withOpacity(0.5),
                spreadRadius4,
                blurRadius6,
                offsetconst Offset(03), // changes position of shadow
              ),
            ],
          ),
          childColumn(
            children: [
              Container(
                marginconst EdgeInsets.all(8),
                childCard(
                  childListTile(
                    leadingconst Icon(Icons.search),
                    titleTextField(
                      controllersearchController,
                      decorationconst InputDecoration(
                          hintText'Search'borderInputBorder.none),
                      onChanged: (text) {
                        if (text.isNotEmpty) {
                          searching = true;
                          filtered.value = [];
                          for (var user in users) {
                            if (user['name']
                                    .toString()
                                    .toLowerCase()
                                    .contains(text.toLowerCase()) ||
                                user['tel'].toString().contains(text)) {
                              filtered.value.add(user);
                            }
                          }
                        } else {
                          searching = false;
                          filtered.value = [];
                        }
                      },
                    ),
                    trailingIconButton(
                      iconconst Icon(Icons.cancel),
                      onPressed: () {
                        searchController.clear();
                        searching = false;
                        filtered.value = [];
                        if (searchFocus.hasFocussearchFocus.unfocus();
                      },
                    ),
                  ),
                ),
              ),
              Expanded(
                childListView.builder(
                    itemCountsearching ? filtered.value.length : users.length,
                    itemBuilder: (contextindex) {
                      final item =
                          searching ? filtered.value[index] : users[index];
                      return ListTile(
                        titleText(item['name']),
                        subtitleText(item['tel']),
                        onTap: () {},
                      );
                    }),
              ),
            ],
          ),
        );
      });
}

Saturday, July 10, 2021

MEMBUAT HALAMAN TAMPIL DETAIL | FLUTTER

kali ini abang akan memberikan scrip halaman master detail di bahasa pemrograman flutter, langsung saja, berikut ini tampilannya

ini script nya:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Keykey}) : super(keykey);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title'Flutter Demo',
      debugShowCheckedModeBannerfalse,
      themeThemeData(
        primarySwatchColors.teal,
      ),
      homeconst Neraca(),
    );
  }
}

class Neraca extends StatelessWidget {
  final String datanya = 'DATA INI DARI VARIABLE';

  const Neraca({Keykey}) : super(keykey);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBarAppBar(
          titleconst Text("Halaman Detail"),
        ),
        bodyCenter(
          childColumn(
            mainAxisAlignmentMainAxisAlignment.center,
            children: <Widget>[
              Text(datanya.toString()),
              const Text(
                  'Halaman informasi data static tanpa State, data variable\nTekan tombol dibawah untuk informasi detail data'),
              IconButton(
                  onPressed: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => DetailPage(
                                kirimDatadatanya,
                              )),
                    );
                  },
                  iconconst Icon(Icons.arrow_circle_up))
            ],
          ),
        ));
  }
}

class DetailPage extends StatelessWidget {
  const DetailPage({Keykeyrequired this.kirimData}) : super(keykey);

  final String kirimData;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBarAppBar(
          titleconst Text("Halaman Detail"),
        ),
        bodyCenter(
            childColumn(
                mainAxisAlignmentMainAxisAlignment.center,
                children: <Widget>[
              Text('data yang dikirim adalah : \n' + kirimData),
              ElevatedButton(
                onPressed: () {
                  Navigator.pop(context);
                },
                childconst Text('Go back!'),
              ),
            ])));
  }
}

Thursday, July 8, 2021

FLUTTER | APP DRAWER DYNAMIC NAVIGATION

kali ini abang akan membagikan skrip membuat app drawer secara dinamis, langsung saja berikut ini tampilan gambarnya




ini skripnya


import 'package:flutter/material.dart';

class DrawerItem {
  String title;
  IconData icon;
  bool enable;
  Widget conten;
  DrawerItem(this.titlethis.iconthis.enablethis.conten);
}

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

class MyApp extends StatelessWidget {
  const MyApp({Keykey}) : super(keykey);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title'Flutter Demo',
      debugShowCheckedModeBannerfalse,
      themeThemeData(
        primarySwatchColors.teal,
      ),
      homeHomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  final List<DrawerItemdrawerItems = [];

  HomePage({Keykey}) : super(keykey);

  @override
  State<StatefulWidgetcreateState() {
    return HomePageState();
  }
}

class HomePageState extends State<HomePage> {
  int _selectedDrawerIndex = 0;

  _getDrawerItemWidget(int pos) {
    return widget.drawerItems[pos].conten;
  }

  _onSelectItem(int index) {
    setState(() => _selectedDrawerIndex = index);
    Navigator.of(context).pop();
  }

  _rebuildMenu(bool mode) {
    widget.drawerItems.clear();
    widget.drawerItems.add(DrawerItem(
        "Dashboard",
        Icons.dashboard_rounded,
        true,
        const Center(
          childText('Selamat Datang'),
        )));
    widget.drawerItems.add(DrawerItem(
        "List",
        Icons.list_alt_rounded,
        true,
        const Center(
          childCard(
            childText('data'),
          ),
        )));
    widget.drawerItems.add(DrawerItem(
        "Disable",
        Icons.disabled_by_default,
        false,
        const Center(
          childCard(
            childnull,
          ),
        )));
    widget.drawerItems.add(DrawerItem(
        "Berita",
        Icons.radio,
        true,
        const Center(
          childCard(
            childText('Berita'),
          ),
        )));
    widget.drawerItems.add(DrawerItem(
        "Pesan",
        Icons.message,
        true,
        Center(
          childCard(
            childElevatedButton(
              onPressed: () => _pesan(
                  title'Konfirmasi',
                  subtitle'Apakah anda akan kembali ke halaman utama?',
                  iconIcons.access_alarm_outlined,
                  kliknull),
              childconst Text('Pop Up'),
            ),
          ),
        )));
  }

  void _pesan(
      {Stringtitle,
      Stringsubtitle,
      IconDataicon,
      GestureDetectorklik}) {
    showDialog(
      contextcontext,
      builder: (context) => AlertDialog(
        contentSizedBox(
            height170,
            width70,
            childColumn(
              children: <Widget>[
                Icon(
                  icon,
                  size50,
                ),
                const Padding(paddingEdgeInsets.all(5)),
                const Divider(colorColors.black),
                Text(
                  title.toString(),
                  textAlignTextAlign.justify,
                  styleconst TextStyle(
                    fontSize20,
                    fontWeightFontWeight.bold,
                  ),
                ),
                const Divider(colorColors.black),
                const Padding(paddingEdgeInsets.all(5)),
                Text(
                  subtitle.toString(),
                  textAlignTextAlign.justify,
                  styleconst TextStyle(
                    fontSize12,
                    fontWeightFontWeight.bold,
                  ),
                )
              ],
            )),
        actions: <Widget>[
          ElevatedButton.icon(
            iconconst Icon(Icons.check_circle_rounded),
            labelconst Text('Ok'),
            styleButtonStyle(
              backgroundColorMaterialStateProperty.all<Color>(Colors.green),
            ),
            onPressed: () {
              Navigator.of(context).pop();
              klik;
            },
          ),
          ElevatedButton.icon(
            iconconst Icon(Icons.highlight_off_outlined),
            labelconst Text('Batal'),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      ),
    );
  }

  Widget _appBar(String judulString subJudul) {
    String isiJudul = judul.toString();
    String isiSubJudul = subJudul.toString();
    //Image isiGambar = FlutterLogo();
    return Container(
        alignmentAlignment.centerLeft,
        height100,
        colorTheme.of(context).primaryColor,
        childListTile(
          leadingSizedBox(
              height50.0,
              width50.0,
              childCircleAvatar(
                radius40,
                backgroundColorTheme.of(context).primaryColorLight,
                childconst CircleAvatar(
                  radius20,
                  childFlutterLogo(), //gambar app
                ),
              )),
          titleText(
            isiJudul.toString(),
            styleTextStyle(
                colorTheme.of(context).cardColor,
                fontSize20,
                fontWeightFontWeight.w900),
          ),
          subtitleText(isiSubJudul.toString(),
              styleconst TextStyle(
                  colorColors.white,
                  fontSize12,
                  fontWeightFontWeight.w100)),
        ));
  }

  List<WidgetcreateMenu() {
    List<WidgetdrawerOptions = [];
    bool isSelected = false;

    for (var i = 0i < widget.drawerItems.lengthi++) {
      var d = widget.drawerItems[i];
      if (_selectedDrawerIndex == i) {
        isSelected = true;
      } else {
        isSelected = false;
      }
      drawerOptions.add(daftarMenu(
          juduld.title,
          ikond.icon,
          terpilihisSelected,
          enabled.enable,
          fungsi: () => _onSelectItem(i)));
    }

    return drawerOptions;
  }

  Widget daftarMenu(
      {Stringjudul,
      bool enable = false,
      IconDataikon,
      GestureTapCallbackfungsi,
      bool terpilih = false}) {
    return Ink(
        color:
            terpilih ? Theme.of(context).primaryColorLight : Colors.transparent,
        childListTile(
            leadingIcon(
              ikon,
              colorTheme.of(context).primaryColorDark,
            ),
            titleText(
              judul.toString(),
              styleTextStyle(
                  colorTheme.of(context).primaryColorDark,
                  fontWeightterpilih ? FontWeight.bold : FontWeight.w100),
            ),
            trailingIcon(
              Icons.arrow_right_rounded,
              colorTheme.of(context).primaryColorDark,
            ),
            selectedterpilih,
            enabledenable,
            onTapfungsi));
  }

  @override
  Widget build(BuildContext context) {
    if (widget.drawerItems.isEmpty) {
      setState(() {
        _rebuildMenu(true);
      });
    }

    return Scaffold(
      appBarAppBar(
        iconThemeIconThemeData(colorTheme.of(context).cardColor),
        titleRow(children: <Widget>[
          Text(
            widget.drawerItems[_selectedDrawerIndex].title,
            styleTextStyle(
                fontWeightFontWeight.w900,
                fontSize20,
                colorTheme.of(context).cardColor),
          )
        ]),
      ),
      drawerDrawer(
        childColumn(
          children: <Widget>[
            _appBar('Menu App''Tampilan menu keren'),
            Column(childrencreateMenu()),
          ],
        ),
      ),
      body_getDrawerItemWidget(_selectedDrawerIndex),
    );
  }
}