Android 颤振插件:";标记为@UiThread的方法必须在主线程上执行;
我正在创建颤振插件。我从Android向Flatter发送回调的频道很少。情况是,我正在监听一些在主UI线程之外的其他线程中触发的事件 在最近的颤振更新之后,我开始收到这样一个错误Android 颤振插件:";标记为@UiThread的方法必须在主线程上执行;,android,flutter,dart,Android,Flutter,Dart,我正在创建颤振插件。我从Android向Flatter发送回调的频道很少。情况是,我正在监听一些在主UI线程之外的其他线程中触发的事件 在最近的颤振更新之后,我开始收到这样一个错误 E/AndroidRuntime( 9400): FATAL EXCEPTION: STARTING E/AndroidRuntime( 9400): Process: com.northernbitcoin.coinyacapp, PID: 9400 E/AndroidRuntime( 9400): java.l
E/AndroidRuntime( 9400): FATAL EXCEPTION: STARTING
E/AndroidRuntime( 9400): Process: com.northernbitcoin.coinyacapp, PID: 9400
E/AndroidRuntime( 9400): java.lang.RuntimeException: Methods marked with @UiThread must be executed on the main thread. Current thread: STARTING
E/AndroidRuntime( 9400): at io.flutter.embedding.engine.FlutterJNI.ensureRunningOnMainThread(FlutterJNI.java:794)
E/AndroidRuntime( 9400): at io.flutter.embedding.engine.FlutterJNI.dispatchPlatformMessage(FlutterJNI.java:684)
E/AndroidRuntime( 9400): at io.flutter.embedding.engine.dart.DartMessenger.send(DartMessenger.java:80)
E/AndroidRuntime( 9400): at io.flutter.embedding.engine.dart.DartExecutor.send(DartExecutor.java:174)
E/AndroidRuntime( 9400): at io.flutter.view.FlutterNativeView.send(FlutterNativeView.java:144)
E/AndroidRuntime( 9400): at io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler$EventSinkImplementation.success(EventChannel.java:226)
...
我找到的唯一信息就在这里
是的,这里有一个解决方案
但它对我来说似乎太过开销,因为我不想为我的每个事件创建新的处理程序
是否有其他解决方案?请按照上面建议的解决方案执行,但仅在特定事件中使用
创建ui处理程序对象
公共类BitcoinWalletPlugin实现MethodCallHandler。。。{
私有处理程序uiThreadHandler=新处理程序(Looper.getMainLooper());
@凌驾
public void onListen(对象o,EventChannel.EventSink EventSink){
交换机(此.channel){
...
案例频道名称:
//以前
//bitcoinWallet.setOnStartupListener(()->eventSink.success(true));
//之后
bitcoinWallet.setOnStartupListener(()->uiThreadHandler.post(()->eventSink.success(true));
打破
}
}
}
:
fun Result.onMain(): ResultOnMain {
return if (this is ResultOnMain) {
this
} else {
ResultOnMain(this)
}
}
class ResultOnMain internal constructor(private val result: Result) : Result {
private val handler: Handler by lazy {
Handler(Looper.getMainLooper())
}
override fun success(res: Any?) {
handler.post { result.success(res) }
}
override fun error(
errorCode: String, errorMessage: String?, errorDetails: Any?) {
handler.post { result.error(errorCode, errorMessage, errorDetails) }
}
override fun notImplemented() {
handler.post { result.notImplemented() }
}
}