Using bottom navy bar flutter to navigate pages
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:
- using
PageView
in yourbody
section usePageView
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();
}
- using a list of widgets create a list of widgets:
List<Widget> bodyList = [widget1, widget2, ...]
then provide it as body:
body: bodyList[_currentIndex]
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, 2023Comments
-
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 over 2 yearsIf anyone stucks like me, a great explanation video is here : youtube.com/watch?v=xoKqQjSDZ60&t=98s
-
Abbasihsn over 2 years@Miktad great... did my answer help you?
-
Miktad over 2 yearsYes, your answer guide me to find the video. Thank you very much.
-
Abbasihsn over 2 yearsHappy to help, so I would be grateful if you tag it as an acceptable solution.