Почему Flutter Scaffold.of (context) .openDrawer () не работает? - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу открыть ящик после нажатия пользовательской кнопки в 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();
                    },
                  ),
                ],
              ),
          ),
        ],
      ),
    );
  }
}

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Проблема в том, что вы указали endDrawer на Scaffold, но звоните Scaffold.of(context).openDrawer().

openDrawer() Состояния документации:

Если на эшафот есть ненулевой Scaffold.drawer, эта функция заставит ящик начать анимацию входа.

Поскольку ваш drawer равен нулю, ничего не происходит.

Напротив, openEndDrawer() сообщает нам:

Если скаффолд имеет ненулевой Scaffold.endDrawer, эта функция заставит ящик конечной стороны начать анимацию входа.

Поскольку ваш endDrawer не равен нулю, вы должны использовать openEndDrawer()метод.В качестве альтернативы, если вам все равно, с какой стороны выдвигается выдвижной ящик, вы можете использовать drawer вместо endDrawer при сборке Scaffold.

1 голос
/ 25 сентября 2019

Scaffold.of (контекст) .openEndDrawer ()

...