颤振:“导航”中的“窗口小部件树中有多个GlobalKey”

时间:2020-08-10 09:48:01

标签: flutter

导航时我遇到“小部件树中的多个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(),
    );
  }
}

1 个答案:

答案 0 :(得分:0)

我找到了答案!除了使用键推入路线外,我们还需要从堆栈中删除所有路线,直到必须到达的屏幕为止。

这是代码:

Navigator.of(context).popUntil(ModalRoute.withName(Base.routeName));