#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 *
Метод обычно является самым простым способом создания потока, но также учитывайте, что вам нужен поток, а не переменная, которую вы предоставляете, скажем, провайдеру. Зависит от вашей модели состояния.