Flutter Module接入iOS原生工程坑点记录

490 阅读2分钟

前提:以下问题基于使用FlutterEngineGroup接入到原生工程所出现的问题

pod install 显示 Invalid Podfile file: cannot load such file -- ../test_flutter_module/.iOS/Flutter/podhelper.rb.

  • 1、test_flutter_module目录执行:flutter clean
  • 2、test_flutter_module目录执行:flutter pub upgrade
  • 3、cd到宿主目录执行:pod install,(有可能会在pod之前执行pod repo update等

FlutterEngineGroup debug环境 flutter module内存每打开一个很多

这种情况是正常的,原因是debug时,需要加载大量调试的数据,所以造成内存过多。但是在release包时,内存问题会被优化

混合工程release包打出来是白屏

这种情况分两种: 1.一直是白屏 2.第一次不是白屏,后面再进去就白屏

  • 第一种情况: 大概率是和你本地ruby版本有关,Ruby导致pod install后,再打包时没有对应的app.framework。后面降级ruby后,问题解决,打包正常。我的电脑是M1的, 出现这种情况,具体解决请参考这个链接# Flutter Library not loaded: @rpath/App.framework/App

  • 第二种情况: 因为flutter侧在打开时还没获取到size,解决如下

flutter main.dart文件中:在打开页面时判断是否有size,没有就等有size再去渲染,

import 'dart:ui';//注意这个要import

@pragma('vm:entry-point')
void test_page() => handleRelesaeWhiteScreen('test_page');

//处理release包白屏问题
void handleRelesaeWhiteScreen(String entryPoint) {
  //如果size是0,则设置回调,在回调中runApp
  if (window.physicalSize.isEmpty) {
    window.onMetricsChanged = () {
      //在回调中,size仍然有可能是0
      if (!window.physicalSize.isEmpty) {
        window.onMetricsChanged = null;
        runApp(Main(entryPoint: entryPoint));
      }
    };
  } else {
    //如果size非0,则直接runApp
    runApp(Main(entryPoint: entryPoint));
  }
}

使用navigationController push flutter页面时,导航栏还是iOS原生的

截屏2022-04-26 下午12.36.09.png 解决

[self.navigationController pushViewController:flutterViewController animated:YES];
//隐藏导航栏
self.navigationController.navigationBarHidden = YES;

截屏2022-04-26 下午12.36.39.png

原生和flutter之间调试==> flutter attach 无效

xcode 先clean下,再确认下install_framework "${PODS_ROOT}/../../test_flutter_module/.ios/Flutter/App.framework" 是否填写

第一次打开flutter Module会黑屏一下

  • 法一:使用 present的形式打开
  • 法二:可以基于FlutterViewController类写一个子类,子类vc中viewDidLoad方法里面设置背景色
@interface FlutterBaseViewController: FlutterViewController
end

@implementation FlutterBaseViewController
- (instancetype)initWithEntryPoint:(NSString *)entryPoint {
    FlutterEngineGroup *gruop = ((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngineGroup;
    FlutterEngine *engine = [gruop makeEngineWithEntrypoint:entryPoint libraryURI:nil];
    [GeneratedPluginRegistrant registerWithRegistry:engine];
    self = [super initWithEngine:engine nibName:nil bundle:nil];
    if (self) {
    }
    return  self;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    //设置合适的颜色
    self.view.backgroundColor = [UIColor whiteColor];
}

原生跳FlutterVC, 当FlutterVC内部有路由栈有多个page时,右滑手势会直接返回原生页面