导航时我遇到“小部件树中的多个GlobalKeys”的问题。
我在基本屏幕的脚手架中定义了一个BottomNavigationBar和一个抽屉,在Scaffold的body参数中,我有多个屏幕,可通过BottomNavigationBar访问。问题是,我正在使用GlobalKey从多个屏幕之一访问基本屏幕的抽屉,并且一切正常,但是当我从另一个屏幕导航至基本屏幕时,出现上述错误。 / p>
我尝试了在定义键时不使用static关键字的解决方案,它解决了导航错误,但是后来我无法访问Drawer,因为然后我又收到了另一个错误“ method'openDrawer'被调用为null “。
这是我定义了键的单独类:
class AppKeys {
final GlobalKey<ScaffoldState> homeKey = GlobalKey<ScaffoldState>();
}
这是基本屏幕:
class Base extends StatefulWidget {
@override
_BaseState createState() => _BaseState();
}
class _BaseState extends State<Base> {
int selectedScreen = 0;
final screens = List<Widget>.unmodifiable([Home(), Cart(), Orders(), Help()]);
AppKeys appKeys = AppKeys();
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: MyDrawer(),
key: appKeys.homeKey,
body: screens[selectedScreen],
bottomNavigationBar: SizedBox(
height: 80,
child: BottomNavigationBar(
onTap: (val) {
setState(() {
selectedScreen = val;
});
},
currentIndex: selectedScreen,
selectedItemColor: AppColor.primary,
elevation: 20.0,
unselectedItemColor: Colors.grey,
showUnselectedLabels: true,
type: BottomNavigationBarType.fixed,
iconSize: 25,
selectedFontSize: 15,
unselectedFontSize: 15,
items: [
BottomNavigationBarItem(
icon: Icon(AnanasIcons.home), title: Text("Home")),
BottomNavigationBarItem(
icon: Icon(AnanasIcons.cart), title: Text("Cart")),
BottomNavigationBarItem(
icon: Icon(AnanasIcons.orders), title: Text("My Orders")),
BottomNavigationBarItem(
icon: Icon(AnanasIcons.help), title: Text("Help")),
],
),
),
);
}
}
这是我访问抽屉的主屏幕:
class Home extends StatelessWidget {
final AppKeys appKeys = AppKeys();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(
AnanasIcons.menu,
color: Colors.black,
),
onPressed: () {
appKeys.homeKey.currentState.openDrawer();
}),
backgroundColor: Theme.of(context).canvasColor,
title: Text("Hi"),
actions: [
IconButton(
icon: Icon(
Icons.person,
color: Colors.black,
),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Profile(),
));
})
],
),
body: Container(),
);
}
}
答案 0 :(得分:0)
我找到了答案!除了使用键推入路线外,我们还需要从堆栈中删除所有路线,直到必须到达的屏幕为止。
这是代码:
Navigator.of(context).popUntil(ModalRoute.withName(Base.routeName));