how to pass data between two pages in flutter using bottom navigation bar
251
You can't access instance member widget
in an initializer.
Try this
class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
int _selectedIndex = 0;
late final List screens;
@override
void initState() {
super.initState();
screens = [
HomeScreen(widget.user),
CallLog(),
CallLog(),
CallLog(),
];
}
...
// the rest of your code
![Saqib Sattar](https://lh3.googleusercontent.com/--6DVDwDt8kw/AAAAAAAAAAI/AAAAAAAAC4Y/Oy4ub_SPaHE/photo.jpg?sz=256)
Author by
Saqib Sattar
Updated on January 01, 2023Comments
-
Saqib Sattar over 1 year
i'm new in flutter world. i'm using bottom navigation bar but i don't have idea how to pass data from bottom navigation bar page to homepage since homepage is expecting 1 parameter. i'm passing data between other pages but i couldn't find a way to pass data between bottomnavigation bar and home page. any help would be apprecaited thanks in advance
this is my navigation page code
import 'package:chat_app/models/user_model.dart'; import 'package:chat_app/screens/call_log_screen.dart'; import 'package:chat_app/screens/chat_screen.dart'; import 'package:chat_app/screens/home_screen.dart'; import 'package:chat_app/screens/search_screen.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class CustomBottomNavigationBar extends StatefulWidget { UserModel user; CustomBottomNavigationBar(this.user); @override _CustomBottomNavigationBarState createState() => _CustomBottomNavigationBarState(); } class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> { int _selectedIndex = 0; late final screens = [ HomeScreen(widget.user), CallLog(), CallLog(), CallLog(), ]; void onTapped(int index) { print(widget.user.name); setState(() { _selectedIndex = index; }); } @override Widget build(BuildContext context) { return Scaffold( body: screens[_selectedIndex], bottomNavigationBar: BottomNavigationBar( backgroundColor: Colors.black, selectedIconTheme: IconThemeData(color: Colors.blue), currentIndex: 2, items: [ BottomNavigationBarItem( icon: Icon( CupertinoIcons.settings, color: Colors.grey, ), label: 'hi', ), BottomNavigationBarItem( icon: Icon( CupertinoIcons.home, color: Colors.grey, ), label: 'hi', ), BottomNavigationBarItem( icon: Icon( CupertinoIcons.phone, color: Colors.grey, ), label: 'hi', ), BottomNavigationBarItem( icon: Icon( CupertinoIcons.chat_bubble_text, color: Colors.grey, ), label: 'hi', ), ], onTap: onTapped, ), ); } }
and this is my homepage code
import 'package:cached_network_image/cached_network_image.dart'; import 'package:chat_app/models/user_model.dart'; import 'package:chat_app/screens/chat_screen.dart'; import 'package:chat_app/screens/search_screen.dart'; import 'package:chat_app/widgets/bottom_navigation_bar.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:google_sign_in/google_sign_in.dart'; import 'package:intl/intl.dart'; import 'auth_screen.dart'; class HomeScreen extends StatefulWidget { UserModel user; HomeScreen(this.user); @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver { @override void initState() { // TODO: implement initState super.initState(); WidgetsBinding.instance!.addObserver(this); setStatus('online'); } void setStatus(String status) async { await FirebaseFirestore.instance .collection('users') .doc(widget.user.uid) .update({"userStatus": status}); } @override void didChangeAppLifecycleState(AppLifecycleState state) { // TODO: implement didChangeAppLifecycleState if (state == AppLifecycleState.resumed) { //online setStatus("online"); } else { //offline setStatus('offline'); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home'), centerTitle: true, backgroundColor: Colors.deepPurple, actions: [ IconButton( onPressed: () async { await GoogleSignIn().signOut(); await FirebaseAuth.instance.signOut(); setStatus('offline'); Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) => AuthScreen(), ), (route) => false); }, icon: Icon(Icons.logout), ), ], ), body: StreamBuilder( stream: FirebaseFirestore.instance .collection('users') .doc(widget.user.uid) .collection('messages') .snapshots(), builder: (context, AsyncSnapshot snapshot) { if (snapshot.hasData) { if (snapshot.data.docs.length < 1) { return Center( child: Text('No Chat Available!!!'), ); } return ListView.builder( itemCount: snapshot.data.docs.length, itemBuilder: (context, index) { var friendId = snapshot.data.docs[index].id; var lastMsg = snapshot.data.docs[index]['last_message']; var lastMsgTime = snapshot.data.docs[index]['last_message_time']; return FutureBuilder( future: FirebaseFirestore.instance .collection('users') .doc(friendId) .get(), builder: (context, AsyncSnapshot asyncSnapShot) { if (asyncSnapShot.hasData) { var friend = asyncSnapShot.data; return ListTile( leading: ClipRRect( borderRadius: BorderRadius.circular(80.0), child: CachedNetworkImage( imageUrl: friend['image'], placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), ), // child: Image.network( // friend['image'], // ), ), trailing: Text( DateFormat.jm().format( lastMsgTime.toDate(), ), ), title: Text( friend['name'], ), subtitle: Text( "$lastMsg", style: TextStyle(color: Colors.grey), overflow: TextOverflow.ellipsis, ), onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => ChatScreen( currentUser: widget.user, receiverId: friend['uid'], receiverImage: friend['image'], receiverName: friend['name'], ), ), ); }, ); } return LinearProgressIndicator(); }, ); }, ); } return Center( child: CircularProgressIndicator(), ); }, ), floatingActionButton: FloatingActionButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => SearchScreen(widget.user), ), ); // Navigator.pushAndRemoveUntil( // context, // MaterialPageRoute( // builder: (context) => SearchScreen(widget.user), // ), // (route) => false); }, child: Icon(CupertinoIcons.search), ), bottomNavigationBar: CustomBottomNavigationBar(widget.user), ); } }
-
Saqib Sattar almost 3 yearsafter writing these lines of code i'm getting stack overflow error
-
Peter Obiechina almost 3 yearspost the error message in the comments
-
Saqib Sattar almost 3 yearsThe following StackOverflowError was thrown building IconButton(Icon, padding: EdgeInsets.all(8.0), dependencies: [_LocalizationsScope-[GlobalKey#72baa], _InheritedTheme]): Stack Overflow
-
Saqib Sattar almost 3 yearsThe relevant error-causing widget was: IconButton file:///D:/flutter/chat_app/lib/screens/home_screen.dart:59:11 When the exception was thrown, this was the stack: #0 _createTables.<anonymous closure> (dart:core/uri.dart:3872:53) #1 new _GrowableList.generate (dart:core-patch/growable_array.dart:133:28) #2 _createTables (dart:core/uri.dart:3872:16) #3 _scannerTables (dart:core/uri.dart:3751:40) #4 _scannerTables (dart:core/uri.dart)
-
Peter Obiechina almost 3 yearsThis error was caused by IconButton in home_screen, not
CustomBottomNavigationBar
. Did you tap any button before the error occured? Can you printwidget.user
in homeScreen to be sure it was passed properly. -
Peter Obiechina almost 3 yearsAnother idea just crossed my mind. Rather than passing widget.user to HomeScreen page, why not get the userData from firebase directly in the
homeScreen
page. -
Saqib Sattar almost 3 yearsi didn't tap any button. i got this error while starting the app and my screens didn't load
-
Saqib Sattar almost 3 yearsi'm getting user in homeScreen but since i'm calling homeScreen constructor in customNavigationBar i have to pass parameter in HomeScreen constructor