屏幕旋转
parent
4727e01e89
commit
3b95b8b58d
|
@ -1,13 +1,77 @@
|
|||
import Flutter
|
||||
import UIKit
|
||||
import Flutter
|
||||
|
||||
@main
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
// 动态方向掩码(默认竖屏)
|
||||
static var orientationMask: UIInterfaceOrientationMask = .portrait
|
||||
|
||||
override func application(
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
|
||||
let controller = window?.rootViewController as! FlutterViewController
|
||||
let channel = FlutterMethodChannel(name: "app.orientation",
|
||||
binaryMessenger: controller.binaryMessenger)
|
||||
|
||||
channel.setMethodCallHandler { [weak self] call, result in
|
||||
guard let self = self else { return }
|
||||
|
||||
if call.method == "setOrientation" {
|
||||
guard let arg = call.arguments as? String else {
|
||||
result(FlutterError(code: "BAD_ARGS", message: "need 'landscape' | 'portrait'", details: nil))
|
||||
return
|
||||
}
|
||||
|
||||
// 先更新允许的方向掩码
|
||||
if arg == "landscape" {
|
||||
AppDelegate.orientationMask = .landscape
|
||||
} else if arg == "portrait" {
|
||||
AppDelegate.orientationMask = .portrait
|
||||
} else {
|
||||
result(FlutterError(code: "BAD_ARGS", message: "unknown arg", details: nil))
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
// 再请求实际旋转
|
||||
if #available(iOS 16.0, *) {
|
||||
// 通知顶层 VC:其 supportedInterfaceOrientations 需要刷新
|
||||
self.window?.rootViewController?.setNeedsUpdateOfSupportedInterfaceOrientations()
|
||||
|
||||
if let scene = self.window?.windowScene {
|
||||
let orientations: UIInterfaceOrientationMask =
|
||||
(arg == "landscape") ? .landscape : .portrait
|
||||
do {
|
||||
try scene.requestGeometryUpdate(.iOS(interfaceOrientations: orientations))
|
||||
} catch {
|
||||
result(FlutterError(code: "GEOMETRY_UPDATE_FAILED",
|
||||
message: error.localizedDescription, details: nil))
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let target: UIInterfaceOrientation =
|
||||
(arg == "landscape") ? .landscapeLeft : .portrait
|
||||
UIDevice.current.setValue(target.rawValue, forKey: "orientation")
|
||||
UIViewController.attemptRotationToDeviceOrientation()
|
||||
}
|
||||
|
||||
result(true)
|
||||
} else {
|
||||
result(FlutterMethodNotImplemented)
|
||||
}
|
||||
}
|
||||
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
|
||||
// 关键:把当前的掩码提供给系统
|
||||
override func application(_ application: UIApplication,
|
||||
supportedInterfaceOrientationsFor window: UIWindow?)
|
||||
-> UIInterfaceOrientationMask {
|
||||
return AppDelegate.orientationMask
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,17 +86,13 @@ class HttpManager {
|
|||
}) async {
|
||||
Response resp;
|
||||
final url = baseUrl + path;
|
||||
final options = Options(
|
||||
method: method.name.toUpperCase(),
|
||||
contentType: headerType,
|
||||
);
|
||||
|
||||
try {
|
||||
switch (method) {
|
||||
case Method.get:
|
||||
final queryParameters = <String, dynamic>{};
|
||||
if (params != null) queryParameters.addAll(params);
|
||||
if (data != null) queryParameters.addAll(data);
|
||||
if (params != null && params.isNotEmpty) queryParameters.addAll(params);
|
||||
if (data != null && data.isNotEmpty) queryParameters.addAll(data);
|
||||
resp = await _dio.get(
|
||||
url,
|
||||
queryParameters: queryParameters,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'dart:math';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
|
||||
|
@ -397,3 +398,13 @@ class NoDataWidget {
|
|||
}
|
||||
|
||||
}
|
||||
class NativeOrientation {
|
||||
static const MethodChannel _channel = MethodChannel('app.orientation');
|
||||
|
||||
static Future<void> setLandscape() async {
|
||||
await _channel.invokeMethod('setOrientation', 'landscape');
|
||||
}
|
||||
static Future<void> setPortrait() async {
|
||||
await _channel.invokeMethod('setOrientation', 'portrait');
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue