当我尝试将值从 android native 多次传递给 flutter 时,出现以下异常。
E/AndroidRuntime(14203): java.lang.IllegalStateException: Reply already submitted
E/AndroidRuntime(14203): at io.flutter.view.FlutterNativeView$1.reply(FlutterNativeView.java:162)
E/AndroidRuntime(14203): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:194)
E/AndroidRuntime(14203): at com.dooboolab.flutterinapppurchase.FlutterInappPurchasePlugin$2.onBillingSetupFinished(FlutterInappPurchasePlugin.java:94)
E/AndroidRuntime(14203): at com.android.billingclient.api.BillingClientImpl$BillingServiceConnection.onServiceConnected(BillingClientImpl.java:903)
E/AndroidRuntime(14203): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1386)
E/AndroidRuntime(14203): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1403)
E/AndroidRuntime(14203): at android.os.Handler.handleCallback(Handler.java:739)
E/AndroidRuntime(14203): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(14203): at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(14203): at android.app.ActivityThread.main(ActivityThread.java:5422)
E/AndroidRuntime(14203): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(14203): at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(14203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
E/AndroidRuntime(14203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)
我的 Flutter 版本:
[✓] Flutter (Channel stable, 1.22.5, on Mac OS X 10.14.6 18G6032 darwin-x64, locale en-IN)
我的问题是如何从android原生调用result.success到flutter?
答案 0 :(得分:2)
result.success
只能被调用一次。将多个数据从 native 发送到 dart 的最简单方法是反向处理。
setMethodCallHandler
设置方法调用处理程序。invokeMethod
。示例:
飞镖代码
import 'package:flutter/services.dart';
class TestChannel {
TestChannel._() {
_platform.setMethodCallHandler(_fromNative);
}
static const _platform = const MethodChannel('samples.flutter.dev/test');
static TestChannel _instance;
static get instance => _instance ??= TestChannel._();
Future<bool> callTest() async {
bool res = false;
try {
res = await _platform.invokeMethod('myMethod') == 1;
} on PlatformException catch (e) {
print('Error = $e');
}
print('Is call successful? $res');
return res;
}
Future<void> _fromNative(MethodCall call) async {
if (call.method == 'callTestResuls') {
print('callTest result = ${call.arguments}');
}
}
}
原生代码
package com.example.sample_app
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
class MainActivity: FlutterActivity() {
private val CHANNEL = "samples.flutter.dev/test"
private lateinit var methodChannel: MethodChannel
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
methodChannel.setMethodCallHandler {
call, result ->
if (call.method == "myMethod") {
result.success(1)
generateResults()
}
}
}
private fun generateResults() {
for (i in 1..10) {
methodChannel.invokeMethod("callTestResuls", i)
}
}
}