Flutter和Native混合開(kāi)發(fā),F(xiàn)luuter和Native方法互相調(diào)用很容易出現(xiàn)內(nèi)存問(wèn)題,網(wǎng)上的很多例子都是不全的?。】催@篇就夠了??!
flutter側(cè):調(diào)用Native的xxx方法
Map<String,dynamic> tmp = Map<String,dynamic>();
try {
/// 調(diào)用Native的方法xxx
FlutterBoost.singleton.channel.sendEvent('xxx', tmp);
} catch (e) {
}
iOS側(cè):監(jiān)聽(tīng)flutter 調(diào)用的xxx方法
// 監(jiān)聽(tīng)來(lái)自flutter的事件 xxx
FLBVoidCallback __block xxxBlock = [FlutterBoostPlugin.sharedInstance addEventListener:^(NSString *name, NSDictionary *arguments) {
if([name isEqualToString:@"xxx"]) {
/// 回調(diào)給flutter,flutter需要監(jiān)聽(tīng)aaa(即: Native調(diào)用Flutter方法aaa)
[FlutterBoostPlugin.sharedInstance sendEvent:@"aaa" arguments:@{@"a":@"a",@"b":@"b"}];
}
/// 這一行很多網(wǎng)上都沒(méi)寫(xiě) 但是是需要的 用完了就釋放
xxxBlock();
} forName:@"xxx"];
flutter側(cè):監(jiān)聽(tīng)Native的aaa回調(diào)方法(在widget的initState() 中寫(xiě))
bool _status = false;
/// 這一個(gè)很多網(wǎng)上都沒(méi)有 但是這個(gè)是必須的 需要在dispose中釋放
VoidCallback aaaCallBack;
/// 監(jiān)聽(tīng)Native側(cè)的事件-aaa
aaaCallBack = FlutterBoost.singleton.channel.addEventListener('aaa',
(name, arguments){
/// 刷新界面
String a = arguments['a'];
String b = arguments['b'];
if (widget.a is String
&& a is String
&& widget.b == b) {
_status = status == '1' ? true : false;
setState(() {
});
}
return;
});
@override
void dispose() {
// TODO: implement dispose
super.dispose();
/// 這一個(gè)很多網(wǎng)上都沒(méi)有 但是這個(gè)是必須的 widget銷毀后調(diào)用這個(gè)方法,釋放eventListener
aaaCallBack();
}
注意:
經(jīng)實(shí)踐:sendEvent的參數(shù)arguments 只能是 {String:String} ,各位如果調(diào)用失敗可以查一下是否是因?yàn)檫@個(gè)參數(shù)問(wèn)題!
除了sendEvent+addEventListener 這種方法外,也可以用頁(yè)面交互的open方法處理事件也可以,但不建議這么做哈
總結(jié)一下內(nèi)存問(wèn)題:
- iOS側(cè)的FLBVoidCallback 需要執(zhí)行釋放
- Fluuter側(cè)的VoidCallback 需要在dispose的時(shí)候釋放