【问题标题】: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;
  }

【问题讨论】:

    标签: android ios swift kotlin flutter


    【解决方案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
      猜你喜欢
      • 2021-04-10
      • 1970-01-01
      • 2018-12-30
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2012-05-20
      相关资源
      最近更新 更多