diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 6266644..0a06997 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -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 + } } diff --git a/lib/pages/http/HttpManager.dart b/lib/pages/http/HttpManager.dart index bbd03e1..0811268 100644 --- a/lib/pages/http/HttpManager.dart +++ b/lib/pages/http/HttpManager.dart @@ -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 = {}; - 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, diff --git a/lib/tools/tools.dart b/lib/tools/tools.dart index ee8fd8a..052e3ef 100644 --- a/lib/tools/tools.dart +++ b/lib/tools/tools.dart @@ -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'; @@ -396,4 +397,14 @@ class NoDataWidget { ); } +} +class NativeOrientation { + static const MethodChannel _channel = MethodChannel('app.orientation'); + + static Future setLandscape() async { + await _channel.invokeMethod('setOrientation', 'landscape'); + } + static Future setPortrait() async { + await _channel.invokeMethod('setOrientation', 'portrait'); + } } \ No newline at end of file