Открыть ящик при нажатии AppBar

Если вы создаете Scafold, есть опция для ящика. Если вы теперь создаете этот ящик, вы автоматически включаете значок меню в ведущей позиции панели приложений. Но я хочу другой значок, который открывает ящик. Я попытался сделать сам значок на ведущей позиции, но эта кнопка не может открыть ящик даже с помощью "Scafold.of (контекст).openDrawer()", он не может открыть его.

Есть ли возможность заменить значок кнопки ящика?

Ответы

Ответ 1

Используйте Key в своем Scaffold и покажите ящик, вызвав myKey.currentState.openDrawer(), вот рабочий код:

enter image description here

import "package:flutter/material.dart";

class Test extends StatefulWidget {
  @override
  _TestState createState() => new _TestState();
}

class _TestState extends State<Test> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: _scaffoldKey,
      drawer: new Drawer(),
      appBar: new AppBar(
        leading: new IconButton(icon: new Icon(Icons.settings),
            onPressed: () => _scaffoldKey.currentState.openDrawer()),
      ),
    );
  }
}

Ответ 2

Альтернатива принятому ответу, который не требует GlobalKey:

class _TestState extends State<Test> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      drawer: new Drawer(),
      appBar: new AppBar(
        leading: Builder(
            builder: (context) => IconButton(
                  icon: new Icon(Icons.settings),
                  onPressed: () => Scaffold.of(context).openDrawer(),
                ),
        ),
      ),
    );
  }
}

Ответ 3

вам нужно инициализировать scaffoldKey после этого

Открыть ящик и закрыть ящик

 GestureDetector(
          onTap: () {
            if(scaffoldKey.currentState.isDrawerOpen){
              scaffoldKey.currentState.openEndDrawer();
            }else{
              scaffoldKey.currentState.openDrawer();
            }
          },
          child:  LeadingIcon(icon: Icons.menu),//your button
        ),