[Изменить 4 февраля 2019]
Я отказался от Kotlin, и я действительно из моей зоны комфорта, используя Java, я думаю, что я почти там, но я получаю эту ошибку
MissingPluginException (Не найдена реализация для метода прослушивания на канальном сканере)
Вот мой последний код, я мог бы использовать некоторую помощь:
сторона Java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity implements EventChannel.StreamHandler {
static IntentFilter filter = new IntentFilter();
static String mAction = "++++CENSOR++++";
static final String mKey = "++++CENSOR++++";
static final String mEventCall = "scanner";
private PluginRegistry.Registrar mRegistrar;
private EventChannel.EventSink mEventSink;
public void registerWith(Registrar registrar) {
MainActivity plugin = new MainActivity();
final EventChannel channel = new EventChannel(registrar.messenger(),mEventCall);
channel.setStreamHandler(plugin);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.addAction(mAction);
registerReceiver(myBroadcastReceiver, filter);
GeneratedPluginRegistrant.registerWith(this);
}
@Override
protected void onDestroy()
{
super.onDestroy();
unregisterReceiver(myBroadcastReceiver);
}
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(mAction)) {
try {
String data = intent.getStringExtra(mKey);
mEventSink.success(data);
} catch (Exception e) {
}
}
}
};
public void onListen(Object o, EventChannel.EventSink eventSink) {
mEventSink=eventSink;
}
public void onCancel(Object arguments) {
mEventSink=null;
}
}
сторона флаттера
scanner.dart
import 'package:flutter/services.dart';
import 'dart:async';
class Scanner {
static const String mEventCall = 'scanner';
static const EventChannel _eventChannel = const EventChannel(mEventCall);
static Stream<String> _readingStream;
static Stream<String> get readingStream {
if(_readingStream== null){
_readingStream =_eventChannel.receiveBroadcastStream().map<String>((value)=> value);
}
return _readingStream;
}
}
main.dart
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Scanner Beta',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
Stream<String> _stream = Scanner.readingStream;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("test"),
),
body: Center(
child: StreamBuilder(
initialData: "",
stream: _stream,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
return Text(snapshot.data);
}
)
),
);
}
}
[редактировать: 30 января]
Я проверил предлагаемую ссылку , конечно, это дает мне лучшее понимание контекста, с которым я еще не знаком, но я считаю, что моя проблема имеет другую природу:
Я пытаюсь объяснить себя лучше:
1. (нативное приложениена устройстве) -> широковещательная интенция и действие
2. (мой приемник широковещательной рассылки kotlin) -> получить интент и действие
3. (ЧАСТЬ ПРОПУСКА) необходимо получить данные из намерения/ действие для MethodChannel
4. (мой kotlin MethodChannel) -> отправлять данные в Flutter через платформу invokeMethod
еще раз спасибо заранее за любую помощь, которую вы можете оказать мне Francesco
[оригинальный пост]
Я пытаюсь создать приложение для чтения данных сканера (и другиевсе с этим) Я (вроде / думаю, я) знаю, как использовать methodChannel для передачи данных от kotlin к флаттеру, сканер не имеет реального плагина, но я могу использовать BroadcastReceiver + IntentFilter для прослушивания 'действие сканера ';
моя проблема - соединить их вместе, как я могу убедиться, что всякий раз, когда Br..Receiver «получает» что-то, он передает его в канал метода (БЕЗ касания экрана это устройство )
Бонус, я действительно вне этой зоны комфорта с этой задачей, я мог бы (вероятно) сделать некоторую ошибку, я действительно могу использовать другую пару глаз
Вот мой код: //////////////// KOTLIN
// get data from scanner API
import android.os.Bundle
import io.flutter.plugins.GeneratedPluginRegistrant
import android.content.BroadcastReceiver
import android.content.Context
import android.content.IntentFilter
import android.content.Intent;
//send data to flutter
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel;
class MainActivity:FlutterActivity() {
private var scanData:String? = null
private val SCANNER_ACTION = "++++censored++++"
private val SCANNER_INTENT_DATA = "++++censored++++"
private val FLUTTER_CHANNEL = "scanner.data"
private val FLUTTER_METHOD = "getScannerData"
override fun onCreate(savedInstanceState:Bundle?) {
private const method_flutter = MethodChannel(flutterView, FLUTTER_CHANNEL)
super.onCreate(savedInstanceState)
//send intent to flutter
GeneratedPluginRegistrant.registerWith(this)
method_flutter.setMethodCallHandler{
methodCall, result ->
if (methodCall.method == FLUTTER_METHOD) {
if (scanData!=null) {
result.success(scanData)
} else {
result.error(null,null,null)
}
} else {
result.notImplemented()
}
}
///scanner INTENT FILTER
val filter = IntentFilter()
filter.addCategory(Intent.CATEGORY_DEFAULT)
filter.addAction(SCANNER_ACTION)
registerReceiver(receiver, filter)
}
// END OF 'onCreate'
// SCANNER RECEIVER
private val receiver = object : BroadcastReceiver() {
override fun onReceive(contxt: Context?, intent: Intent?) {
if (intent?.action == SCANNER_ACTION) {
scanData = intent.getStringExtra(SCANNER_INTENT_DATA)
}
}
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(receiver)
}
}
////////////////// DART
import 'dart:async';
import 'package:flutter/services.dart';
class Plugin {
static const platform = MethodChannel('scanner.data');
Future<String> get data async => await platform.invokeMethod('getScannerData');
}