flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

[Bug]: iOS: 原生控制器嵌入一块FBFlutterViewContainer,当控制器返回时原生控制器走了deinit,但是FBFlutterViewContainer没有释放

Open MichaelSSY opened this issue 4 months ago • 4 comments

请描述遇到的问题,以及您所期望的正确的结果

flutter version: 3.10.6 iOS : swift

一个原生控制器,上半部分是原生的,下半部分嵌入一块FBFlutterViewContainer,当返回时该原生控制器走了deinit,但是 FBFlutterViewContainer没有走 dealloc 。期望 FBFlutterViewContainer 能够正常释放。

请说明如何操作会遇到上述问题

No response

在下面填入关键复现代码

// // NativeViewController.swift // Runner // // Created by Apple on 2025/8/19. //

import Foundation import UIKit import flutter_boost import MCommonBiz

class NativeViewController: MCBaseViewController { var flutterContainer: FBFlutterViewContainer?

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "测试"
    setupFlutterView()
}

private func setupFlutterView() {
    // 创建 Flutter 容器
    let container = FBFlutterViewContainer()
    container?.setName("catalog/detail", uniqueId: nil, params: nil, opaque: true)
    
    // 添加为子控制器
    addChild(container!)
    view.addSubview(container!.view)
    container?.didMove(toParent: self)
    container?.view.frame = CGRect(x: 0,
                                   y: 200,
                                   width: Screen.width,
                                   height: Screen.height - 200)
    
    self.flutterContainer = container
}

deinit {
    flutterContainer?.detachFlutterEngineIfNeeded()
    flutterContainer?.notifyWillDealloc()
    flutterContainer?.removeFromParent()
    flutterContainer?.view.removeFromSuperview()
    flutterContainer = nil
    print("✅ NativeViewController deallocated")
}

}

复现的平台

iOS

Flutter SDK版本

3.10.6

FlutterBoost版本

4.6.3

是否延迟初始化FlutterBoost

No

解决方案

MichaelSSY avatar Aug 19 '25 08:08 MichaelSSY

解决这个问题了么兄弟,我也遇到了

ctl0809 avatar Sep 09 '25 08:09 ctl0809

解决这个问题了么兄弟,我也遇到了

没有解决,我跑的是官方demo,确实存在内存泄漏。flutter页面走了dispose,壳控制器也走了deinit,就是FBFlutterViewContainer控制器没有释放。

MichaelSSY avatar Sep 12 '25 06:09 MichaelSSY

解决这个问题了么兄弟,我也遇到了

没有解决,我跑的是官方demo,确实存在内存泄漏。flutter页面走了dispose,壳控制器也走了deinit,就是FBFlutterViewContainer控制器没有释放。

我这边解决了,不知道是不是跟你的场景一样,你可以试下我的方法。deinit { print("\(type(of: self).description()) ----- deinit") // 如果有这个页面就释放 if YHAuthority.saleStatistics.isAuthed { newSaleStatisticsVC.detachFlutterEngineIfNeeded() newSaleStatisticsVC.notifyWillDealloc() } } 在 UITabBarController 的 deinit 里面手动释放

ctl0809 avatar Sep 13 '25 01:09 ctl0809

解决这个问题了么兄弟,我也遇到了

没有解决,我跑的是官方demo,确实存在内存泄漏。flutter页面走了dispose,壳控制器也走了deinit,就是FBFlutterViewContainer控制器没有释放。

我这边解决了,不知道是不是跟你的场景一样,你可以试下我的方法。deinit { print("\(type(of: self).description()) ----- deinit") // 如果有这个页面就释放 if YHAuthority.saleStatistics.isAuthed { newSaleStatisticsVC.detachFlutterEngineIfNeeded() newSaleStatisticsVC.notifyWillDealloc() } } 在 UITabBarController 的 deinit 里面手动释放

按说场景差不多,只不过你是将FBFlutterViewContainer添加在UITabBarController上,我是将FBFlutterViewContainer添加在UIViewController上的。同样也做了释放操作,但是FBFlutterViewContainer就是没有走 - (void)dealloc{}。真是奇怪了!!!

  • (void)dealloc{ [self.flutterContainer didMoveToParentViewController:nil]; [self.flutterContainer detachFlutterEngineIfNeeded]; [self.flutterContainer notifyWillDealloc]; }

MichaelSSY avatar Sep 16 '25 02:09 MichaelSSY