首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter原生代码-在单独的隔离中调用平台通道

Flutter原生代码-在单独的隔离中调用平台通道
EN

Stack Overflow用户
提问于 2019-09-05 12:41:36
回答 1查看 964关注 0票数 1

我正在尝试将本地代码添加到我的flutter应用程序中,它基本上只有两个方法来播放和停止警报。我在MainActivity和dart的android中添加了本机代码,但是我得到了异常:未处理的异常:MissingPluginException(在com.example.Smart_ playAlarm /android_ring_manager上找不到方法警报的实现)

已尝试:

(i)。卸载/重新安装应用程序

(ii)。颤振清洁和颤振运行

(iii)。更改频道名称

“”“

代码语言:javascript
复制
private static final String CHANNEL_NAME = "com.example.smart_alarm/android_ring_manager";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    startService(new Intent(this, AlarmRingerService.class));

    new MethodChannel(getFlutterView(), CHANNEL_NAME).setMethodCallHandler((call, result) -> {
        if (call.method.equals("playAlarm")) {
            System.out.println("MainActivity: Playing alarm");
            AlarmRingerService.playAlarm();
            result.success(null);
        } else if (call.method.equals("stopAlarm")) {
            System.out.println("MainActivity: Stopping alarm");
            AlarmRingerService.stopAlarm();
            result.success(null);
        }
    });
}
代码语言:javascript
复制
Flutter dart code: This is executed from alarm callback in separate isolate

import 'package:flutter/services.dart';

class AlarmRingManager {
  static const MethodChannel _channel =
      const MethodChannel('com.example.smart_alarm/android_ring_manager');

  static Future<void> playAlarm() async {
    try {
      await _channel.invokeMethod('playAlarm');
    } on PlatformException catch (e) {
      print('Unable to call play alarm on platform channel $e');
    }
  }

  static Future<void> stopAlarm() async {
    try {
      await _channel.invokeMethod('stopAlarm');
    } on PlatformException catch (e) {
      print('Unable to call stop alarm on platform channel $e');
    }
  }
}

我是不是漏掉了什么?我是否需要在其他地方或清单中注册我的方法调用处理程序?

--编辑

所以我对它进行了更多的调试,发现问题不是平台通道回调。问题是我从android_alarm_manager回调中调用了平台通道方法。由于android_alarm_manager在不同的隔离中运行,并且方法调用处理程序设置在主隔离中,因此它无法找到它。

有没有一种方法可以在android BE服务中定义平台通道,使其始终对所有隔离可用?如果我将它用于现有的插件,我可以看到它的工作,但我不确定如何添加我自己的代码,以便本机平台通道对所有隔离都可用。

EN

回答 1

Stack Overflow用户

发布于 2021-08-25 09:19:58

到目前为止,我发布了这个答案,Flutter不支持从隔离调用本机通道调用。

请查看:https://github.com/flutter/flutter/issues/13937

另外还有一些很有前途的插件,比如:https://pub.dev/packages/flutter_isolate

但它们也有自己的复杂性,需要调用辅助FlutterEngine并在其上运行调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57798544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档