screen_handler.dart 1.6 KB
import 'package:appframe/services/dispatcher.dart';
import 'package:flutter/services.dart' hide MessageHandler;

class ScreenHandler extends MessageHandler {
  /// 是否处于横屏全屏状态
  bool _isLandscape = false;

  @override
  Future<dynamic> handleMessage(dynamic params) async {
    if (params is! Map<String, dynamic>) {
      throw Exception('参数错误');
    }

    int type = params['type'];
    await _setOrientation(type);

    return true;
  }

  Future<void> _setOrientation(int screenType) async {
    if (screenType == 2) {
      // 横屏模式
      _isLandscape = true;
      await SystemChrome.setPreferredOrientations([
        DeviceOrientation.landscapeLeft,
        DeviceOrientation.landscapeRight,
      ]);
      // 隐藏状态栏(immersiveSticky:短暂显示后自动隐藏)
      await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
      // 监听系统UI变化,用户滑动唤出状态栏后立即重新隐藏
      SystemChrome.setSystemUIChangeCallback((isSystemUIDefaultVisible) async {
        if (_isLandscape && isSystemUIDefaultVisible) {
          await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
        }
      });
    } else {
      // 竖屏模式(默认)
      _isLandscape = false;
      await SystemChrome.setPreferredOrientations([
        DeviceOrientation.portraitUp,
        DeviceOrientation.portraitDown,
      ]);
      // 显示状态栏
      await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
      // 移除系统UI变化监听
      SystemChrome.setSystemUIChangeCallback(null);
    }
  }
}