flutter如何监听屏幕旋转
在Flutter开发中,如何实时监听设备屏幕旋转事件?当用户旋转手机横竖屏时,如何获取当前屏幕方向并动态调整UI布局?是否有类似OrientationBuilder之外的更底层监听方案?官方文档提到的SystemChrome.setPreferredOrientations()只能限制方向,但无法实时监听变化。求具体实现方案和代码示例。
2 回复
在Flutter中,使用WidgetsBindingObserver监听屏幕旋转。重写didChangeMetrics方法,通过MediaQuery.of(context).orientation获取屏幕方向。
更多关于flutter如何监听屏幕旋转的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中监听屏幕旋转可以通过以下几种方式实现:
1. 使用 OrientationBuilder(推荐)
OrientationBuilder(
builder: (context, orientation) {
// orientation 可以是 Orientation.portrait 或 Orientation.landscape
if (orientation == Orientation.portrait) {
return Text('竖屏模式');
} else {
return Text('横屏模式');
}
},
)
2. 使用 MediaQuery
@override
Widget build(BuildContext context) {
final orientation = MediaQuery.of(context).orientation;
return Scaffold(
body: Center(
child: Text(
orientation == Orientation.portrait ? '竖屏' : '横屏',
style: TextStyle(fontSize: 24),
),
),
);
}
3. 监听屏幕旋转变化
class ScreenOrientationPage extends StatefulWidget {
@override
_ScreenOrientationPageState createState() => _ScreenOrientationPageState();
}
class _ScreenOrientationPageState extends State<ScreenOrientationPage> with WidgetsBindingObserver {
Orientation? _currentOrientation;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
_currentOrientation = MediaQuery.of(context).orientation;
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeMetrics() {
final newOrientation = MediaQuery.of(context).orientation;
if (newOrientation != _currentOrientation) {
setState(() {
_currentOrientation = newOrientation;
});
print('屏幕方向已改变: $newOrientation');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('屏幕旋转监听')),
body: Center(
child: Text(
_currentOrientation == Orientation.portrait ? '当前是竖屏' : '当前是横屏',
style: TextStyle(fontSize: 20),
),
),
);
}
}
4. 强制锁定屏幕方向
如果需要锁定屏幕方向,可以使用 services 包:
import 'package:flutter/services.dart';
// 锁定为竖屏
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);
// 锁定为横屏
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
// 恢复自动旋转
SystemChrome.setPreferredOrientations([]);
推荐使用 OrientationBuilder,因为它专门为此场景设计,性能更好且使用简单。

