颤振:锁定屏幕时识别方向

时间:2021-02-11 06:47:43

标签: flutter dart

尝试使用谷歌搜索会产生数千篇不相关的文章,例如设置或锁定特定方向。

我的问题是,虽然手机的方向被锁定为纵向模式,但屏幕被侧向转动,有没有办法检测到这种移动并调整屏幕上的小部件作为响应?

类似的东西

if (MediaQuery.of(context).orientation == Orientation.portrait) {
      return Text('text', style: TextStyle(fontSize: 200));
    } else {
      return Text('flipped text', style: TextStyle(fontSize: 200));
    }

不起作用。与 OrientationBuilder 相同 - 这些似乎取决于手机认为它处于什么模式。

我看到有 sensors 包,我相信我最终可以让它工作,但感觉有点像用火箭筒杀死一只蚊子。我希望在尝试用谷歌搜索这个问题时我错过了一些简单的东西。

3 个答案:

答案 0 :(得分:0)

首先导入服务包:

import 'package:flutter/services.dart';

这将使您能够访问 SystemChrome 类,该类“控制操作系统图形界面的特定方面以及它如何与应用程序交互。”

加载小部件时,请执行以下操作:

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

然后当我离开页面时,像这样让它恢复正常:

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

答案 1 :(得分:0)

添加此行以将您的屏幕设置为 SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]); 中的 initStateSystemChrome.setPreferredOrientations([DeviceOrientation.portaitUp]); 用于纵向模式。

注意: 如果您不添加 Info.plist 这些行

<array>
<string>UIInterfaceOrientationPortrait</string>
</array>

答案 2 :(得分:0)

好吧,毕竟使用传感器包并不困难。只需要使用 accelerometer 值的第二个坐标并比较它是否大于 ~4(我假设这是 m/s^2,因为静止值为 ~9)。

所以添加的代码是这样的:

class _SampleScreenState extends State<SampleScreen> {
  //...
  List<double> _accelerometerValues;
  List<StreamSubscription<dynamic>> _streamSubscriptions =
      <StreamSubscription<dynamic>>[];

  //...

  void initState() {
    //...

    _streamSubscriptions
        .add(accelerometerEvents.listen((AccelerometerEvent event) {
      setState(() {
        _accelerometerValues = <double>[event.x, event.y, event.z];
      });
    }));
  }

  //...

  sampleWidget() {
    if (_accelerometerValues[1] > 4) {
      return Text('portrait');
    } else {
      return Text('landscape');
    }
  }

  //...

我可能会为此添加一些滞后以使其更清晰,但这是一个可行的解决方案。