之前講過一篇Flutter與原生通信,為大家講解了Flutter如何呼叫原生,但是沒有介紹原生如何呼叫Flutter,那么原生如何呼叫Flutter呢?
誒~,還是通過MethodChannel,只不過這次它倆角色互換了一下,之前是原生作為通信方法的提供方,Flutter為呼叫方,現在倒過來了,Flutter作為通信方法的提供方,原生作為呼叫方,是不是很有意思,
Flutter端(提供方)
和在原生中一樣,通過MethodChannel的setMethodCallHandler方法進行注冊,提供原生呼叫的通信方法,需要實作一個引數為MethodCall,回傳值為Future物件的函式,
void setMethodCallHandler(Future<dynamic> Function(MethodCall call)? handler) {
_methodChannelHandlers[this] = handler;
binaryMessenger.setMessageHandler(
name,
handler == null
? null
: (ByteData? message) => _handleAsMethodCall(message, handler),
);
}
MethodCall
MethodCall應該不陌生吧,在上一篇博客了我們見過它了,但是Flutter中的MethodCall和原生中的MethodCall還有點不一樣,Flutter中的MethodCall只有屬性,沒有方法,
MethodCodec支持的有效值看這里
/// 表示呼叫命名方法的命令物件,
@immutable
class MethodCall {
/// 創建一個 [MethodCall],表示使用指定的 [arguments] 呼叫 [method],
const MethodCall(this.method, [this.arguments])
: assert(method != null);
/// 要呼叫的方法的名稱,
final String method;
/// 方法的引數,
///
/// 必須是使用的 [MethodCodec] 的有效值,
///
/// 這個屬性是動態的,這意味著訪問時會跳過型別檢查
/// 這個性質, 為了最大限度地降低運行時型別錯誤的風險,該值應該訪問時被強制轉換為`Object?`,
final dynamic arguments;
@override
String toString() => '${objectRuntimeType(this, 'MethodCall')}($method, $arguments)';
}
我們在flutter中注冊一個’lal‘方法,將原生傳遞過來的引數編成一段話回傳給原生,
static const nativeChannel =
const MethodChannel("com.fengwo.reading.flutter_app/native");
//對方法進行注冊
nativeChannel.setMethodCallHandler((call) {
if(call.method == "lal") {
return Future.value("Hello~ ${call.arguments}\nI'm flutter");
}
return null;
});
原生端(呼叫方)
原生中呼叫flutter,同樣通過MethodChannel的invokeMethod方法,其有三個引數,第一個是flutter中定義的方法名稱,第二個是要傳遞的引數,第三個是呼叫flutter方法結果的回呼介面,
@UiThread
public void invokeMethod(String method, @Nullable Object arguments, @Nullable Result callback) {
messenger.send(
name,
codec.encodeMethodCall(new MethodCall(method, arguments)),
callback == null ? null : new IncomingResultHandler(callback));
}
現在,我們使用原生呼叫flutter中的'lal'方法,傳遞引數字串‘android’,將flutter回傳的結果通過toast列印出來,
class SecondActivity : FlutterActivity() {
lateinit var channel: MethodChannel
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_NATIVE)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
btn.setOnClickListener {
channel.invokeMethod("lal", "android", object : MethodChannel.Result {
override fun notImplemented() {
Toast.makeText(this@SecondActivity, "notImplemented", Toast.LENGTH_SHORT).show()
}
override fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?) {
Toast.makeText(this@SecondActivity, "error:$errorMessage", Toast.LENGTH_SHORT).show()
}
override fun success(result: Any?) {
if (result != null)
Toast.makeText(this@SecondActivity, result as String, Toast.LENGTH_SHORT).show()
}
})
}
}
}
演示

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/287632.html
標籤:其他
上一篇:Android 7.1開機之后APN的加載及撥號上網流程分析
下一篇:Android第一行代碼-UI
