Как программно открывать и закрывать ящик с помощью клавиш во Flutter?

Я хочу программно открывать и закрывать ящик, когда нажимаю на значок. Я пытаюсь использовать ключи, но мне не очень везет. Я нашел эту статью - Flutter: как программно открыть ящик, но я возникли проблемы.

У меня есть столбец значков (см. Снимок экрана), который я включаю в один файл, а мой ящик - в другой, оба из которых, очевидно, включены в третий (это полноэкранная карта Google). Я собираюсь использовать глобальный ключ, но не знаю, куда его поместить.

введите здесь описание изображения

На моей странице карты у меня есть

class _TheMapState extends State<TheMap> with WidgetsBindingObserver {
  GlobalKey<ScaffoldState> _drawerKey = GlobalKey();
  ...
  ...

Когда я пытаюсь добавить ключ на свою страницу ящика, он его не распознает, поэтому я добавляю строку GlobalKey на свою страницу ящика. Я также должен сделать это со своей страницей параметров значка, иначе приложение не будет создано из-за ошибок. Когда я это делаю, ошибок нет, но когда я нажимаю на кнопку, ничего не происходит.

Вот куда я положил ключ в ящик.

Widget mapDrawer() {
    return Drawer(
      key: _drawerKey,
      ...
      ...

Вот мой код значка, который находится в отдельном файле.

Widget _buildShowHideDrawerIcon() {
    return Container(
      child: Opacity(
        opacity: 0.60,
        child: Container(
          padding: EdgeInsets.all(7.0),
          decoration: BoxDecoration(
            color: Colors.white,
            //border: Border.all(color: Colors.black12, width: 1.0),
            boxShadow: [
              BoxShadow(
                color: Colors.black,
                offset: Offset(0.0, 0.0),
                blurRadius: 3.0,
              ),
            ],
          ),
          child: InkWell(
            onTap: () {
              print("SHOW/HIDE DRAWER ICON PRESSED");
              setState(() {
              _drawerKey.currentState.openDrawer();
              });
            },
            child: Icon(
              Icons.swap_horiz,
              color: Colors.black87,
              size: 24.0,
              semanticLabel: 'Show ,or hide sliding drawer',
            ),
          ),
        ),
      ),
    );
  }

Буду признателен за любую помощь в этом.


person Andrew Stevenson    schedule 24.02.2020    source источник


Ответы (2)


Назначьте ключ Scaffold, а не Drawer

  Scaffold(
    key: _drawerKey,
    drawer: Drawer(),

person Kahou    schedule 24.02.2020
comment
Спасибо - теперь у меня ошибка. Метод openDrawer был вызван с нулевым значением. - person Andrew Stevenson; 25.02.2020

Вы должны назначить ключ Scaffold, а не Drawer

Scaffold(
   key: _drawerKey,

И замените строку:

_drawerKey.currentState.openDrawer(); 

С участием

_drawerKey.currentState?.openDrawer();
person Appoodeh    schedule 09.04.2021