ScheduledExecutorThread выполняется только один раз при выполнении обратного вызова плагина Dart

#java #android #flutter #dart #plugins

#java #Android #флаттер #dart #Плагины

Вопрос:

Справка плагина Flutter

В настоящее время я работаю над примером плагина, который извлекает информацию о Wi-Fi из сети, к которой в данный момент подключено мобильное устройство. Я использую Flutter и создал шаблон для приложения с помощью команд терминала flutter.

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь выполнить обратный вызов Dart через Java, используя .invokeMethod (метод, аргументы). Служба исполнителя, похоже, запускается только один раз, а затем останавливается. Есть ли что-то, что я делаю не так, кажется, я не могу найти ответ в Интернете?

Ниже приведен мой Java-код.

 @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result) {

    class SendInfo implements Runnable {
      @Override
      public void run() {
        System.out.println("Runnable operation invoked "   String.valueOf(count)   " times.");
        count  ;
        WifiManager wifiManager = (WifiManager) appContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        String ssid = wifiManager.getConnectionInfo().getSSID();
        int strength = wifiManager.getConnectionInfo().getRssi();
        Map<String, Integer> args = new HashMap<>();
        args.put(ssid, strength);
        System.out.println(args);
        channel.invokeMethod("receiveInfo", args);
      }
    }

    if (call.method.equals("getSSID")) {
      String ssid = getInfo().getSSID();
      result.success(ssid);
    } else if (call.method.equals("getStrength")){
      String strength = String.valueOf(getInfo().getRssi());
      result.success(strength);

    } else if (call.method.equals("start")){
      System.out.println("Start method invoked.");
      ScheduledFuture<?> ssidFuture = executorService.scheduleAtFixedRate(new SendInfo(), 0, 1, TimeUnit.SECONDS);
    } else if (call.method.equals("stop")){

    }
    else {
      result.notImplemented();
    }
  

Вот сторона плагина Dart, на данный момент я просто пытаюсь распечатать полученные значения перед чем-либо еще. Другая проблема заключается в том, что Dart, похоже, не может сопоставить полученный call.method с предоставленной строкой и, похоже, вообще пропускает оператор switch.

 class StatHandler {
  static const MethodChannel _channel = const MethodChannel('WifiStats');

  void init() {
    _channel.setMethodCallHandler(_callbackHandler);
    print("Method Channel set.");
    start();
  }

  Future<String> getSSID() async {
    final String name = await _channel.invokeMethod('getSSID');
    print(name);
    return name;
  }

  Future<String> getStrength() async {
    final String strength = await _channel.invokeMethod('getStrength');
    print(strength);
    return strength;
  }

  void start() {
    _channel.invokeMethod('start');
  }

  void stop() {
    _channel.invokeMethod('stop');
  }

  Future<dynamic> _callbackHandler(MethodCall call) {
    var callback = call.arguments;
    var method = call.method;
    print("Method Call: "   method);

    switch (call.method) {
      case "receiveInfo":
        // handle data
        print("<SSID, Strength>: "   callback);
        return callback;
        break;
      default:
        throw UnsupportedError("Error");
    }
  }
}
  

Комментарии:

1. Не было бы разумнее реализовать периодический таймер 1 с в Dart, вызывая native, вместо того, чтобы использовать собственный push. Таким образом, вам нужно реализовать код таймера только один раз, а не один раз для каждой платформы.

2. Это имело бы больше смысла! Я пытаюсь сделать это сейчас, как бы вы порекомендовали мне реализовать это, чтобы он выводил данные в поток, чтобы их можно было автоматически обновлять в пользовательском интерфейсе?

3. async * Метод обычно является самым простым способом создания потока, но также учитывайте, что вам нужен поток, а не переменная, которую вы предоставляете, скажем, провайдеру. Зависит от вашей модели состояния.