为什么Flutter Scaffold.of(context).openDrawer()不起作用?

时间:2019-09-25 09:42:31

标签: flutter dart navigation-drawer

我想在按BottomMenu中的自定义按钮后打开抽屉,但是我遇到了Scaffold.of(context).openDrawer()的问题,它不起作用。我的BottomMenu是单独小部件类。据我了解,由于它是单独的上下文,因此不起作用。如何获得正确的上下文?也许有人知道另一种解决方案。

这是我的代码复制器:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(title: 'Flutter Drawer'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      bottomNavigationBar: BottomMenu(),
      endDrawer: SizedBox(
        width: double.infinity,
        child: Drawer(
          elevation: 16,
          child: Container(
            color: Colors.black,
            child: ListView(
              padding: EdgeInsets.zero,
              children: <Widget>[
                ListTile(
                    title: Text('Some context here',
                        style: TextStyle(color: Colors.white))),
                ListTile(
                    title: Text('Some context here',
                        style: TextStyle(color: Colors.white))),
              ],
            ),
          ),
        ),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Call Drawer form menu reproducer',
            )
          ],
        ),
      ),
    );
  }
}

class BottomMenu extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 15),
      child: Wrap(
        alignment: WrapAlignment.center,
        children: <Widget>[
          Divider(color: Colors.black, height: 1),
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 2),
            child: Row(
                mainAxisSize: MainAxisSize.max,
                mainAxisAlignment: MainAxisAlignment.end,
                children: <Widget>[
                  InkWell(
                    borderRadius: new BorderRadius.circular(20.0),
                    customBorder: Border.all(color: Colors.black),
                    child: Container(
                      padding: EdgeInsets.only(
                          left: 3, right: 6, bottom: 15, top: 11),
                      child: Row(
                        children: <Widget>[
                          Icon(Icons.menu),
                          Text('Show menu', style: TextStyle(fontSize: 15, fontWeight: FontWeight.bold)),
                        ],
                      ),
                    ),
                    onTap: () {
                      Scaffold.of(context).openDrawer();
                    },
                  ),
                ],
              ),
          ),
        ],
      ),
    );
  }
}

6 个答案:

答案 0 :(得分:3)

我的问题解决了,而不是

Scaffold.of(context).openEndDrawer()

我将钥匙交给脚手架,然后按如下所示的状态致电

_scaffoldkey.currentState.openEndDrawer()

它解决了我的问题,希望它也对您有用

答案 1 :(得分:2)

问题是您在endDrawer上指定了Scaffold,但您正在呼叫Scaffold.of(context).openDrawer()

openDrawer()文档指出:

  

如果脚手架具有非null的Scaffold.drawer,此功能将导致抽屉开始其入口动画。

由于您的drawer为空,因此什么也没发生。

相反,openEndDrawer()通知我们:

  

如果脚手架具有非null的Scaffold.endDrawer,则此功能将导致端部抽屉开始其入口动画。

由于您的endDrawer不为null,因此应使用openEndDrawer()方法。另外,如果您不在乎抽屉从哪一侧滑动,则在构建drawer时可以使用endDrawer而不是Scaffold

答案 2 :(得分:1)

Scaffold.of(context).openEndDrawer()

答案 3 :(得分:0)

这里有类似问题。单击按钮,没有任何反应。问题是我正在使用实例化Scaffold的小部件的上下文。不是脚手架的孩子的上下文。

这是我解决的方法:

// body: Column(
        //   children: <Widget>[
        //     Row(
        //       children: <Widget>[        
        //         IconButton(
        //           icon: Icon(Icons.filter_list),
        //           onPressed: () => Scaffold.of(context).openEndDrawer(), (wrong context)
        //         ),
        //       ],
        //     ),
        //   ],
        // )

收件人:

body: Builder(
            builder: (context) => Column(
                  children: <Widget>[
                    Row(
                      children: <Widget>[
                        IconButton(
                          icon: Icon(Icons.filter_list),
                          onPressed: () => Scaffold.of(context).openEndDrawer(),
                        ),
                      ],
                    ),
                  ],
                )),
      ),

答案 4 :(得分:0)

就我而言,这行得通。

return Scaffold(
      key: _scaffoldKey,
      endDrawerEnableOpenDragGesture: false,  // This!
      appBar: AppBar(
        iconTheme: IconThemeData(color: Colors.white),
        leading: IconButton(
          icon: Icon(Icons.menu, size: 36),
          onPressed: () => _scaffoldKey.currentState.openDrawer(),  // And this!
        ),
      ),
      drawer: DrawerHome(),
      ....

_scaffoldKey必须初始化为

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

在课堂上。

答案 5 :(得分:-1)

如果您的 appbar 小部件带有用于启动抽屉的操作按钮并且抽屉从未被推动,请记住您需要在 appbar: ... 之后定义 endDrawer: YOURAppDrawerWIDGET(), 或使用 {{1} } 行不通。

Scaffold.of(context).openEndDrawer()