Установка разных ориентаций для каждого экрана в приложении Flutter приводит к значительному отставанию - PullRequest
0 голосов
/ 26 января 2019

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

Такое ощущение, что эти две настройки борются друг с другом, и как только я установил настройку ландшафта, приложение переходит от мгновенных ответов к 2 секундам или отставанию экрана для переключения экранов.

Фрагменты кода:

class MainMenu extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    SystemChrome.setEnabledSystemUIOverlays([]);
    SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp,]);

Так я устанавливаю свою первоначальную ориентацию.

Перейдите к следующему экрану, например, с помощью нажатия кнопки:

Navigator.push(
   context,
   MaterialPageRoute(builder: (context) => SecondScreen()),
);

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIOverlays([]);
    SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft,]);

Моя ориентация для второго экрана. Если я удаляю строки SystemChrome, это отзывчиво. Если я добавлю их обратно, это сильно отстает.

Есть ли другой метод, который я должен использовать для вспомогательных экранов?

Спасибо, ребята.

Edit:

Попытка реализовать теоретическое решение от Пита ниже, который бросает груды:

Another exception was thrown: inheritFromWidgetOfExactType(_InheritedTheme) or inheritFromElement() was called after dispose():

ошибки в консоли (но приложение не падает, я просто вижу долю секунды аварийного дампа, когда экраны перемещаются назад и вперед). Используемый код:

class MainMenu extends StatefulWidget {
  @override
  _MainMenuParentState createState() => _MainMenuParentState();
}

class _MainMenuParentState extends State<MainMenu> {
  @override
  void initState() {
    super.initState();
      SystemChrome.setEnabledSystemUIOverlays([]);
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp,]);
  }

  @override
  void dispose(){
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
    super.dispose();
  }

Я пытался в initState также использовать Future, но ошибки каждый раз идентичны.

Утилизация вызывается в onPress:

onPressed: () {
    dispose();
    Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondScreen()),
);

И я делаю то же самое в другом случае, я преобразовал SecondScreen в виджет с состоянием, использовал initstate для установки в качестве ландшафта и вызвал dispose точно так же.

1 Ответ

0 голосов
/ 26 января 2019

Не помещайте вызов SystemChrome в метод build().Сделайте так, чтобы ваш экран расширялся от StatefulWidget.Инициировать SystemChrome вызов внутри initState() с помощью Future.

...