Flutter 在Flatter应用程序中为每个屏幕设置不同的方向会导致严重滞后

Flutter 在Flatter应用程序中为每个屏幕设置不同的方向会导致严重滞后,flutter,orientation,Flutter,Orientation,我正在设置一个纵向的主菜单屏幕,然后导航到需要横向的第二个屏幕 感觉这两个设置互相冲突,一旦我设置了横向设置,应用程序就会从瞬时响应变为2秒或屏幕延迟切换屏幕 代码片段: class MainMenu extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setEnabledSystemUIOverlays([]); SystemChrome.setPr

我正在设置一个纵向的主菜单屏幕,然后导航到需要横向的第二个屏幕

感觉这两个设置互相冲突,一旦我设置了横向设置,应用程序就会从瞬时响应变为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线路,它会响应。如果我再把它们加进去,它会滞后得太久

对于子屏幕,我应该使用不同的方法吗

谢谢各位

编辑:

尝试实施以下Pete提出的基于理论的解决方案,该解决方案引发了大量:

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();
  }

另一种方法与此完全相同,我将SecondScreen转换为statefulwidget,使用initstate设置为横向,并以完全相同的方式调用dispose。

不要在
build()方法中调用
SystemChrome
。使您的屏幕从
StatefulWidget
扩展。使用
Future

触发
SystemChrome
内部调用
initState()
,谢谢你的回复,皮特。有没有可能在代码中显示出这是什么样子的?我已经尝试过自己摸索这个模糊的解决方案,现在它不再滞后了,但我收到了大量的信息:“引发了另一个异常:inheritFromWidgetOfExactType(_InheritedTheme)或inheritFromElement()在dispose()之后调用:”-问题中添加了代码用法。您面临的异常与此问题无关。事实并非如此。这个问题涉及到一个只有一个解决方案的问题,我不知道如何实施(如果我做错了)。因此,异常是有效的,因为答案不能可靠地解决问题。因为这是唯一一个我被给予继续下去,我觉得这需要追求,因为我可能只是以错误的方式实现了它,我需要方向。我的意思是,你给出的stacktrace与
SystemChrome
完全无关。这与在
中使用
主题
有关。谢谢你的回复,雷米,我很感激。但我不知道你们的意思,在我上面展示的dispose方法中,并没有任何和主题相关的内容。它应该删除屏幕之间的屏幕方向。错误是因为
Navigator
dispose
之后调用的。据我所知,框架为您调用
dispose()
,您不应该自己调用它。通常在你推一条路线后,旧路线仍然存在。可能在它自己调用的函数中取消设置方向,而不是
dispose
onPressed: () {
    dispose();
    Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondScreen()),
);