android - Quickblox - Flutter JNI 与本机 C++ 分离
问题描述
我在 Flutter 应用程序中使用 Quickblox 进行聊天。建立连接后,聊天工作正常。当应用程序发送到后台时,我按照 Quickblox 文档的建议将连接设置为关闭。但是当我重新打开我的应用程序时,它不再在其事件中接收消息(QBChatEvents.RECEIVED_NEW_MESSAGE)
。尽管在日志中发送和接收消息,但此事件不再起作用。日志显示了这个异常,
Tried to send a platform message to Flutter, but FlutterJNI was detached from native C++. Could not send. Channel:
这是我订阅的活动,
QB.chat.subscribeChatEvent(QBChatEvents.RECEIVED_NEW_MESSAGE,
(data) {
// my implementaion here
});
我已经从他们的文档中添加了这个实现。
class _SomeScreenState extends State<SomeScreen> with WidgetsBindingObserver {
@override
initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.resumed:
try {
await QB.chat.connect(userId, userPassword);
} on PlatformException catch (e) {
// Some error occured, look at the exception message for more details
}
break;
case AppLifecycleState.paused:
print("app in paused");
try {
await QB.chat.disconnect();
} on PlatformException catch (e) {
// Some error occured, look at the exception message for more details
}
break;
}
我在这里做错了什么?
解决方案
尝试向 Flutter 发送平台消息,但 FlutterJNI 与原生 C++ 分离。无法发送。Channel:当我们杀死应用程序并尝试从本机代码传达颤振时方法通道被破坏时会发生此错误,
然后发生此运行时错误
解决方法如下:在后台新建一个方法通道,用这个通道调用flutter部分。如下所示
fun createMethodChannel(): MethodChannel? {
var backgroundMethodChannel: MethodChannel? = null;
var engine: FlutterEngine? = null;
if (getEngine() == null) {
engine = FlutterEngine(mContext!!)
// Define a DartEntrypoint
val entrypoint: DartExecutor.DartEntrypoint =
DartExecutor.DartEntrypoint.createDefault()
// Execute the DartEntrypoint within the FlutterEngine.
engine.dartExecutor.executeDartEntrypoint(entrypoint)
} else {
engine = getEngine();
}
backgroundMethodChannel = MethodChannel(engine?.dartExecutor?.binaryMessenger, "CHANNEL_NAME")
return backgroundMethodChannel
}
fun getEngine(): FlutterEngine? {
return FlutterEngineCache.getInstance().get("CHANNEL_NAME");
}
推荐阅读
- snowflake-cloud-data-platform - 雪花特权
- javascript - 使用 JavaScript reduce 更新并添加到对象数组
- sql-server - 尝试更新 SQL Server 中的列值会导致错误?
- c++ - 在类中声明函数数组
- .net - 如何使用带有 systemd 的 .Net Core 3.1 查找守护程序应用程序版本?
- linux - 当我期望找不到命令时,权限被拒绝错误返回
- c# - 无法从 c# hidlibrary 和 QR-Code Scanner 接收数据
- rxjs - RxJS — 按多个条件对项目进行分组并处理每个组
- python - 当我使用基本身份验证在 QGIS 中调用 WMS GetCapabilities 请求时有什么问题吗?
- javascript - 使用javascript“对象代理”时如何获取“this”内容