Java 未找到方法错误的实现方法
我有一个简单的Android应用程序。我导入了一个新的颤振模块。当我转到flatter页面时,我不能再实现本机代码了。我得到一个错误,找不到方法getBatteryLevel的实现方法。我怎样才能解决这个问题 注意:如果我运行颤振模块本身,我可以得到本机代码的结果 main.dart中的触发方法:Java 未找到方法错误的实现方法,java,android,flutter,dart,Java,Android,Flutter,Dart,我有一个简单的Android应用程序。我导入了一个新的颤振模块。当我转到flatter页面时,我不能再实现本机代码了。我得到一个错误,找不到方法getBatteryLevel的实现方法。我怎样才能解决这个问题 注意:如果我运行颤振模块本身,我可以得到本机代码的结果 main.dart中的触发方法: String result = await methodChannel.invokeMethod('getBatteryLevel'); 颤振模块的主要活动: package com.derem
String result = await methodChannel.invokeMethod('getBatteryLevel');
颤振模块的主要活动:
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更改为Flatter:
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
FlutterActivity.createDefaultIntent(getApplicationContext())
);
}
});
您可以找到整个项目来重现错误。请在dart代码中指定方法通道,就像在本机代码中指定通道字符串一样精确。对于这个场景,您必须在颤振端代码中编写以下代码
static const methodChannel = const MethodChannel('samples.flutter.io/battery');
String result = await methodChannel.invokeMethod('getBatteryLevel');
请在dart代码中指定方法通道,与本机代码中的通道字符串一样精确。对于这个场景,您必须在颤振端代码中编写以下代码
static const methodChannel = const MethodChannel('samples.flutter.io/battery');
String result = await methodChannel.invokeMethod('getBatteryLevel');
当您将颤振项目用作另一个项目中的库模块,并使用flatterActivity.createDefaultIntentgetApplicationContext导航到颤振零件时,将不会评估MainActivity。我建议您在您的本机应用程序LoginApp中创建一个新的活动,并让它扩展FlatterActivity,当您想要导航到下面的Flatter部分时启动它
// 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())
);
}
});
别忘了在LoginApp的android清单中列出此活动
<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"
/>
当您将颤振项目用作另一个项目中的库模块,并使用flatterActivity.createDefaultIntentgetApplicationContext导航到颤振零件时,将不会评估MainActivity。我建议您在您的本机应用程序LoginApp中创建一个新的活动,并让它扩展FlatterActivity,当您想要导航到下面的Flatter部分时启动它
// 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())
);
}
});
别忘了在LoginApp的android清单中列出此活动
<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"
/>
您可以在Java代码中设置断点,然后在Android Studio中启动应用程序,或者稍后附加到进程以查看是否实际调用了ConfigureFlatterEngine。您可以在Java代码中设置断点,然后在Android Studio中启动应用程序,或者稍后附加到进程以查看是否实际调用了ConfigureFlatterEngine。感谢您的支持回答但问题不仅仅是定义通道和方法名称。在将颤振模块导入Android应用程序时,我无法访问本机代码。这就是问题所在。android/folder是一个生成的文件夹。在这种情况下,您可以查看您有两个同名类的文件夹吗?由于您有名为MainActivity的颤振活动,如果您的本机活动类具有相同的命名活动,那么它可能会造成复杂性。因此,将类名改为其他名称,而不是MainActivityNo,我没有两个同名的类。您可以查看我的GitHub回购协议。请提供git回购协议,以便我可以查看我在问题中提到的关于回购协议的问题。但是@Muhannad Fakhouri已经解决了我的问题。谢谢你的关注!谢谢你的回复。但问题不仅仅是定义通道和方法名称。在将颤振模块导入Android应用程序时,我无法访问本机代码。这就是问题所在。android/folder是一个生成的文件夹。在这种情况下,您可以查看您有两个同名类的文件夹吗?由于flatter活动的名称为MainActivity,如果本机活动类的命名活动相同,则可能会造成复杂性。因此,将类名改为其他名称,而不是MainActivityNo,我没有两个同名的类。您可以查看我的GitHub回购协议。请提供git回购协议,以便我可以查看我在问题中提到的关于回购协议的问题。但是@Muhannad Fakhouri已经解决了我的问题。谢谢你的关注!非常感谢你!不客气!嘿,我有一个新问题:非常感谢!不客气!嘿,我有一个新问题: