Using bottom navy bar flutter to navigate pages

371

you have provided only one widget as a body, so changing _currentIndex does not affect the displayed body. According to the example of this package ( in the Use with PageView and PageController section), you can use PageView for changing the display image! Or you can use a list of widgets and show the item that is related to the _currentIndex. so you have two solutions:

  1. using PageView in your body section use PageView as follow:
  child: PageView(
          controller: _pageController,
          onPageChanged: (index) {
            setState(() => _currentIndex = index);
          },
          children: <Widget>[
            Container(color: Colors.blueGrey,),
            Container(color: Colors.red,),
            Container(color: Colors.green,),
            Container(color: Colors.blue,),
          ],
        ),
      ),

don't forget to create and dispose page controller:

PageController _pageController;

  @override
  void initState() {
    super.initState();
    _pageController = PageController();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }
  1. using a list of widgets create a list of widgets:
List<Widget> bodyList = [widget1, widget2, ...]

then provide it as body:

body: bodyList[_currentIndex]
Share:
371
Miktad
Author by

Miktad

I've founded feliXart in 2013 which currently operates worldwide and locates in London, İstanbul, and Kayseri. I exported many VR, AR, Mobile, and Web apps worldwide with feliXart including mostly USA, Mexico, Netherlands, Germany. I am head of E-commerce/Lead Developer at Silver Cookware, one of Turkey's biggest and oldest companies. I carry out joint projects with leading institutions such as TUBITAK and METU. I have been the subject of international news twice with the software I produced.

Updated on January 01, 2023

Comments

  • Miktad
    Miktad over 1 year

    I'm using this package to navigate via the bottom navigation bar, I did not understand how to manage to navigate between my screens. How can I navigate between my screens via bottom navigation bar icons?

    import 'dart:async';
    import 'dart:io';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:webview_flutter/webview_flutter.dart';
    import 'package:bottom_navy_bar/bottom_navy_bar.dart';
    
    class HaberScreen extends StatefulWidget {
      @override
      _HaberScreenState createState() => _HaberScreenState();
    }
    
    class _HaberScreenState extends State<HaberScreen> {
      final Completer<WebViewController> _controller =
          Completer<WebViewController>();
    
      @override
      void initState() {
        super.initState();
        if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
      }
    
      int _currentIndex = 0;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: PreferredSize(
            preferredSize: Size.fromHeight(60.0),
            child: AppBar(
              backgroundColor: Colors.white,
              automaticallyImplyLeading: true,
              leading: IconButton(
                icon: Icon(
                  Icons.arrow_back_ios,
                  color: Colors.red,
                ),
                //onPressed:() => Navigator.pop(context, false),
                onPressed: () => Navigator.pop(context),
              ),
              title: Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text(
                    'Haberler',
                    style: TextStyle(color: Colors.red, fontSize: 25.0),
                  )
                ],
              ),
    
              // This drop down menu demonstrates that Flutter widgets can be shown over the web view.
              actions: <Widget>[
                NavigationControls(
                  _controller.future,
                ),
              ],
            ),
          ),
          body: Builder(builder: (BuildContext context) {
            return WebView(
              initialUrl: 'https://www.google.com',
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (WebViewController webViewController) {
                _controller.complete(webViewController);
              },
              onProgress: (int progress) {
                print("WebView is loading (progress : $progress%)");
              },
              javascriptChannels: <JavascriptChannel>{
                _toasterJavascriptChannel(context),
              },
              navigationDelegate: (NavigationRequest request) {
                if (request.url.startsWith('https://www.youtube.com/')) {
                  print('blocking navigation to $request}');
                  return NavigationDecision.prevent;
                }
                print('allowing navigation to $request');
                return NavigationDecision.navigate;
              },
              onPageStarted: (String url) {
                print('Page started loading: $url');
              },
              onPageFinished: (String url) {
                print('Page finished loading: $url');
              },
              gestureNavigationEnabled: true,
            );
          }),
          floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
          floatingActionButton: favoriteButton(),
          
          
          bottomNavigationBar: BottomNavyBar(
            selectedIndex: _currentIndex,
            showElevation: true,
            itemCornerRadius: 24,
            curve: Curves.easeIn,
            onItemSelected: (index) => setState(() => _currentIndex = index),
            items: <BottomNavyBarItem>[
              BottomNavyBarItem(
                icon: Icon(Icons.apps),
                title: Text('Haberler'),
                activeColor: Colors.red,
                textAlign: TextAlign.center,
              ),
              BottomNavyBarItem(
                icon: Icon(Icons.pie_chart),
                title: Text('Sektörler'),
                activeColor: Colors.red,
                textAlign: TextAlign.center,
              ),
              BottomNavyBarItem(
                icon: Icon(Icons.monetization_on),
                title: Text(
                  'Kurlar',
                ),
                activeColor: Colors.red,
                textAlign: TextAlign.center,
              ),
              BottomNavyBarItem(
                icon: Icon(Icons.plagiarism_sharp),
                title: Text('Raporlar'),
                activeColor: Colors.red,
                textAlign: TextAlign.center,
              ),
              BottomNavyBarItem(
                icon: Icon(Icons.settings),
                title: Text('Ayarlar'),
                activeColor: Colors.red,
                textAlign: TextAlign.center,
              ),
            ],
          ),
        );
      }
    
      JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
        return JavascriptChannel(
            name: 'Toaster',
            onMessageReceived: (JavascriptMessage message) {
              // ignore: deprecated_member_use
              Scaffold.of(context).showSnackBar(
                SnackBar(content: Text(message.message)),
              );
            });
      }
    
      Widget favoriteButton() {
        return FutureBuilder<WebViewController>(
            future: _controller.future,
            builder: (BuildContext context,
                AsyncSnapshot<WebViewController> controller) {
              if (controller.hasData) {
                return FloatingActionButton(
                  onPressed: () async {
                    final String url = (await controller.data!.currentUrl())!;
                    // ignore: deprecated_member_use
                    Scaffold.of(context).showSnackBar(
                      SnackBar(content: Text('Favorited $url')),
                    );
                  },
                  child: const Icon(
                    Icons.favorite,
                    color: Colors.white,
                  ),
                );
              }
              return Container();
            });
      }
    }
    
    class NavigationControls extends StatelessWidget {
      const NavigationControls(this._webViewControllerFuture)
          : assert(_webViewControllerFuture != null);
    
      final Future<WebViewController> _webViewControllerFuture;
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder<WebViewController>(
          future: _webViewControllerFuture,
          builder:
              (BuildContext context, AsyncSnapshot<WebViewController> snapshot) {
            final bool webViewReady =
                snapshot.connectionState == ConnectionState.done;
            final WebViewController controller = snapshot.data!;
            return Row(
              children: <Widget>[
                IconButton(
                  icon: const Icon(
                    Icons.arrow_back_ios,
                    color: Colors.red,
                  ),
                  onPressed: !webViewReady
                      ? null
                      : () async {
                          if (await controller.canGoBack()) {
                            await controller.goBack();
                          } else {
                            // ignore: deprecated_member_use
                            Scaffold.of(context).showSnackBar(
                              const SnackBar(content: Text("Geçmiş Bulunamadı")),
                            );
                            return;
                          }
                        },
                ),
                IconButton(
                  icon: const Icon(
                    Icons.arrow_forward_ios,
                    color: Colors.red,
                  ),
                  onPressed: !webViewReady
                      ? null
                      : () async {
                          if (await controller.canGoForward()) {
                            await controller.goForward();
                          } else {
                            // ignore: deprecated_member_use
                            Scaffold.of(context).showSnackBar(
                              const SnackBar(content: Text("Geçmiş Bulunamadı")),
                            );
                            return;
                          }
                        },
                ),
              ],
            );
          },
        );
      }
    }
    
  • Miktad
    Miktad over 2 years
    If anyone stucks like me, a great explanation video is here : youtube.com/watch?v=xoKqQjSDZ60&t=98s
  • Abbasihsn
    Abbasihsn over 2 years
    @Miktad great... did my answer help you?
  • Miktad
    Miktad over 2 years
    Yes, your answer guide me to find the video. Thank you very much.
  • Abbasihsn
    Abbasihsn over 2 years
    Happy to help, so I would be grateful if you tag it as an acceptable solution.