flutter:在屏幕锁定时识别方向



在谷歌上搜索这个会得到成千上万篇不相关的文章,比如设置或锁定一个特定的方向。

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

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

不起作用。OrientationBuilder也是如此——这些似乎取决于手机认为它处于什么模式。

我看到了传感器包,我确信我最终能让它工作,但感觉有点像用火箭筒杀死蚊子。我希望当我试图谷歌这个问题时,我错过了一些简单的东西。

好吧,所以使用传感器包并不是那么困难。只需要使用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');
}
}
//...

我可能会添加一些迟滞,使它更干净,但这是一个工作的解决方案。

添加这一行来设置您的屏幕在initState中显示SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]);SystemChrome.setPreferredOrientations([DeviceOrientation.portaitUp]);为纵向模式。

注意:如果你不添加Info.plist,它可能不适用于iOS设备这些线

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

最新更新