返回首页时如何设置首选方向

时间:2019-07-12 07:07:47

标签: flutter dart

如何在按返回按钮时无法固定屏幕方向?

此处输入代码:https://github.com/iyansr/traffic-manager-master

我已经在两个页面上的void initState()的内部和外部设置了Orientation,但是当我返回首页时,屏幕方向仍然无法显示。

我希望首页始终处于potrait模式 第二页总是风景

在home.dart上

...
  @override
  void initState() {
    super.initState();
    // Set portrait orientation
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitDown,
      DeviceOrientation.portraitUp,
    ]);

    _dateTime = DateTime.parse(initDate);
  }
...

在counterpage.dart(横向)上:

class _CounterPageState extends State<CounterPage> {
  @override
  void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
    ]);
  }
...

3 个答案:

答案 0 :(得分:1)

当您返回时,不会调用

initState(),因为您的旧页面仍在创建但未激活。也许这里最简单的结果将在第二个屏幕的dispose()方法中称为setPrefferedOrintations()。

class _CounterPageState extends State<CounterPage> {
  @override
  void initState() {
    super.initState();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.landscapeRight,
    ]);
  }

  @override
  void dispose() {
    // Set portrait orientation
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitDown,
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }
}

答案 1 :(得分:0)

您还可以简单地在返回的任何页面的State.dispose方法中执行SystemChrome.setPreferredOrientations调用。这意味着Navigator弹出页面时将设置方向。
对于您的情况,您希望在离开CounterPage时将首选方向重新设置为横向,这意味着您必须添加以下代码:

class _CounterPageState extends State<CounterPage> {
  @override
  void dispose() {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitDown,
      DeviceOrientation.portraitUp,
    ]);
    super.dispose();
  }

  // ...
}

如果您要从主页导航至其他页面,则这些页面还需要使用其dispose方法将首选方向设置回potrait。

答案 2 :(得分:0)

不幸的是,在我的情况下,dispose方法无法正常工作,我所做的是在导航至横向页面时使用的'then'回调并在那里重置了我的首选方向(即纵向模式),该回调方法将在您从横向页面返回导航,从而在首页中重置了首选方向;

  onTap: () {
                Navigator.of(context)
                    .pushNamed('/horizontalModePage')
                    .then((_) => SystemChrome.setPreferredOrientations([
                          DeviceOrientation.portraitDown,
                          DeviceOrientation.portraitUp,
                        ]));