我在 Flutter 上過課:
class Foo {
String id;
int power;
Foo (this.id, this.power);
Map toJson() => {
'id': id,
'power': power
};
}
我創建了這個物件的一個??實體,并通過 MethodChannel 將它作為String:
_myChannel.invokeMethod('custom_event', {
'foo': foo.toJson().toString(),
});
在 Android 中,我檢索該字串并希望在 Android 端轉換為 Foo 物件,因此:
val fooString = call.method.argument<String>("foo")
//output: {id: my_id, power: 23}
val response = fooString?.let { Response(it) }
//output {"id":"my_id","power":"23"}
助手類:
class Response(json: String) : JSONObject(json) {
val data = this.optJSONArray(null)
?.let { 0.until(it.length()).map { i -> it.optJSONObject(i) } } // returns an array of JSONObject
?.map { FooJson(it.toString()) } // transforms each JSONObject of the array into Foo
}
class FooJson(json: String) : JSONObject(json) {
val id: String = this.optString("id")
val power: String = this.optInt("power")
}
如何將回應轉換為我的 Kotlin 課程?
uj5u.com熱心網友回復:
由于Foo只包含一個字串和一個整數,默認訊息編解碼器都支持這兩者,因此在映射中簡單地傳遞這兩個值是有意義的。(事實上??,您已經有了一個創建該映射的方法toJson,盡管更好的名稱可能是toMap。)
然后不要呼叫toString那張地圖;改為使用:
_myChannel.invokeMethod('custom_event', foo.toMap());
您現在正在呼叫該方法并傳遞地圖。在本機端,您將使用您嘗試過的映射鍵(即id和power)查找成員.argument<T>,如下所示:
val id = call.method.argument<String>("id");
當然,如果確實需要,您可以創建一個圍繞這兩個值包裝物件的 POJO。
對于更復雜的訊息,請考慮Pigeon。如果您真的想使用 JSON 作為您的序列化方法,請查看現有的 JSON 訊息編解碼器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/520078.html
