Flutter和Native混合开发,Fluuter和Native方法互相调用很容易出现内存问题,网上的很多例子都是不全的!!看这篇就够了!!
flutter侧:调用Native的xxx方法
Map<String,dynamic> tmp = Map<String,dynamic>();
try {
/// 调用Native的方法xxx
FlutterBoost.singleton.channel.sendEvent('xxx', tmp);
} catch (e) {
}
iOS侧:监听flutter 调用的xxx方法
// 监听来自flutter的事件 xxx
FLBVoidCallback __block xxxBlock = [FlutterBoostPlugin.sharedInstance addEventListener:^(NSString *name, NSDictionary *arguments) {
if([name isEqualToString:@"xxx"]) {
/// 回调给flutter,flutter需要监听aaa(即: Native调用Flutter方法aaa)
[FlutterBoostPlugin.sharedInstance sendEvent:@"aaa" arguments:@{@"a":@"a",@"b":@"b"}];
}
/// 这一行很多网上都没写 但是是需要的 用完了就释放
xxxBlock();
} forName:@"xxx"];
flutter侧:监听Native的aaa回调方法(在widget的initState() 中写)
bool _status = false;
/// 这一个很多网上都没有 但是这个是必须的 需要在dispose中释放
VoidCallback aaaCallBack;
/// 监听Native侧的事件-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();
/// 这一个很多网上都没有 但是这个是必须的 widget销毁后调用这个方法,释放eventListener
aaaCallBack();
}
注意:
经实践:sendEvent的参数arguments 只能是 {String:String} ,各位如果调用失败可以查一下是否是因为这个参数问题!
除了sendEvent+addEventListener 这种方法外,也可以用页面交互的open方法处理事件也可以,但不建议这么做哈
总结一下内存问题:
- iOS侧的FLBVoidCallback 需要执行释放
- Fluuter侧的VoidCallback 需要在dispose的时候释放