如何在颤振中收听 UIA应用生命周期 iOS



我想检测我的 iOS 应用程序写入颤振移动到后台并在前台。我习惯于WidgetsBindingObserver来监听颤振中的生命周期。但它并不完全符合我的期望。当我在颤振应用程序生命周期中推送本机控制器时,触发器AppLifecycle State.已暂停,但我的应用程序正在运行。有人刚刚遇到过这个问题吗?以及您解决问题的方式。谢谢

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if(state == AppLifecycleState.paused) {
_viewModel.applicationMoveToBackground();
} else if(state == AppLifecycleState.resumed) {
_viewModel.applicationMoveToForeground();
}
}

我通过使用FlutterBasicMessageChannel的解决方法来发出iOSUIApplication生命周期来解决此问题。 在 iOS 运行器应用程序中:

import UIKit
import Flutter
@UIApplicationMain@objc class AppDelegate: FlutterAppDelegate {
var applicationLifeCycleChannel: FlutterBasicMessageChannel!
override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
GeneratedPluginRegistrant.register(with: self)
applicationLifeCycleChannel = FlutterBasicMessageChannel(
name: "applicationLifeCycle",
binaryMessenger: (window.rootViewController as! FlutterViewController).binaryMessenger,
codec: FlutterStringCodec.sharedInstance())
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
override func applicationWillTerminate(_ application: UIApplication) {
applicationLifeCycleChannel.sendMessage("applicationWillTerminate")
}
override func applicationWillEnterForeground(_ application: UIApplication) {
applicationLifeCycleChannel.sendMessage("applicationWillEnterForeground")
}
override func applicationDidEnterBackground(_ application: UIApplication) {
applicationLifeCycleChannel.sendMessage("applicationDidEnterBackground")
}
}

在颤振应用中:

static const applicationLifecycleChannel = BasicMessageChannel<String>('applicationLifeCycle', StringCodec());
static const kApplicationWillTerminate = 'applicationWillTerminate';
static const kApplicationWillEnterForeground = 'applicationWillEnterForeground';
static const kApplicationDidEnterBackground = 'applicationDidEnterBackground';
@override
void initState() {
applicationLifecycleChannel.setMessageHandler((message) async {
switch(message) {
case kApplicationWillTerminate:
break;
case kApplicationWillEnterForeground:
_viewModel.applicationMoveToForeground();
break;
case kApplicationDidEnterBackground:
_viewModel.applicationMoveToBackground();
break;
default:
break;
}
return message;
});
super.initState();
}

您是否正在使用 WidgetsBindingObserver?

class _PageState extends State<Page> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if(state == AppLifecycleState.paused) {
_viewModel.applicationMoveToBackground();
} else if(state == AppLifecycleState.resumed) {
_viewModel.applicationMoveToForeground();
}
}
}

最新更新