Flutter通过Platform Channel调用原生方法时,iOS返回null但Android正常?
大家好,我在用Flutter开发时遇到一个问题:通过Platform Channel调用iOS的UUID生成方法,Android端能正常返回字符串,但iOS端总返回null。我检查过原生代码,iOS那边确实有打印出正确的UUID值,但Flutter这边接收不到。这是为什么呢?
我尝试过以下步骤:MethodChannel的名称在两端一致,iOS端的方法名也匹配,还加了runOnMainQueue参数。iOS的Objective-C实现里,我用[[NSProcessInfo processInfo] globallyUniqueString]生成UUID,然后调用了[result success:uuid]。但Flutter端打印结果还是null…
以下是关键代码片段:
Flutter端调用:
static const uuidChannel = MethodChannel('my_app/uuid');
try {
final uuid = await uuidChannel.invokeMethod('getUUID');
print("Received UUID: $uuid"); // iOS显示null
} catch (e) { print(e); }
iOS实现:
- (void)handleMethodCall:(FlutterMethodCall)call result:(FlutterResult)result {
if ([call.method isEqualToString:@"getUUID"]) {
NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString];
NSLog(@"Generated iOS UUID: %@", uuid); // 这里确实有值
result(@uuid); // 是不是这里有问题?
}
}
有没有可能是Objective-C的类型转换或Result处理方式不对?求大佬帮忙看看!
result(@uuid)这一行。Objective-C里@()是用来将基本类型包装成NSNumber的,但你的uuid是一个NSString对象,直接用@uuid包装会导致Flutter无法正确解析,最终返回null。更好的写法是直接传递
uuid对象,不需要额外包装。把这行改成result(uuid);就可以了。Flutter的MethodChannel会自动处理NSString到Dart String的转换。另外,为了代码更健壮,建议加个else分支处理未知方法的情况,比如:
最后提醒一下,虽然你提到已经检查过MethodChannel名称和方法名匹配,但还是建议再三确认两端的字符串完全一致,包括大小写。有时候这种小细节最容易让人抓狂。
改完之后应该就没问题了。如果还有其他异常,可以在Flutter端加上try-catch打日志看看具体报错信息。