尝试使用谷歌搜索会产生数千篇不相关的文章,例如设置或锁定特定方向。
我的问题是,虽然手机的方向被锁定为纵向模式,但屏幕被侧向转动,有没有办法检测到这种移动并调整屏幕上的小部件作为响应?
类似的东西
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 包,我相信我最终可以让它工作,但感觉有点像用火箭筒杀死一只蚊子。我希望在尝试用谷歌搜索这个问题时我错过了一些简单的东西。
答案 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]);
中的 initState
或 SystemChrome.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');
}
}
//...
我可能会为此添加一些滞后以使其更清晰,但这是一个可行的解决方案。