Ориентация Builder дает неправильную ориентацию - PullRequest
0 голосов
/ 08 июня 2018

В моем приложении я использую GridView для отображения сетки категорий и TextField.Я хочу изменить количество элементов, отображаемых в одной строке, на основе Screen Orientation (то есть, когда в Portrait mode 5 items per line и в landscape mode 8 items per line).

Я пытаюсь добиться этого с помощью виджета OrientationBuilder.Он работает очень хорошо, пока я не открою softkeyboard для редактирования TextField.

Но когда я открываю программную клавиатуру, OrientationBuilder возвращает ориентацию как landscape, что приводит к проблемам с переполнением.

Вот мой код,

return new Scaffold(
      appBar: buildFilterAppBar(context),
      body: new OrientationBuilder(builder: (context, orientation) {
        return new Column(
          children: <Widget>[
            new Expanded(
              child: new ListView(
                children: <Widget>[
                  buildContentTitle(
                      context, true, Icons.local_offer, '', 'Choose category'),
                  new GridView.count(
                    crossAxisCount: orientation == Orientation.portrait ? 5 : 8,
                    shrinkWrap: true,
                    physics: new NeverScrollableScrollPhysics(),
                    children: buildCategories(orientation),
                  ),
                  new Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      buildContentTitle(context, false, null,
                          'assets/money_pouch.png', 'Set a price range'),
                      new Padding(
                        padding: const EdgeInsets.only(left: 44.0),
                        child: new Text(
                          'Price (\u20B9)',
                          style: new TextStyle(
                              color: Theme.of(context).primaryColorDark,
                              fontSize: 15.0,
                              fontWeight: FontWeight.w600),
                        ),
                      ),
                      new Padding(
                        padding: const EdgeInsets.only(left: 44.0, right: 12.0),
                        child: new Row(
                          children: <Widget>[
                            new Flexible(
                                child: new TextField(
                                  decoration: new InputDecoration(labelText: 'From'),
                                )),
                            new Container(
                              width: 1.0,
                              height: 40.0,
                              color: Colors.grey[700],
                              margin: const EdgeInsets.symmetric(horizontal: 5.0),
                            ),
                            new Flexible(
                                child: new TextField(
                                  decoration: new InputDecoration(labelText: 'To'),
                                )),
                          ],
                        ),
                      ),
                    ],
                  ),
                ],
              ),
            ),
            new MaterialButton(
              padding: const EdgeInsets.symmetric(vertical: 15.0),
              onPressed: () {},
              color: Theme.of(context).accentColor,
              minWidth: double.infinity,
              child: new Text(
                'APPLY  FILTERS',
                style: new TextStyle(color: Colors.white, fontSize: 16.0, fontWeight: FontWeight.w500),
              ),
            ),
          ],
        );
      }),
    );

Есть ли какая-либо другая опциявместо использования OrientationBuilder или есть ли способ исправить это?

Заранее спасибо.

1 Ответ

0 голосов
/ 10 июня 2018

В документации уже сказано, что

OrientationBuilder builds a widget tree that can depend on the parent widget's orientation (distinct from the device orientation).

В моем случае, когда программная клавиатура открыта, ширина экрана становится больше высоты (Примечаниечто я вычисляю высоту как Full Screen Height - Soft Keyboard height).

Таким образом OrientationBuilder возвращается как landscape, что соответствует correct behaviour согласно документации.

Следовательно OrientationBuilder cannot be used для этого случая.

Для решения проблемы мы можем использовать ориентацию, полученную из MediaQuery

MediaQuery.of(context).orientation == Orientation.portrait ? 5 : 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...