java.lang.IllegalStateException:回复已提交 - 当尝试多次调用 result.success 时?

M.Y*_*ran 13 android flutter

当我尝试从 android 本机多次传递值到 flutter 时,出现以下异常。

\n
E/AndroidRuntime(14203): java.lang.IllegalStateException: Reply already submitted\nE/AndroidRuntime(14203): at io.flutter.view.FlutterNativeView$1.reply(FlutterNativeView.java:162)\nE/AndroidRuntime(14203): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler$1.success(MethodChannel.java:194)\nE/AndroidRuntime(14203): at com.dooboolab.flutterinapppurchase.FlutterInappPurchasePlugin$2.onBillingSetupFinished(FlutterInappPurchasePlugin.java:94)\nE/AndroidRuntime(14203): at com.android.billingclient.api.BillingClientImpl$BillingServiceConnection.onServiceConnected(BillingClientImpl.java:903)\nE/AndroidRuntime(14203): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1386)\nE/AndroidRuntime(14203): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1403)\nE/AndroidRuntime(14203): at android.os.Handler.handleCallback(Handler.java:739)\nE/AndroidRuntime(14203): at android.os.Handler.dispatchMessage(Handler.java:95)\nE/AndroidRuntime(14203): at android.os.Looper.loop(Looper.java:135)\nE/AndroidRuntime(14203): at android.app.ActivityThread.main(ActivityThread.java:5422)\nE/AndroidRuntime(14203): at java.lang.reflect.Method.invoke(Native Method)\nE/AndroidRuntime(14203): at java.lang.reflect.Method.invoke(Method.java:372)\nE/AndroidRuntime(14203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)\nE/AndroidRuntime(14203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)\n
Run Code Online (Sandbox Code Playgroud)\n

我的颤振版本:

\n
[\xe2\x9c\x93] Flutter (Channel stable, 1.22.5, on Mac OS X 10.14.6 18G6032 darwin-x64, locale en-IN)\n
Run Code Online (Sandbox Code Playgroud)\n

我的问题是如何从 android 原生调用 result.success 到 flutter?

\n

ric*_*aru 6

result.success只能调用一次。将多个数据从 Native 发送到 Dart 的最简单方法是反转该过程。

  • 在 dart 中,通过设置方法调用处理程序setMethodCallHandler
  • 在 Android 中,调用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}');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

原生代码

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)
        }
    }

}
Run Code Online (Sandbox Code Playgroud)