iOS集成Flutter使用FlutterEngine來降低內存使用
要使用Flutter,就必須iOS項目加入Flutter。
然后iOS與Flutter相互通信,在跳轉多次跳轉Flutter之后,發現iOS使用內存每次升50~~60M內存,這樣子經過多次跳轉勢必會造成iOS閃退,不利于開發。
下面我們看下由iOS與Flutter相互通信的交互視頻,來看下每次跳轉的內存上升。
怎么能夠降低這個內存使用呢?這里我們就使用FlutterEngine來保證跳轉flutter的時候內存穩定在50~~60M。
首先,要先聲明FlutterEngine對象:
//聲明FlutterEngine對象
@property (nonatomic, strong) FlutterEngine *flutterEngin;
然后,實現FlutterEngine兌現的懶加載:
#pragma mark -- Lazy method
- (FlutterEngine *)flutterEngin {
if (nil == _flutterEngin) {
FlutterEngine *flutterEngin = [[FlutterEngine alloc] initWithName:@"flutter_native" project:nil];
[flutterEngin runWithEntrypoint:nil];
[GeneratedPluginRegistrant registerWithRegistry:flutterEngin];
_flutterEngin = flutterEngin;
}
return _flutterEngin;
}
接下來,聲明一個btn,通過這個btn使用FlutterEngine跳轉進Flutter頁面,只要使用了FlutterEngine來進行跳轉,不管跳轉多少次,內存都只會增長一次。
要使用FlutterEngine就需要在聲明FlutterViewController的時候使用FlutterEngine,然后再聲明FlutterMethodChannel和FlutterEventChannel來實現原生和flutter的雙向通信,詳細代碼如下:
/**
使用FlutterEngine跳轉Flutter
*/
- (IBAction)use_flutter_engin_btn_click:(id)sender {
FlutterViewController *flvc = [[FlutterViewController alloc] initWithEngine:self.flutterEngin nibName:nil bundle:nil];
//單項通信管道,Flutter向原生發送消息
FlutterMethodChannel *messageChannel = [FlutterMethodChannel methodChannelWithName:@"com.flutterToNative" binaryMessenger:flvc];
__weak typeof(self) weakSelf = self;
[messageChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) {
if ([@"backToNative" isEqualToString:call.method]) {
[weakSelf dismissViewControllerAnimated:true completion:nil];
}
}];
//單項通信管道,原生向Flutter發送消息
FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:@"com.nativeToFlutter" binaryMessenger:flvc];
[eventChannel setStreamHandler:self];
[self presentViewController:flvc animated:true completion:nil];
}
#pragma mark -- FlutterStreamHandler代理
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
eventSink:(FlutterEventSink)events {
if (events) {
self.eventSink = events;
self.eventSink(@"從原生傳遞過來的消息。。。。。。。");
}
return nil;
}
// 不再需要向Flutter傳遞消息
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
return nil;
}
#pragma mark -- Lazy method
- (FlutterEngine *)flutterEngin {
if (nil == _flutterEngin) {
FlutterEngine *flutterEngin = [[FlutterEngine alloc] initWithName:@"flutter_native" project:nil];
[flutterEngin runWithEntrypoint:nil];
[GeneratedPluginRegistrant registerWithRegistry:flutterEngin];
_flutterEngin = flutterEngin;
}
return _flutterEngin;
}
最后看一下運行起來的效果:
從運行結果可以看出,運行內存在第一次跳轉到flutter頁面升高之后,后續就相對于穩定。
至于為什么在跳轉flutter的時候內存會猛的增高,這是因為FlutterEngine對象在跳轉完Flutter再回到iOS的時候,FlutterEngine沒有釋放掉,是google關于Flutter對iOS支持的一個bug,希望后續這個問題會在存在。
到這里就實現了單引擎使用FlutterEngine來穩定內存的實現,后續各位在實現的時候,可以把FlutterEngine聲明在AppDelegate.h文件中,或者專門聲明一個FlutterManager的單利來實現整個iOS系統內只有一份FlutterEngine。