dart - java.lang.IllegalStateException : Reply already submitted 是否有解决方案

标签 dart flutter

我想在来自 Android 原生代码的 Flutter 中使用 pusher sdk,因为它的库在 Flutter 中尚未完全支持,但是当我发送第一条消息时,它成功接收到下一条消息,下一条消息使应用程序崩溃,回复已经提交错误她在此行 result.success(txt);

 public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "demo.gawkat.com/info";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GeneratedPluginRegistrant.registerWith(this);

        new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler((methodCall, result) -> {

            final Map<String, Object> arguments = methodCall.arguments();

            if (methodCall.method.equals("getMessage")) {
                Pusher pusher = new Pusher("faa685e4bb3003eb825c");
                pusher.connect();
                Channel channel = pusher.subscribe("messages");

                channel.bind("new_message", (channelName, eventName, data) -> runOnUiThread(() -> {
                    Gson gson = new Gson();
                    Message message = gson.fromJson(data, Message.class);
                    String txt = message.text;
                    result.success(txt);


                }));


            }

        });
      }
    }

flutter 代码:
Future<String> _getMessage() async {

    String value;

    try {
      value = await platform.invokeMethod('getMessage');
    } catch (e) {
      print(e);
    }

    return value;
 }

错误是
FATAL EXCEPTION: main
    Process: com.example.flutter_app, PID: 6296
    java.lang.IllegalStateException: Reply already submitted
        at io.flutter.view.FlutterNativeView$PlatformMessageHandlerImpl$1.reply(FlutterNativeView.java:197)
        at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:204)
        at com.example.flutter_app.MainActivity.lambda$null$0(MainActivity.java:40)
        at com.example.flutter_app.-$$Lambda$MainActivity$axbDTe2B0rhavWD22s4E8-fuCaQ.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767

最佳答案

我认为它是在 Flutter upgrade > 1.5.4.hotfix 之后发生的。

无论如何,是的,有一个解决方案( Refer this github issue ),

在您的 Activity下面 onCreate()添加这个类:

private static class MethodResultWrapper implements MethodChannel.Result {
    private MethodChannel.Result methodResult;
    private Handler handler;

    MethodResultWrapper(MethodChannel.Result result) {
        methodResult = result;
        handler = new Handler(Looper.getMainLooper());
    }

    @Override
    public void success(final Object result) {
        handler.post(
                new Runnable() {
                    @Override
                    public void run() {
                        methodResult.success(result);
                    }
                });
    }

    @Override
    public void error(
            final String errorCode, final String errorMessage, final Object errorDetails) {
        handler.post(
                new Runnable() {
                    @Override
                    public void run() {
                        methodResult.error(errorCode, errorMessage, errorDetails);
                    }
                });
    }

    @Override
    public void notImplemented() {
        handler.post(
                new Runnable() {
                    @Override
                    public void run() {
                        methodResult.notImplemented();
                    }
                });
    }
}

然后,而不是使用 MethodChannel结果到 setMethodCallHandler参数回调将名称添加为 rawResult然后在该回调中,添加以下行:
MethodChannel.Result result = new MethodResultWrapper(rawResult);

如下:
    //......
    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            (call, rawResult) -> {
                MethodChannel.Result result = new MethodResultWrapper(rawResult);
    //.....

关于dart - java.lang.IllegalStateException : Reply already submitted 是否有解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55846479/

相关文章:

flutter - 卡片底部有更多空间

dart - pubspec.yaml 中指定的包版本是否包含在编译输出中的任何位置?

flutter - 如何在 Flutter 中的图像上添加水印文本?

dart - 格式错误的类型:…在这种情况下使用 'some-object'无效

android - 缓慢 flutter 的 GridView

testing - 如何在 Flutter 小部件中测试回调函数

dart - 无法根据状态更改页面

flutter - 以编程方式选择标记以导航到位置 Google_Maps_Flutter

user-interface - 在 flutter 中设置列宽

flutter - 使用 Dart 在同一引用上连续调用方法的最佳实践