注意:這個問題專門針對 `flutter.android.dart`。
Flutter的MethodChannel內部是如何作業的,比如:
我知道 MethodChannel 在傳遞之前首先對訊息進行序列化,但是如何以及什么?
kotlin/java 端是否總是像 web 服務器一樣監聽來自 dart 端的連接?或者
是 android 根據 dart-side 的要求呼叫 kotlin-side 代碼嗎?或者
別的東西
此外,MethodChannel 與 Kotlin/Java 與 dart 的互操作有何不同(這是一項新功能,明年將與 dart 3 一起推出),例如:
一種比另一種更有效,或者它們在性能和其他引數上是否幾乎相似,以及
例如,要
PDFRenderer在大小為 4 MiB 的檔案(Uint8List)上使用,需要處理,其中一種方法(在 MethodChannel 和互操作中)將是更好的選擇,
如何將以下代碼更改為在 dart 和 kotlin 端使用 kotlin interop :
package com.exa.mple
import android.net.Uri
import android.os.Build
import android.os.ParcelFileDescriptor
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import java.io.File
class MainActivity : FlutterActivity() {
private val METHOD_CHANNEL: String = "com.example/method-channel";
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, METHOD_CHANNEL).setMethodCallHandler { request: MethodCall, response: MethodChannel.Result ->
if (request.method == "getPlatformSDKVersion") {
response.success(Build.VERSION.SDK_INT.toString());
} else if (request.method == "getPrivateFilesDirPath") {
response.success(context.filesDir.absolutePath);
} else {
response.notImplemented();
}
}
}
}
我徹底搜索了 google、reddit、stack-overflow 甚至 quora,找到了一些資訊,但沒有什么令人滿意的
感謝您...
uj5u.com熱心網友回復:
方法通道使用“方法編解碼器”和“訊息編解碼器”來序列化訊息。有幾種口味,但先看看StandardMessageCodec和朋友。標準編解碼器處理范圍廣泛的型別。
在訊息傳遞方面,首先看一下執行緒模型圖。“平臺執行緒”是主要的原生執行緒,而“Dart UI 執行緒”是 Dart VM 的主執行緒。這兩個需要在它們之間傳遞訊息 - 使用上面的編解碼器。本質上,該機制是將編號的訊息放入佇列中,由另一個執行緒定期處理。另一個執行緒解組請求并將其分派給相關的注冊處理程式(由它們的名稱標識,例如“com.somewhere.someplugin/somename”(這只是一個命名約定))。處理程式被傳遞引數(上述支持的型別之一 - 通常是鍵值對的映射)和某種形式的“結果”
該結果(例如,通過result.success(123.45)在 Android 中呼叫生成)創建一個回復訊息,其中包含序列化回應(在本例中為單個雙精度)和原始請求訊息號,該訊息號以相反的方式添加到佇列中。當它在另一個執行緒上被收集時,訊息編號允許呼叫者將結果與原始請求匹配并且(例如在 Dart->native 呼叫中)完成允許await channel.invokeMethod('someMethod');未來完成的完成者。
在性能方面,FFI 通常性能更高,因為沒有/最少的編組。期望jnigen也是合理的,但由于它是高度實驗性的,您需要拭目以待。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522610.html
上一篇:在dartnull安全的模擬方法中使用引數匹配器時出錯
下一篇:無法訪問我的小部件顫動的變數
