在Flutter应用中为每个屏幕设置不同的方向会导致巨大的延迟

时间:2019-01-26 01:53:52

标签: flutter orientation

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

感觉这两个设置相互冲突,一旦我设置了横向设置,应用程序就会从瞬时响应变为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();
  }

我也在initState中尝试过使用Future,但是每次的错误都是相同的。

在onPress中调用Dispose:

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

与我完全一样,我已将SecondScreen转换为一个statefulwidget,使用initstate设置为landscape,并以完全相同的方式进行处置。

1 个答案:

答案 0 :(得分:2)

请勿在{{1​​}}方法内放置对SystemChrome的任何调用。使屏幕从build()延伸。用StatefulWidget触发SystemChrome内部的initState()呼叫。