Отправка функции обратного вызова из Dart в Kotlin - PullRequest
0 голосов
/ 20 января 2020

Я использую канал флаттера для связи с android (Kotlin) собственной стороной моего приложения. Но я не знаю, возможно ли отправить обратный вызов (в данном случае это функция, которая просто принимает строку в качестве аргумента) из Dart в Kotlin? Если да, то как мне его набрать?

Скажем, например, у меня есть эта функция дротика

void _acceptEngineOutput(String output){
}

И эта Kotlin функция

fun readEngineOutput(callback) {
   while(process.isAlive) {
       line = outputBuffer.readLine()
       if (line != null && line.length > 0) callback(line)
   }
}

Как должен вызываться параметр обратного вызова по типу, чтобы я мог передать функцию _acceptOutput?

Это мой класс MainActivity, сейчас я просто пропускаю тип обратного вызова в методе sendEngineOutput.

package com.loloof64.chess_exercise_manager_flutter

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugin.common.MethodChannel
import com.kalab.chess.enginesupport.ChessEngineResolver
import com.kalab.chess.enginesupport.ChessEngine
import java.io.File

class MainActivity: FlutterActivity() {
    private val CHANNEL = "loloof64.chess_utils/engine_discovery"


    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler(
                        { call, result ->
                            if (call.method.equals("copyAllEnginesToAppDir")) {
                                copyAllEnginesToAppDir()
                                result.success(1)
                            }
                            else if (call.method.equals("setEngineOutputListener")) {
                                setEngineOutputListener(call.arguments)
                                result.success(output)
                            }
                            else {
                                result.notImplemented();
                            }
                        }
                )
    }

    private fun setEngineOutputListener(callback) {

    }

}

1 Ответ

1 голос
/ 20 января 2020

Как @pskink заставил меня уведомить: я просто должен использовать setMethodCallHandler в своем коде Flutter.

  1. В моей MainActivity, где мне нужно было выполнить обратный вызов, я вызываю что-то вроде methodChannel?.invokeMethod("processEngineOutput", line). Здесь processEngineOutput является ссылкой, получаемой из моего кода Flutter
  2. . В моем коде Flutter при создании Wiget я настроил обратный вызов для связи платформы. Например
@override
  Widget build(BuildContext context) {
    platform.setMethodCallHandler(_processEngineOutput); // <---- HERE !!!! --->

    return Scaffold(
      appBar: AppBar(
        title: Text('Chess exercises manager'),
      ),
      body: Center(
        child: ChessBoard(
            MediaQuery.of(context).size.width
        ),
      ),
    );
  }
Я определяю обратный вызов _processEngineOutput как будущее и проверяю, чтобы вызов метода был удачным
Future<void> _processEngineOutput(MethodCall call) async {
    if (call.method != 'processEngineOutput') return;
    var line = call.arguments;
    print(line);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...