This is my widget tree:
I have StreamBuilder (PURPLE) which is re-building app after clicking FloatingActionButton (RED).
Where the problem is
StreamBuilder rebuilds only objects under him, that means UserSettingsPage (GREEN) isn't getting rebuild. I want him to be rebuild.
My thoughts about fixing it
1.) I think I can maybe move my StreamBuilder above MateriallApp, but I don't know how to implement it.
2.) Maybe i can somehow move UserSettingsPage next to HomePage
I am open for every solution.
(main.dart)
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MultiProvider(providers: [
ChangeNotifierProvider(create: (_) => GoogleSignInProvider()),
ChangeNotifierProvider(create: (_) => ThemesProvider()),
ChangeNotifierProvider(create: (_) => ZmienneClass())
], child: const MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) => MaterialApp(
debugShowCheckedModeBanner: false,
theme: Provider.of<ThemesProvider>(context).darkModeOn
? ThemeOptions.white
: ThemeOptions.black,
home: Scaffold(
body: StreamBuilder(
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasData) {
//// 2 OPCJA - DODAĆ TU NAVIGATOR I PRZECZYTAĆ TO
return const HomePage();
} else if (snapshot.hasError) {
return const Center(child: Text("Something went Wrong.."));
} else {
return const LoginPage();
}
},
stream: FirebaseAuth.instance.authStateChanges(),
),
),
);
}
I am opening UserSettingsPage via clicking on FloatingActionButton (RED) which is in UserPage.
Here is his code :
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => const UserSettingsPage()));
},
(HomePage)
import 'package:flany/userpage.dart';
import 'package:flany/widgets/game.dart';
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key, firTime, secTime}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int _selectedIndex = 1;
@override
Widget build(BuildContext context) {
var screens = [
Container(),
Game(),
const UserPage(),
];
return Scaffold(
bottomNavigationBar: BottomNavigationBar(
onTap: (index) {
setState(() {
_selectedIndex = index;
});
},
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(icon: Icon(Icons.score), label: ""),
BottomNavigationBarItem(
icon: Icon(Icons.games_rounded), label: ""),
BottomNavigationBarItem(icon: Icon(Icons.person), label: ""),
],
currentIndex: _selectedIndex),
body: IndexedStack(index: _selectedIndex, children: screens));
}
}
(UserPage)
import 'package:flany/settingspage.dart';
import 'package:flutter/material.dart';
class UserPage extends StatefulWidget {
const UserPage({Key? key}) : super(key: key);
@override
_UserPageState createState() => _UserPageState();
}
class _UserPageState extends State<UserPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const UserSettingsPage()));
},
child: const Icon(
Icons.settings,
),
),
body: ListView(
children: const [
// SOME WIDGETS
],
),
);
}
}
(UserSettingsPage)
import 'package:flutter/material.dart';
class UserSettingsPage extends StatefulWidget {
const UserSettingsPage({Key? key}) : super(key: key);
@override
_UserSettingsPageState createState() => _UserSettingsPageState();
}
class _UserSettingsPageState extends State<UserSettingsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(children: const [
// BUTTON WHO IS EXECUTING STREAMBUILDER (onpressed code of it)
onPressed: () {
final provider =
Provider.of<GoogleSignInProvider>(context, listen: false);
provider.logout();
},
]),
);
}
}
