Канал Invokemethod из нативного android не вызывает метод флаттера - PullRequest
1 голос
/ 27 мая 2020

Обычно я вызываю SDK оплаты в нативном android (kotlin), используя канал платформы. SDK успешно инициализирован. После транзакции платежа я получу статус платежа в файле kotlin, который фактически расширяет файлы классов sdk (а не действие). Из этого метода обратного вызова мне нужно передать статус в код флаттера. Все работает успешно, без ошибок, но при передаче статуса платежа метод флаттера не вызывается.

Код дротика Flutter.

@override
void initState() {
  // TODO: implement initState
  super.initState();

  platform.setMethodCallHandler(_handlePaymentResponse); // To call from native android after payment response.

}

// Invoked from Native Android after payment response.
Future<dynamic> _handlePaymentResponse(MethodCall call) async {
  print('_handlePaymentResponse method called');
  switch(call.method) {
    case "message":
      debugPrint('From Native====' + call.arguments);
      return new Future.value("");
  }
}


// On button click this method will be invoked.
Future<void> _initializeSDK() async {

  print('Token $token');

  try {
    await platform.invokeMethod('callPaymentSDK');
  } on PlatformException catch (e) {
    print("Failed to initialize SDK : '${e.message}'.");
  }

}
Native Android : Paymentstatus.kt 

class PaymentResponse() : LibraryPaymentStatusProtocol, Parcelable {

    //val channel = MethodChannel(flutterView, MainActivity.CHANNEL)

    var backgroundFlutterView: FlutterNativeView? = null

    override fun paymentStatus(p0: String?, p1: Activity?) {

        if (p1 != null) {
            Handler(Looper.getMainLooper()).post {
                Log.v("PaymentResponse", "Main thread called")
                backgroundFlutterView = FlutterNativeView(p1, true)
                val channel = MethodChannel(backgroundFlutterView, MainActivity.CHANNEL)
                channel.invokeMethod("message", p0); // Invoking Flutter method 
            }

        }


    }
}

1 Ответ

0 голосов
/ 03 августа 2020

Я столкнулся с той же проблемой, и в конце концов решение, которое сработало для меня (не уверен, что это идеальный подход), заключалось в том, чтобы сохранить ссылку на FlutterEngine внутри моего MainActivity следующим образом:

class MainActivity: FlutterActivity() {
    companion object {
        var flutterEngineInstance: FlutterEngine? = null
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        flutterEngineInstance = flutterEngine
    }
}

В моем коде я бы просто вызвал такой метод:

MethodChannel(
    MainActivity.flutterEngineInstance.dartExecutor.binaryMessenger, 
    "com.example"
).invokeMethod("method", mapOf())
...