如何在 flutter 中使用 2 个按钮控制抽屉和 endDrawer

how to contronl drawer and endDrawer with 2 button in flutter

我想设置 2 个按钮:第一个打开 Drawer,第二个打开 endDrawer

我用的第一个按钮

onTap: () => _drawerKey.currentState.openEndDrawer(),

我用的第二个

onTap: () => _drawerKey.currentState.openDrawer(),

但代码无效

制作脚手架的全局键并放入你的脚手架......

class _AppState extends State<MyHome> {

    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

    @override
    Widget build(BuildContext context) {
      return Scaffold(
          key: _scaffoldKey,
          appBar: PreferredSize(
            preferredSize: Size(null, 180),
            child: _getAppBar(
                _selectedDrawerIndex), //CustomAppBar(_scaffoldKey, controller),
          ),
          drawer: createDrwaer(),
          body: WillPopScope(
            child: _getDrawerFragment(_selectedDrawerIndex),
            onWillPop: () {
              if (_selectedDrawerIndex == 1) {
                _onSelectItem(0);
              } else {
                Navigator.of(context).pop();
              }
            },
          ) //_getDrawerFragment(_selectedDrawerIndex),
          );
    }
  }

然后点击按钮使用它...

onTap: () =>_scaffoldKey.currentState.openDrawer(),

一定要让你的class有状态

试试这个代码,

class Act_Drawer extends StatefulWidget {
  @override
  _Act_DrawerState createState() => _Act_DrawerState();
}

class _Act_DrawerState extends State<Act_Drawer> {
  final GlobalKey<ScaffoldState> _scaffoldkey = new GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldkey,
      appBar: AppBar(
        title: Text("Drawer Demo"),
        automaticallyImplyLeading: false,
        leading: StatefulBuilder(
          builder: (BuildContext context, setState) {
            return IconButton(
              icon: Icon(Icons.format_align_left),
              onPressed: () {
                _scaffoldkey.currentState.openDrawer();
              },
            );
          },
        ),
        actions: <Widget>[
          StatefulBuilder(builder: (BuildContext context, setState) {
            return IconButton(
              icon: Icon(Icons.format_align_right),
              onPressed: () {
                _scaffoldkey.currentState.openEndDrawer();
              },
            );
          },
          )
        ],
      ),
      drawer: Drawer(),
      endDrawer: Drawer(),
      body: Container(),
    );
  }
} 

方法 'openDrawer' 被调用为 null。接收者:null 尝试调用:openDrawer() 如果你得到这个错误:那是因为你没有在你的第二个(嵌套脚手架)中声明全局键。

 final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();// this is declared inside your State

下面是一个工作示例

@override
    Widget build(BuildContext context) {
    return Container(
    color: Colors.white,
    child: Scaffold(
    primary: true,
    appBar: actionBar(),
    drawer: MainNavigationDrawer(),
    body: Scaffold(
        key: _scaffoldKey,// VERY IMPORTANT YOU CALL THIS otherwise you will get the error above
        endDrawer: MainNavigationDrawer(),
        body: singleScrollView()),
   ),
 );
}

这正是我所需要的

        Scaffold.of(context).openEndDrawer();