没有找到方法错误的实现方法

时间:2021-01-09 11:15:42

标签: java android flutter dart

我有一个简单的 Android 应用。我导入了一个新的颤振模块。当我传递到 Flutter 页面时,我无法再实现本机代码。我收到错误 No implementation method found for method getBatteryLevel。我该如何解决这个问题?

注意:如果我自己运行flutter模块,可以得到native code的结果。

main.dart 中的触发方法:

 String result = await methodChannel.invokeMethod('getBatteryLevel');

Flutter 模块的 MainActivity:


package com.deremakif.flutter_counter_module.host;

import io.flutter.embedding.android.FlutterActivity;

import androidx.annotation.NonNull;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {

    private static final String CHANNEL =  "samples.flutter.io/battery";
   
    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
      GeneratedPluginRegistrant.registerWith(flutterEngine);

        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(((methodCall, result) -> {
          if (methodCall.method.equals("getBatteryLevel")) {
          
              result.success("batteryLevel"); // It returns string "batteryLevel".
  
          } else {
            result.notImplemented();
          }    
        }));
    }
}

登录按钮将页面从Android更改为Flutter:

loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(
                        FlutterActivity.createDefaultIntent(getApplicationContext())
                );
            }
        });

你可以找到整个项目来重现错误here

2 个答案:

答案 0 :(得分:2)

当您将您的 Flutter 项目用作另一个项目中的库模块,并使用 FlutterActivity.createDefaultIntent(getApplicationContext()) 导航到 Flutter 部分时,您的 MainActivity 将不会被评估。我建议你在你的原生应用程序中创建一个新的 Activity(在你的例子中是 LoginApp)并让它扩展 FlutterActivity,并在你想要导航到 flutter 部分时启动它(见下文)

// in LoginApp 

import androidx.annotation.NonNull;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

class MyFlutterActivity extends FlutterActivity {
    private static final String CHANNEL = "samples.flutter.io/battery";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(((methodCall, result) -> {
            if (methodCall.method.equals("getBatteryLevel")) {

                result.success("batteryLevel"); // It returns string "batteryLevel".

            } else {
                result.notImplemented();
            }
        }));
    }
}

然后像这样开始

    loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(
                    new FlutterActivity.NewEngineIntentBuilder(MyFlutterActivity.class).build(getApplicationContext())
            );
        }
    });

并且不要忘记在您的 android 清单(在 LoginApp 中)中列出此活动

    <activity android:name=".ui.login.MyFlutterActivity"
        android:theme="@style/AppTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize"
        />

答案 1 :(得分:1)

请在您的 dart 代码中指定方法通道,与本机代码中的 CHANNEL 字符串一样准确。对于这种情况,您必须在颤振侧代码中编写以下代码

static const methodChannel = const MethodChannel('samples.flutter.io/battery');

 String result = await methodChannel.invokeMethod('getBatteryLevel');