Как сделать пейзаж только на одном экране в Flutter?

#flutter #flutter-layout

Вопрос:

Главный экран моего приложения находится в альбомной ориентации и имеет фоновую музыку. Поэтому в initstate я реализовал экран в виде пейзажа с музыкой

   void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
    ]);

    _assetsAudioPlayer = AssetsAudioPlayer();
    AssetsAudioPlayer.newPlayer().open(
      Audio("assets/audio/bgm.mp3"),
      autoStart: true,
      showNotification: true,
    );
    _assetsAudioPlayer!.playOrPause();
  }

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

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

Ответ №1:

Можете ли вы проверить, вызвана ли функция dispose? Возможно, вместо dispose вызывается деактивирующая функция.

Если проблема в том, что вы можете выполнить свою логику в функции деактивации, например:

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

Почему вызывается метод деактивации вместо функции dispose :

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

Комментарии:

1. Я пробовал деактивировать. это все еще показывает ту же проблему. Но при попытке использовать Navigator.pushReplacementName ориентация снова меняется на портретную. Но музыка продолжает играть, не отключаясь

2. О, потому что вы неправильно установили нуль аудиоплеера. После этой строки _assetsAudioPlayer = AssetsAudioPlayer(); вы запустили музыку с другим экземпляром AssetsAudioPlayer, а не с _assetsAudioPlayer.newPlayer().открыть