【问题标题】:Method channel not work in Flutter Module方法通道在 Flutter 模块中不起作用
【发布时间】:2019-11-01 17:55:13
【问题描述】:

我在 Flutter 开发文档中编写演示代码来显示电池电量。 但是代码不起作用,方法通道在调用时显示日志错误: - 未处理的异常:MissingPluginException(在通道 samples.flutter.dev/battery 上找不到方法 getBatteryLevel 的实现) 请帮我!谢谢大家!

【问题讨论】:

  • 请包含您用于调用方法通道的代码,以及您在 Android 端用 Java/Kotlin 编写的用于处理调用的代码。并仔细检查您是否在两侧注册了相同的方法通道并处理了正确的函数名称。
  • @rmtmckenzie 我检查了所有代码,它与示例相同,它在 Flutter 应用程序中运行良好,但在 Flutter 模块中无法运行。
  • 所以您已将代码从应用程序移至模块 - 您是否将其用作插件?你在android端注册一个方法通道吗?如果没有代码或至少没有对您所做工作的完整描述,我们将无法为您提供帮助。但请确保您正在创建一个名为“sample.flutter.dev/battery”的 MethodChannel,并在 android 端为 call.method“getBatteryLevel”调用 result.success。您通常会在插件的静态 registerWith 函数或 MainActivity 的 onCreate 中创建 MethodChannel。
  • @rmtmckenzie 我将代码颤振嵌入到现有的原生安卓应用程序中作为“颤振模块”。在我的项目中:MyApp2 是本机应用程序,my_flutter_2 是一个颤振模块,这里是我的链接源代码:drive.google.com/file/d/1rD-3upjGFNS-i3c8p1fWqgq5fG0ih14p/…

标签: android methods flutter channel


【解决方案1】:

由于没有关于代码的详细信息,我假设您传递了正确的方法名称和正确的通道名称。确保您的 android 原生代码中的 FlutterActivity 在任何时候都不会被破坏。 Method Channels 使用flutter引擎调用android原生代码,如果你的FlutterActivity被销毁,这些代码将不再存在。

【讨论】:

    【解决方案2】:

    假设您在本机应用程序中使用缓存的颤振引擎。

    您的应用程序类应该设置 FlutterPluginCache。

    class Application : MultiDexApplication() {
        lateinit var flutterEngine : FlutterEngine
    
        override fun onCreate() {
            super.onCreate()
    
            // Instantiate a FlutterEngine.
            flutterEngine = FlutterEngine(this)
    
            // Start executing Dart code to pre-warm the FlutterEngine.
            flutterEngine.dartExecutor.executeDartEntrypoint(
                    DartExecutor.DartEntrypoint.createDefault()
            )
    
            // Cache the FlutterEngine to be used by FlutterActivity.
            FlutterEngineCache
                    .getInstance()
                    .put("flutter_engine_id", flutterEngine)
        }
    }
    

    在您应用的 Activity 中,获取 Flutter 引擎并设置方法调用处理程序。

     class FlutterDemoActivity : FlutterActivity() {
          private val CHANNEL = "samples.flutter.dev/battery"
          private val flutter_engine_id = "flutter_engine_id"
    
          @SuppressLint("SetTextI18n")
          override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_flutter_demo)
            
            //Get your flutter engine using engine id. 
            val engine = FlutterEngineCache.getInstance().get(flutter_engine_id)
            engine?.let{
              //Set method call handler to that engine.
              MethodChannel(it.dartExecutor.binaryMessenger, 
              CHANNEL).setMethodCallHandler {
                 call, result ->
                 if(call.method=="getBatteryLevel"){
                   result.success(89) //send whatever you need here.
                }
              }
            }
          }
        }
    

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2017-05-09
      • 2019-08-16
      • 2019-10-21
      相关资源
      最近更新 更多