I am building a flutter web app. I have a widget which I control with cubit, depending on if the user is logged in or not. If the user is logged in, I displa his profile picture as a dropdown button, and if he selects option A i want to push him to a different page. For some reason, the Navigator isn't doing anything. This is the code for my dropdown button:
MouseRegion(
cursor: SystemMouseCursors.click,
child: DropdownButton(
underline: SizedBox.shrink(),
icon: SizedBox.shrink(),
hint: CircleAvatar(
backgroundImage: NetworkImage(user.photoURL.toString()),
),
onChanged: (value) {
setState(() {});
},
items: [
DropdownMenuItem(
onTap: () {
print('tap');
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => UserPage(user)));
},
value: dropdownValue,
child: Row(
children: [Text('a'), Icon(Icons.ac_unit)],
)),
DropdownMenuItem(
value: menuItem,
child: Row(
children: [Text('b'), Icon(Icons.access_alarms)],
))
],
),
)
This is the code for the page I want to push to:
import 'package:ez_user_side/cubit/cubit/sign_in_cubit.dart';
import 'package:ez_user_side/pages/page_components/Menu.dart';
import 'package:ez_user_side/pages/page_components/colors.dart';
import 'package:ez_user_side/pages/page_components/right_side.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:ez_user_side/pages/page_components/user_middle.dart';
class UserPage extends StatefulWidget {
final User user;
UserPage(this.user);
@override
_UserPageState createState() => _UserPageState();
}
class _UserPageState extends State<UserPage> {
@override
Widget build(BuildContext context) {
return Container(
child: SizedBox(
width: MediaQuery.of(context).size.width / 100 * 13.46,
child: Row(
children: [
Menu(),
Container(
color: Colors.red,
),
AccountTab()
],
)),
);
}
}
Thank you for your help!
You need to keep track of the selected value of the DropdownButton
. You can do that with a simple variable in a StatefulWidget
. Here the variable value
is used to determine which item is selected. Whenever some DropdownMenuItem
is selected you update the variable with the selected DropdownMenuItem
's value.
After that, all you need is to react changes in the DropdownButton
's onChanged:(value)
callback to redirect to some other page or do something else.
Here's the code:
import 'package:flutter/material.dart';
class Solution extends StatefulWidget {
@override
_SolutionState createState() => _SolutionState();
}
class _SolutionState extends State<Solution> {
String value = "home";
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
child: DropdownButton<String>(
value: value,
underline: SizedBox.shrink(),
icon: SizedBox.shrink(),
hint: CircleAvatar(
backgroundImage: NetworkImage(user.photoURL.toString()),
),
onChanged: (value) async{
setState(() {
if(value == 'home') {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserPage())
);
}
else {
//DO SOMETHING
}
});
},
items: [
DropdownMenuItem(
onTap: () {
setState(() {
value = 'home';
});
print('tapped home');
},
value: 'home',
child: Row(
children: [Text('a'), Icon(Icons.ac_unit)],
)
),
DropdownMenuItem(
onTap: () {
setState(() {
value = 'alarm';
});
print('tapped alarm');
},
value: 'alarm',
child: Row(
children: [Text('b'), Icon(Icons.access_alarms)],
)
)
],
),
),
),
);
}
}