[Bug]: 执行代理跳转创建FBFlutterViewContainer时候卡死,也不闪退就是卡死整个app动不了
请描述遇到的问题,以及您所期望的正确的结果
在按照配置初始化flutterboost后,按钮点击执行[[FlutterBoost instance]open:options]; 触发代理pushFlutterRoute 在pushFlutterRoute方法中 创建FBFlutterViewContainer *vc = [[FBFlutterViewContainer alloc] init]; 程序卡死在这里,FBFlutterViewContainer.m中所有方法断点后都没执行,无法进行任何操作,这是个别机型版本会出现的问题。我这里用到的是13pro 18.3.2系统版本。为什么少部分机型会出现这样的问题,而且同一种机型也不是每个都会出问题。
请说明如何操作会遇到上述问题
正常的点击原生事件触发跳转到flutter模块的操作,在少部分机型会复现此问题。复现率很低,但是某一手机有问题的话会100%复现,一定卡死。卸载app重装等都没用。
在下面填入关键复现代码
-
(void)pushFlutterRoute:(FlutterBoostRouteOptions *)options {
*//执行FBFlutterViewContainer vc = [[FBFlutterViewContainer alloc] init];的时候直接卡死
FBFlutterViewContainer *vc = [[FBFlutterViewContainer alloc] init];
[vc setName:options.pageName uniqueId:options.uniqueId params:options.arguments opaque:options.opaque];
//是否伴随动画 BOOL animated = YES; NSNumber * animatedValue = options.arguments[@"animated"]; if(animatedValue){ animated = [animatedValue boolValue]; }
BOOL present = [options.arguments[@"present"] boolValue] || !options.opaque;
if(present){ [self.navigationController presentViewController:vc animated:animated completion:^{ options.completion(YES); }]; }else{ [self.navigationController pushViewController:vc animated:animated]; options.completion(YES); } }
复现的平台
iOS
Flutter SDK版本
3.27.0
FlutterBoost版本
4.6.5
是否延迟初始化FlutterBoost
No
解决方案
大佬,有解决方案吗? 我这也是 到这儿就不往下走了 let vc: FBFlutterViewContainer = FBFlutterViewContainer()
我也是遇见,还没解决,在线等。
可以看看你的delegate咋写的吗
问题解决了吗,遇见一样情况,同问。
看堆栈是 flutter内部死锁了 flutter version >= 3.27.0 都有问题
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
* frame #0: 0x0000000110703564 libsystem_kernel.dylib`__psynch_mutexwait + 8
frame #1: 0x000000010f97fb10 libsystem_pthread.dylib`_pthread_mutex_firstfit_lock_wait + 80
frame #2: 0x000000010f97d6b4 libsystem_pthread.dylib`_pthread_mutex_firstfit_lock_slow + 216
frame #3: 0x0000000119f419cc Flutter`std::_fl::mutex::lock() + 12
frame #4: 0x0000000119ede9b4 Flutter`flutter::PlatformViewIOS::SetOwnerViewController(fml::WeakNSObject<FlutterViewController> const&) + 36
frame #5: 0x0000000119ece308 Flutter`-[FlutterEngine notifyViewControllerDeallocated] + 120
frame #6: 0x00000001804110e4 CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 120
frame #7: 0x000000018041101c CoreFoundation`___CFXRegistrationPost_block_invoke + 88
frame #8: 0x0000000180410504 CoreFoundation`_CFXRegistrationPost + 404
frame #9: 0x000000018040fef0 CoreFoundation`_CFXNotificationPost + 696
frame #10: 0x00000001810a6290 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 88
frame #11: 0x0000000119ed7a7c Flutter`-[FlutterViewController deregisterNotifications] + 72
frame #12: 0x0000000119ed7af0 Flutter`-[FlutterViewController dealloc] + 76
frame #13: 0x0000000119f12b40 Flutter`flutter::AccessibilityBridge::~AccessibilityBridge() + 212
frame #14: 0x0000000119ede3f8 Flutter`std::_fl::unique_ptr<flutter::AccessibilityBridge, std::_fl::default_delete<flutter::AccessibilityBridge>>::reset[abi:v15000](flutter::AccessibilityBridge*) + 28
frame #15: 0x0000000119ede3c8 Flutter`flutter::PlatformViewIOS::AccessibilityBridgeManager::Clear() + 60
frame #16: 0x0000000119ede9e4 Flutter`flutter::PlatformViewIOS::SetOwnerViewController(fml::WeakNSObject<FlutterViewController> const&) + 84
frame #17: 0x0000000119ece05c Flutter`-[FlutterEngine setViewController:] + 168
frame #18: 0x000000010de31cd8 flutter_boost`-[FBFlutterViewContainer init](self=0x000000014c0cd800, _cmd="init") at FBFlutterViewContainer.m:81:10
解决方案: 关闭引擎预热
let delegate = BoostDelegate()
let options = FlutterBoostSetupOptions.createDefault()
options?.warmUpEngine = false
FlutterBoost.instance().setup(application, delegate: delegate, callback: { _ in }, options: options)
解决方案: 关闭引擎预热
let delegate = BoostDelegate() let options = FlutterBoostSetupOptions.createDefault() options?.warmUpEngine = false FlutterBoost.instance().setup(application, delegate: delegate, callback: { _ in }, options: options)
禁了预热以后,现在退到后台时不时会崩溃
解决方案: 关闭引擎预热
let delegate = BoostDelegate() let options = FlutterBoostSetupOptions.createDefault() options?.warmUpEngine = false FlutterBoost.instance().setup(application, delegate: delegate, callback: { _ in }, options: options)禁了预热以后,现在退到后台时不时会崩溃
我们测试了一段时间没出现过,有堆栈吗?
FlutterBoost.m 中的预热引擎方法如下:
/// 提前预热引擎
- (void)warmUpEngine {
FlutterViewController* vc = [[FlutterViewController alloc] initWithEngine:self.engine
nibName:nil bundle:nil];
//卡死页面的代码地方
//下面这几行代码的调用时机应在在addChildVC后,没有addChildVC直接调用会有问题
[vc beginAppearanceTransition:YES animated:NO];
[vc endAppearanceTransition];
[vc beginAppearanceTransition:NO animated:NO];
[vc endAppearanceTransition];
}
解决方法:
- 初始化时关闭预热
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let ops:FlutterBoostSetupOptions = FlutterBoostSetupOptions()
//关闭预热
ops.warmUpEngine = false
let delegate = MyBoostAppDelegate.shared
FlutterBoost.instance().setup(application, delegate: delegate, callback: { engine in
}, options: ops)
return true
}
- 手动预热,最好在window的根控制器中,或其他控制器中,自己根据情况选择
ViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
//手动预热
if let eg = FlutterBoost.instance().engine() {
let vc = FBFlutterViewContainer(engine: eg, nibName: nil, bundle: nil)
//隐藏视图
vc.view.isHidden = true
self.addChild(vc)
vc.beginAppearanceTransition(true, animated: false)
vc.endAppearanceTransition()
vc.beginAppearanceTransition(false, animated: false)
vc.endAppearanceTransition()
}
flutter 3.27.4,flutter_boost 4.2.0, 我按照上面关闭了预热, 但是部分机型仍有问题