Android 颤振插件:";标记为@UiThread的方法必须在主线程上执行;

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

我正在创建颤振插件。我从Android向Flatter发送回调的频道很少。情况是,我正在监听一些在主UI线程之外的其他线程中触发的事件

在最近的颤振更新之后,我开始收到这样一个错误

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() }
  }
}