简体   繁体   English

Flutter:如何从其他小部件调用 openDrawer

[英]Flutter: How to call openDrawer from other widget

Question: I want to call openDrawer from onPressed() of Header.dart问:我想从 Header.dart 的 onPressed() 调用 openDrawer

The Drawer.dart, Header.dart and Home.dart files are separate.抽屉.dart、Header.dart和Home.ZBB14127678960FAE157D873950EA文件是分开的。

I have tried Scaffold.of(context).openDrawer();我试过Scaffold.of(context).openDrawer(); not worked.没用。

I tried using cotroller but it not work.我尝试使用cotroller但它不起作用。 Perhaps it was not used in the right way.也许它没有以正确的方式使用。

I would appreciate any advice you could give me.我会很感激你能给我的任何建议。

code:代码:

Codes are omitted.代码被省略。

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

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

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: Header('App'),
      endDrawer: Menu(),
    )}}

class Header extends StatefulWidget implements PreferredSizeWidget {
  const Header(this.heading, {Key? key});
  final String heading;
  @override
  Size get preferredSize => const Size.fromHeight(kToolbarHeight);

  @override
  State<Header> createState() => _HeaderState(heading);
}

class _HeaderState extends State<Header> {
  _HeaderState(this.heading);

  final String heading;

  @override
  Widget build(BuildContext context) {
    return AppBar(
      centerTitle: false,
      actions: <Widget>[
        IconButton(
          icon: const Icon(Icons.menu, size: 30.0),
          tooltip: '',
          onPressed: () {
            // _key.currentState!.openDrawer();
          },
        ),]
    );
  }
}
class Menu extends StatelessWidget {
  const Menu({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Drawer()
}

You're using an end drawer, so instead of Scaffold.of(context).openDrawer() , you should use Scaffold.of(context).openEndDrawer() :您使用的是末端抽屉,因此您应该使用Scaffold.of(context).openEndDrawer()而不是Scaffold.of(context).openDrawer() (context).openDrawer() :

class _HeaderState extends State<Header> {
  _HeaderState(this.heading);

  final String heading;

  @override
  Widget build(BuildContext context) {
    return AppBar(
      centerTitle: false,
      actions: <Widget>[
        IconButton(
          icon: const Icon(Icons.menu, size: 30.0),
          tooltip: '',
          onPressed: () {
            Scaffold.of(context).openEndDrawer();
          },
        ),]
    );
  }
}

Side Note : You don't need to pass arguments from the StatefulWidget to the State - Every instance of State has a widget property, which you can use to access the properties of the parent widget.旁注:您不需要将argumentsStatefulWidget传递到State - State的每个实例都有一个widget属性,您可以使用它来访问小部件的父属性。

In your case it would look like:在您的情况下,它看起来像:

class Header extends StatefulWidget implements PreferredSizeWidget {
  const Header(this.heading, {Key? key});

  final String heading;

  @override
  Size get preferredSize => const Size.fromHeight(kToolbarHeight);

  @override
  State<Header> createState() => _HeaderState();
}

class _HeaderState extends State<Header> {
  @override
  Widget build(BuildContext context) {
    return AppBar(
      centerTitle: false,

      // Assuming this is what the heading argument is for
      title: Text(widget.heading), 

      actions: <Widget>[
        IconButton(
          icon: const Icon(Icons.menu, size: 30.0),
          tooltip: '',
          onPressed: () {
            Scaffold.of(context).openEndDrawer();
          },
        ),
      ],
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM