通过方法通道颤振传递自定义对象
Posted
技术标签:
【中文标题】通过方法通道颤振传递自定义对象【英文标题】:Passing custom object through method channel flutter 【发布时间】:2019-09-17 22:29:51 【问题描述】:我正在尝试将类型为 User
的自定义对象从原生平台传递给 Flutter。 User
类是库的一部分,不能直接访问以进行编辑。这是我的 android 和 ios 代码实现。问题是我无法找到如何通过方法通道传递此对象的解决方案,以便我可以轻松地在 Dart 代码中解析它。
Android 部分:
private fun loginUser(uid: String, apiKey: String, result: MethodChannel.Result)
MyChat.login(uid, apiKey, object : MyChat.CallbackListener<User>()
override fun onSuccess(user: User)
Log.e(TAG, user.toString())
result.success(hashMapOf("RESULT" to true, "AVATAR" to user.avatar,
"CREDITS" to user.credits,
"EMAIL" to user.email,
"LAST_ACTIVE" to user.lastActiveAt,
"NAME" to user.name,
"ROLE" to user.role,
"STATUS" to user.status,
"STATUS_MESSAGE" to user.statusMessage).toString())
override fun onError(p0: MyChatException?)
Log.e(TAG, p0?.message)
result.error("FAILED", "Unable to create login", null)
)
iOS 实现:
func loginUser(result: @escaping FlutterResult, uid: String, apiKey: String)
MyChat.login(UID: uid, apiKey: apiKey, onSuccess: (user) in
// Login Successful
let data: [String: Any] = ["RESULT":true,
"AVATAR":user.avatar!,
"CREDITS": user.credits,
"EMAIL": user.email!,
"LAST_ACTIVE":String(user.lastActiveAt),
"NAME":user.name!,
"ROLE":user.role!,
"STATUS":user.status.rawValue,
"STATUS_MESSAGE":user.statusMessage]
let jsonData = try? JSONSerialization.data(withJSONObject: data, options: [.prettyPrinted])
result(String(data: jsonData!, encoding: .ascii))
) (error) in
// Login error
result(FlutterError(code: "FAILED", message:"Login failed with exception: " + error.errorDescription, details: nil))
我的飞镖代码:
Future<String> isUserLoggedIn() async
String status = "";
try
final String result = await platform
.invokeMethod('loginUser', "UID": UID, "API_KEY": API_KEY);
print(result); //How to parse?
status = "Hello";
on PlatformException catch (e)
print("Exception");
status = e.message;
return status;
【问题讨论】:
【参考方案1】:您可以使用invokeMapMethod,它是invokeMethod 的一个实现,可以返回类型化的地图。 像这样:
final result = await platform.invokeMapMethod('loginUser', ...);
或者您可以像这样将 json 对象作为字符串传递:
在安卓中
platform.success(
"\"CREDITS\":\"$user.credits\",\"EMAIL\":\"$user.email\",\"LAST_ACTIVE\":\"$user.lastActiveAt\""
)
在颤抖中
var result = await methodChannel.invokeMethod('loginUser' , '');
var json = json.decode(result);
var credit = json['CREDITS'];
var email = json['EMAIL'];
var lastActive = json['LAST_ACTIVE'];
【讨论】:
【参考方案2】:您可以在哈希映射中传递数据。
在 Android 中:
result.success(hashMapOf(
"CREDITS" to user.credits,
"EMAIL" to user.email,
...
))
在 iOS 中:
let data: [String: Any] = [...]
result(data)
在 Flutter 中:
final result = await platform.invokeMethod<Map<String, dynamic>>('loginUser', ...);
final credits = result['CREDITS'] as String;
final email = result['EMAIL'] as String;
...
【讨论】:
这是否意味着我们不能返回自定义对象? 我需要将一个文件对象从flutter应用程序发送到iOS原生应用程序,然后我可以将值作为字典获取,然后我需要从swift中的任何对象向下转换哪种类型? @Vinoth 考虑将文件路径传递为String
是的,谢谢,@Pavel。目前,我只发送文件路径。但我们也可以向原生 iOS 发送字节,在 appdelegate 中,我们可以像 let data: FlutterStandardTypedData = call.arguments as! FlutterStandardTypedData
以上是关于通过方法通道颤振传递自定义对象的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Hive 进行颤振时,您如何将自定义对象从 POST 响应正文添加到框?
Android_在Fragment获取activity实现的接口以及通过bundle传递自定义对象
通过 WatchConnectivity 的 sendMessageData 将自定义对象的 NSArray 作为 NSData 传递